使用C#从1加到100的程序用循环结构构重写以下伪代码段?

是否有任何工具可以使Excel的公式更加容易辨认?

我需要将一些复杂的excel表格转换成C#应用程序,并坐在那里看着一行excel公式相对比较麻烦。 主要是我正在寻找一些可以将它们重写为伪代码或更具可读性的编程语言。

肖恩·柴(Sean Cheshire)的评论可能是你要得到的最好答案:

它似乎缺less的一件事是一次做一批公式的function(这将节省大量的时间,如果转换整个工作表打开“显示公式”)。 我为此添加了一个请求 。

鉴于现在应用程序的工作方式,如果您尝试将批次粘贴到单行input字段中,您可能仍然会得到至less有用的结果。 我build议试一试。

本文是一篇不可多得的好文,MemoryPack 的作者 neuecc 大佬通过本文解释了他是如何将序列化程序性能提升到极致的;其中从很多方面(可变长度、字符串、集合等)解释了一些性能优化的技巧,值得每一个开发人员学习,特别是框架的开发人员的学习,一定能让大家获益匪浅。

由于公众号排版原因,译者建议大家在桌面端阅读本文,手机阅读体验并不是很好。

我发布了一个名为 MemoryPack[1] 的新序列化程序,这是一种特定于 C# 的新序列化程序,其执行速度比其他序列化程序快得多。

MessagePack for C#[2] (一个快速的二进制序列化程序)相比标准对象的序列化库性能快几倍,当数据最优时,性能甚至快 50~100 倍。最好的支持是.NET 7,但现在支持.NET Standard 5,6),Unity 甚至 Type。它还支持多态性(Union),完整版本容错,循环引用和最新的现代 I/O

序列化程序的性能基于“数据格式规范”和“每种语言的实现”。例如,虽然二进制格式通常比文本格式(如 JSON)具有优势,但 JSON 序列化程序可能比二进制序列化程序更快(如 Utf8Json[3] 所示)。那么最快的序列化程序是什么?当你同时了解规范和实现时,真正最快的序列化程序就诞生了。

在过去的 5 年里,我还处理了近 1000 个问题。自 5 年前以来,我一直在使用 Roslyn 的代码生成器进行 AOT 支持,并对其进行了演示,尤其是在 Unity、AOT 环境 (IL2CPP) 以及许多使用它的 Unity 手机游戏中。

MemoryPack 的目标是成为终极的快速,实用和多功能的序列化程序。我想我做到了。

MemoryPack 完全采用 .NET 6 中增强的 增量源生成器[10] 。在用法方面,它与 C# 版 MessagePack 没有太大区别,只是将目标类型更改为部分类型。

MemoryPack 在 .NET Standard 7 的实现中具有略有不同的方法签名。.NET 7 是一种更积极、面向性能的实现,它利用了最新的语言功能。

首先,序列化程序接口利用静态抽象成员,如下所示:

这避免了通过虚拟方法调用的成本。

更高的性能。开头图表中的序列化程序(

我们计划进一步扩展可用功能的范围,例如对 MasterMemory 的 MemoryPack[24] 支持和 对 MagicOnion[25] 的序列化程序更改支持等。我们将自己定位为 Cysharp C# 库[26] 生态系统的核心。我们将付出很多努力来种下这一棵树,所以对于初学者来说,请尝试一下我们的库!

什么时候应该使用C中的struct而不是class?我的概念模型是,当项只是值类型的集合时,会使用结构。一种逻辑上把它们结合成一个整体的方法。

我在这里遇到了这些规则:

  • 结构应具有内存占用空间小于16字节。
  • 之后不应更改结构创造。

这些规则有效吗?结构在语义上是什么意思?


OP引用的源代码有一定的可信度……但是微软呢——在结构使用上的立场是什么?我向微软寻求额外的学习,我发现:好的。

让我们看看为什么微软会使用这些结构:好的。

  • Entry从未作为Dictionary类之外的参数传递。进一步的调查表明,为了满足IEnumerable的实现,字典使用每次请求枚举器时都会复制的Enumerator结构……这是有意义的。
  • 更新—另外,要认识到当结构实现接口时(就像枚举器那样),并被转换为该实现的类型时,该结构将成为引用类型并移动到堆中。在Dictionary类内部,枚举器仍然是值类型。但是,只要方法调用GetEnumerator(),就会返回引用类型IEnumerator。好的。

    我们在这里没有看到任何尝试或需求证明来保持结构不变或仅维持16字节或更小的实例大小:好的。

  • 上面结构中的任何内容都不能声明为readonly—不可变
  • 这些结构的大小可以超过16个字节
  • 还有…4。两个结构都存储tkey和tvalue,我们都知道它们非常能够作为引用类型(添加了额外的信息)好的。

    尽管有哈希键,字典还是很快的,部分原因是实例结构比引用类型更快。这里,我有一个Dictionary,它存储了300000个随机整数和顺序递增的键。好的。

    支持EDCOX1 0和EDCOX1×1(在爪哇中,只能定义引用类型)。reference types的实例在托管堆中被分配,并且在没有未完成的引用时被垃圾收集。另一方面,value types的实例被分配到stack中,因此分配的内存在其作用域结束后立即被回收。当然,value types是按值传递的,reference types是参照传递的。除语言中的结构类型通常用于保存行为类似于固定大小的值组的内容。结构类型的一个有用方面是,可以通过修改保存结构类型实例的存储位置来修改该实例的字段,而不是以其他方式。以这样的方式对结构进行编码是可能的:改变任何字段的唯一方法是构造一个完整的新实例,然后使用结构赋值,通过用新实例中的值覆盖目标的所有字段来改变这些字段,但除非结构不提供创建其字段具有非默认值的实例的方法如果结构本身存储在可变位置,那么它的所有字段都是可变的。

    请注意,如果结构包含私有类类型字段,并将其自己的成员重定向到包装类对象的成员,则可以设计结构类型,使其本质上表现为类类型。例如,PersonCollection可以提供SortedByName和SortedById属性,这两个属性都具有对PersonCollection的"不变"引用(在其构造函数中设置),并通过调用/a/147


    结构可用于提高垃圾收集性能。虽然您通常不必担心GC性能,但在某些情况下,它可能是一个杀手。类似于低延迟应用程序中的大缓存。请参阅本文中的示例:


    结构或值类型可用于以下场景-

    • 如果要阻止垃圾收集对象。
    • 如果它是简单类型,并且没有成员函数修改其实例字段
    • 如果不需要从其他类型派生或派生到其他类型。
    • 您可以在此链接上了解有关值类型和值类型的更多信息


      1-不需要更改对象属性/字段。我的意思是你只想给他们一个初始值,然后读出来。

      2-对象中的属性和字段是值类型,它们不太大。

      如果是这种情况,您可以利用结构来获得更好的性能和优化的内存分配,因为它们只使用堆栈,而不同时使用堆栈和堆(在类中)。


      我很少对事物使用结构。但那只是我。这取决于我是否需要对象可以为空。

      如其他答案所述,我将类用于现实世界中的对象。我也有这样的想法:结构用于存储少量数据。


      神话1:结构是轻量级类好的。

      这个神话有多种形式。有些人认为价值类型不能或不应该有方法或其他重要的行为,它们应该简单使用数据传输类型,只有公共字段或简单属性。日期时间类型是很好的反例:就存在而言,它是一种价值类型是有意义的。一个基本单位,如一个数字或一个字符,它也有意义能够根据其值进行计算。从另一个角度看问题不管怎样,数据传输类型应该经常是引用类型应该基于所需的值或引用类型语义,而不是简单的类型。其他人认为价值类型比参考类型"轻"性能。事实上,在某些情况下,值类型的性能更高-它们不需要垃圾收集,除非它们是装箱的,没有类型例如,标识开销,不需要取消引用。但在其他方法是,引用类型更具性能的参数传递,将值赋给变量、返回值和类似的操作只需要4或8个字节(取决于运行的是32位还是64位CLR),而不是复制所有数据。想象一下,如果arraylist是某种"纯"值类型,并且将arraylist表达式传递给方法涉及复制其所有数据!几乎不管怎样,这种决定并不能真正决定性能。瓶颈几乎永远不会出现在您认为它们会出现的地方,在您根据性能做出设计决策之前,您应该衡量不同的选项。值得注意的是,这两种信仰的结合也不起作用。它不管一个类型有多少个方法(无论是类还是结构)——每个实例所占用的内存不受影响。(记忆方面有成本对代码本身负责,但这只发生一次,而不是针对每个实例。)好的。

      神话2:引用类型位于堆上;值类型位于堆栈上好的。

      这一点通常是由重复它的人的懒惰造成的。第一部分正确。始终在堆上创建引用类型的实例。这是第二部分是引起问题的原因。正如我已经注意到的,变量的值在声明它的任何地方都存在,所以如果您有一个实例变量为int类型的类,那么该变量对于任何给定对象的值将始终位于该对象的其余数据所在的位置。在堆中。仅局部变量(方法中声明的变量)和方法参数位于堆栈上。在C 2和更高版本中,即使某些局部变量也不能活在堆栈上,正如我们在第5章中看到的匿名方法。这些概念现在是否相关?如果您正在编写托管代码,那么您应该让运行时担心内存的最佳使用方式。事实上,语言规范并不能保证什么是生命其中,未来的运行时可以在堆栈上创建一些对象,如果知道它可以摆脱它,或者C编译器可以生成几乎不使用堆栈。下一个神话通常只是一个术语问题。好的。

      神话3:默认情况下,对象在C中通过引用传递好的。

      这可能是传播最广的神话。再说一次,制造这个的人索赔通常(尽管并非总是)知道C的实际行为,但他们不知道"引用传递"的真正含义是什么?不幸的是,对于那些知道它是什么意思。传递引用的形式定义比较复杂,涉及L值和类似的计算机科学术语,但重要的是如果你通过变量通过引用,您调用的方法可以通过更改调用方变量的参数值来更改其值。现在,记住引用的值类型变量是引用,而不是对象本身。您可以更改一个参数引用的对象,但不通过引用传递参数本身。例如,以下方法更改了StringBuilder的内容对象,但调用方的表达式仍将引用与之前:好的。

      调用此方法时,参数值(对StringBuilder的引用)为通过值。如果要更改builder变量的值,例如,当语句生成器为空时,该更改不会被来电者看到,与神话相反。有趣的是,这不仅是神话中的"参照"点不准确,而且"物体被传递"点也不准确。对象本身也不会被传递通过引用或值。当涉及引用类型时,变量为通过引用传递或通过值传递参数(引用)的值。除了任何其他问题,这就回答了当null为如果传递对象,则用作按值参数,这将导致问题,因为没有一个对象可以通过!相反,空引用通过值的方式与任何其他引用的方式相同。如果这个快速的解释让您感到困惑,您可能会想看看我的文章,"参数传入C",(http://mng.bz/otvt),它将涉及更多细节。这些神话不是唯一的。拳击和拆箱有相当一部分误解,下一步我会努力消除。好的。

      参考文献:乔恩·斯基特的《深度》第三版好的。好啊。


      结构在大多数方面都像类/对象。结构可以包含函数、成员,并且可以继承。但是结构在C中只用于数据保存。结构确实比类占用更少的RAM,而且垃圾收集器更容易收集。但是当您在您的结构中使用函数时,编译器实际上将这个结构作为类/对象非常相似,所以如果您需要一些函数,那么使用类/对象。


我要回帖

更多关于 数组可以直接在程序中使用 的文章

 

随机推荐