我正在收集一个模型
public class MobileModelInfo
{
public string Name { get; set; }
public string Catagory { get; set; }
public string Year { get; set; }
}在这里,我通过MobileModelInfo内联单执行语句将ObservableCollection分配给
方法#1
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
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)的执行。因此,我需要澄清在复杂的数据结构中,哪一种是最好的方法。
发布于 2016-01-28 08:11:45
新的语法对象初始化器基本上只是一种被转换成长表单的速记格式。如果你愿意的话,你可以用某种反汇编程序来确认这一点。您会发现,除了一些编译器优化之外,代码尽可能接近于相同。
例如,这个代码:
TestClass t1 = new TestClass { iVal = 1, sVal = "two" };生成以下IL (根据LINQPad):
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另一个办法是:
TestClass t2 = new TestClass();
t2.iVal = 1;
t2.sVal = "two";以及它的IL:
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查询语法一样。两者都只是在后台发生的事情的语法糖,但它们在阅读代码的方式和编写代码的方式上可能有很大的差异。
顺便说一句,数组初始化器是完全相同的。这两者产生的代码实际上是相同的:
int[] a1 = new int[] { 1, 2, 3 };
int[] a2 = new int[3];
a2[0] = 1;
a2[1] = 2;
a2[2] = 3;发布于 2016-01-28 07:24:13
第二种不是“逗号方式”(这是我以前从未听说过的术语)。它是:
所以你才学的。古老的语法。没有显著的--尤其是没有可衡量的--绩效差异。
https://stackoverflow.com/questions/35055121
复制相似问题