हाँ, यह सच है। संपादित करें 2: यहां और कैसे एक अच्छा स्पष्टीकरण दिया गया है।
http://www.simple-talk.com/community/blogs/simonc/archive/2010/11/17/95700.aspx
सत्यापन मैं संकलित निम्न विधि के लिए
:
public static T Create<T>() where T: new() {
return new T();
}
और जब .NET 3.5 SP1 में सी # संकलक के साथ संकलित इस उत्पन्न आईएल है:
.method public hidebysig static !!T Create<.ctor T>() cil managed
{
.maxstack 2
.locals init (
[0] !!T local,
[1] !!T local2)
L_0000: ldloca.s local
L_0002: initobj !!T
L_0008: ldloc.0
L_0009: box !!T
L_000e: brfalse.s L_001a
L_0010: ldloca.s local2
L_0012: initobj !!T
L_0018: ldloc.1
L_0019: ret
L_001a: call !!0 [mscorlib]System.Activator::CreateInstance<!!T>()
L_001f: ret
}
संपादित करें: सी # 4 कंपाइलर थोड़ा अलग बनाता है, लेकिन इसी तरह, कोड:
.method public hidebysig static !!T Create<.ctor T>() cil managed
{
.maxstack 2
.locals init (
[0] !!T CS$1$0000,
[1] !!T CS$0$0001)
L_0000: nop
L_0001: ldloca.s CS$0$0001
L_0003: initobj !!T
L_0009: ldloc.1
L_000a: box !!T
L_000f: brfalse.s L_001c
L_0011: ldloca.s CS$0$0001
L_0013: initobj !!T
L_0019: ldloc.1
L_001a: br.s L_0021
L_001c: call !!0 [mscorlib]System.Activator::CreateInstance<!!T>()
L_0021: stloc.0
L_0022: br.s L_0024
L_0024: ldloc.0
L_0025: ret
}
एक मान प्रकार यह उत्प्रेरक का उपयोग नहीं करता लेकिन सिर्फ default(T)
मान देता है के मामले में, अन्यथा यह Activator.CreateInstance
विधि invokes।
क्या इससे कोई फर्क पड़ता है? – Oded
@ ओडेड यदि आप उस वातावरण को बेहतर ढंग से समझने की कोशिश कर रहे हैं जिसमें आप प्रोग्रामिंग कर रहे हैं, तो हाँ - इससे कोई फर्क नहीं पड़ता! :-) – Justin
@ क्रैगेन: ildasm, monodis – sehe