首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#内联语句的性能

C#内联语句的性能
EN

Stack Overflow用户
提问于 2016-01-28 07:20:11
回答 2查看 113关注 0票数 0

我正在收集一个模型

代码语言:javascript
运行
复制
public class MobileModelInfo
{
    public string Name { get; set; }
    public string Catagory { get; set; }
    public string Year { get; set; }
}

在这里,我通过MobileModelInfo内联单执行语句将ObservableCollection分配给

方法#1

代码语言:javascript
运行
复制
ObservableCollection<MobileModelInfo> mobList = new ObservableCollection<MobileModelInfo>((new List<MobileModelInfo>(){
    new MobileModelInfo { Name = "S4", Catagory = "Smart Phone", Year = "2011" },
    new MobileModelInfo { Name = "S5", Catagory = "Smart Phone", Year = "2013" },
    new MobileModelInfo { Name = "S6", Catagory = "Ultra Smart Phone", Year = "2015" },
    new MobileModelInfo { Name = "", Catagory = "Ultra Smart Phone", Year = "2016" }
}).Where(i => !string.IsNullOrEmpty(i.Name)).ToList());

现在考虑一下Comman的实现方式。

方法#2

代码语言:javascript
运行
复制
ObservableCollection<MobileModelInfo> mobList = new ObservableCollection<MobileModelInfo>();
MobileModelInfo mobObject = new MobileModelInfo();

mobObject.Name = "S4";
mobObject.Catagory = "Smart Phone";
mobObject.Year = "2011";
if(!string.IsNullOrEmpty(mobObject.Name))
    mobList.Add(mobObject);

mobObject = new MobileModelInfo();
mobObject.Name = "S5";
mobObject.Catagory = "Smart Phone";
mobObject.Year = "2013";
if(!string.IsNullOrEmpty(mobObject.Name))
    mobList.Add(mobObject);

mobObject = new MobileModelInfo();
mobObject.Name = "S6";
mobObject.Catagory = "Ultra Smart Phone";
mobObject.Year = "2015";
if(!string.IsNullOrEmpty(mobObject.Name))
    mobList.Add(mobObject);

mobObject = new MobileModelInfo();
mobObject.Name = "";
mobObject.Catagory = "Ultra Smart Phone";
mobObject.Year = "2016";
if(!string.IsNullOrEmpty(mobObject.Name))
    mobList.Add(mobObject);

在这两种方法中,哪一种具有良好的性能?在我的主要项目中,我有一个非常复杂的模型类集合。所以,请帮助我选择最好的方法.

在第一种方法中,只有一种执行应该执行,因为它将由编译器展开,但是在第二种方法中,应该执行超过25 (>25)的执行。因此,我需要澄清在复杂的数据结构中,哪一种是最好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-28 08:11:45

新的语法对象初始化器基本上只是一种被转换成长表单的速记格式。如果你愿意的话,你可以用某种反汇编程序来确认这一点。您会发现,除了一些编译器优化之外,代码尽可能接近于相同。

例如,这个代码:

代码语言:javascript
运行
复制
TestClass t1 = new TestClass { iVal = 1, sVal = "two" };

生成以下IL (根据LINQPad):

代码语言:javascript
运行
复制
IL_0001:  newobj      UserQuery+TestClass..ctor
IL_0006:  stloc.2     
IL_0007:  ldloc.2     
IL_0008:  ldc.i4.1    
IL_0009:  stfld       UserQuery+TestClass.iVal
IL_000E:  ldloc.2     
IL_000F:  ldstr       "two"
IL_0014:  stfld       UserQuery+TestClass.sVal
IL_0019:  ldloc.2     
IL_001A:  stloc.0     // t1

另一个办法是:

代码语言:javascript
运行
复制
TestClass t2 = new TestClass();
t2.iVal = 1;
t2.sVal = "two";

以及它的IL:

代码语言:javascript
运行
复制
IL_001B:  newobj      UserQuery+TestClass..ctor
IL_0020:  stloc.1     // t2
IL_0021:  ldloc.1     // t2
IL_0022:  ldc.i4.1    
IL_0023:  stfld       UserQuery+TestClass.iVal
IL_0028:  ldloc.1     // t2
IL_0029:  ldstr       "two"
IL_002E:  stfld       UserQuery+TestClass.sVal

这里唯一的区别是,第一个创建临时变量(loc.2),然后将其存储在命名局部变量(loc.0)中。当打开优化时,这种差异就消失了。

因此,您可以使用性能几乎为0的任何一种方法。就个人而言,我更喜欢新的对象初始化器表单,就像我更喜欢LINQ查询语法一样。两者都只是在后台发生的事情的语法糖,但它们在阅读代码的方式和编写代码的方式上可能有很大的差异。

顺便说一句,数组初始化器是完全相同的。这两者产生的代码实际上是相同的:

代码语言:javascript
运行
复制
int[] a1 = new int[] { 1, 2, 3 };

int[] a2 = new int[3];
a2[0] = 1;
a2[1] = 2;
a2[2] = 3;
票数 2
EN

Stack Overflow用户

发布于 2016-01-28 07:24:13

第二种不是“逗号方式”(这是我以前从未听说过的术语)。它是:

  • 卷积(在设置名称属性后检查它是否为空。
  • 在某个古老的.NET更新之前,唯一的方法是启用新的语法。

所以你才学的。古老的语法。没有显著的--尤其是没有可衡量的--绩效差异。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35055121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档