最初のメソッド(オブジェクト初期化子を使用)がC#3.0以降でのみ機能することを除いて、これらはほぼまったく同じです。パフォーマンスの違いはごくわずかであり、心配する価値はありません。
それらはほぼ同一のILコードを生成します。最初のものはこれを与えます:
.method private hidebysig instance void ObjectInitializer() cil managed
{
.maxstack 2
.locals init (
[0] class Person person,
[1] class Person <>g__initLocal0)
L_0000: newobj instance void Person::.ctor()
L_0005: stloc.1
L_0006: ldloc.1
L_0007: ldstr "Philippe"
L_000c: callvirt instance void Person::set_Name(string)
L_0011: ldloc.1
L_0012: ldstr "phil@phil.com"
L_0017: callvirt instance void Person::set_Mail(string)
L_001c: ldloc.1
L_001d: stloc.0
L_001e: ldloc.0
L_001f: callvirt instance string [mscorlib]System.Object::ToString()
L_0024: pop
L_0025: ret
}
2番目はこれを与えます:
.method private hidebysig instance void SetProperties() cil managed
{
.maxstack 2
.locals init (
[0] class Person person)
L_0000: newobj instance void Person::.ctor()
L_0005: stloc.0
L_0006: ldloc.0
L_0007: ldstr "Philippe"
L_000c: callvirt instance void Person::set_Name(string)
L_0011: ldloc.0
L_0012: ldstr "phil@phil.com"
L_0017: callvirt instance void Person::set_Mail(string)
L_001c: ldloc.0
L_001d: callvirt instance string [mscorlib]System.Object::ToString()
L_0022: pop
L_0023: ret
}
ご覧のとおり、ほぼ同じコードが生成されます。私がコンパイルした正確なC#コードについては、以下を参照してください。
パフォーマンス測定では、オブジェクト初期化構文を使用した場合のパフォーマンスがわずかに向上するだけで、非常に類似した結果が示されます。
1秒あたりのメソッド反復
ObjectInitializer880万
SetProperties860万
パフォーマンスのテストに使用したコード:
using System;
class Person
{
public string Name { get; set; }
public string Mail { get; set; }
}
class Program
{
private void ObjectInitializer()
{
Person person = new Person()
{
Name = "Philippe",
Mail = "phil@phil.com",
};
person.ToString();
}
private void SetProperties()
{
Person person = new Person();
person.Name = "Philippe";
person.Mail = "phil@phil.com";
person.ToString();
}
private const int repetitions = 100000000;
private void Time(Action action)
{
DateTime start = DateTime.UtcNow;
for (int i = 0; i < repetitions; ++i)
{
action();
}
DateTime end = DateTime.UtcNow;
Console.WriteLine(repetitions / (end - start).TotalSeconds);
}
private void Run()
{
Time(ObjectInitializer);
Time(SetProperties);
Console.WriteLine("Finished");
Console.ReadLine();
}
private static void Main()
{
new Program().Run();
}
}