2011-11-15 11 views
14

उदाहरण 1 (संकलन नहीं करता है):आलसी <T> कैसे नई() बाधा की आवश्यकता है?

void Main() 
{ 
    var c = new C<D>(); 
    c.M.F(); 
} 

class C<T> 
{ 
    T _m = null; 
    public T M { get { 
     if(_m == null) _m = new T(); 
     return _m; 
    } } 
} 

class D 
{ 
    public void F() { Console.WriteLine ("i was created"); } 
} 

परिणाम:

वैरिएबल प्रकार 'टी' का एक उदाहरण नहीं बना सकता क्योंकि यह नई() बाधा

नहीं है

उदाहरण 2 (काम):

void Main() 
{ 
    var c = new C<D>(); 
    c.M.F(); 
} 

class C<T> 
{ 
    Lazy<T> _m = new Lazy<T>(); 
    public T M { get { return _m.Value; } } 
} 

class D 
{ 
    public void F() { Console.WriteLine ("i was created"); } 
} 

रेसुल टी:

i was created 

उत्तर

17

आप स्रोत कोड में तल्लीन हैं, तो आप देखेंगे कि Lazy<T> अंततः Activator उपयोग करता है:

return new Lazy<T>.Boxed((T)Activator.CreateInstance(typeof(T))); 

यह सिर्फ प्रतिबिंब का उपयोग कर के लिए एक शॉर्टकट है। चूंकि यह वास्तविक जेनेरिक प्रकार तर्क (new T()) के माध्यम से प्रकार को तुरंत चालू नहीं कर रहा है, बल्कि प्रतिबिंब के माध्यम से कन्स्ट्रक्टर का आविष्कार करने के बजाय, where T : new() बाधा की आवश्यकता नहीं है।

संबंधित मुद्दे