scrwtp से उल्लेख किया है, this
एक आमतौर पर इस्तेमाल किया पहचानकर्ता हो रहा है और यह मेरी प्राथमिकता है। एक और बहुत आम x
है। मैं क्लास-स्तरीय पहचानकर्ता का उपयोग करता हूं जब इसे कक्षा में कई बार उपयोग किया जाता है और निश्चित रूप से जब इसे कन्स्ट्रक्टर में उपयोग किया जाता है। और उन मामलों में मैं सदस्य स्तर पहचानकर्ता के रूप में __
(दो अंडरस्कोर) का उपयोग करता हूं, यह इंगित करने के लिए कि मान को अनदेखा किया गया है। आप _
उपयोग कर सकते हैं नहीं है और वास्तव में इसे अनदेखा के रूप में यह एक संकलन त्रुटि है, लेकिन linting उपकरण अक्सर __
एक ही बात के रूप में मानते हैं और आपको एक अप्रयुक्त पहचानकर्ता के बारे में चेतावनी देने से बचा जाएगा।
आप एक वर्ग स्तर के पहचानकर्ता जोड़ सकते हैं और उसका उपयोग नहीं करते आपको यह चेतावनी मिलती है:
पुनरावर्ती वस्तु संदर्भ 'स्वयं' अप्रयुक्त है। एक रिकर्सिव ऑब्जेक्ट संदर्भ की उपस्थिति इस और व्युत्पन्न प्रकारों के सदस्यों को रनटाइम प्रारंभिक जांच जोड़ती है। इस रिकर्सिव ऑब्जेक्ट संदर्भ को हटाने पर विचार करें।
इस कोड पर विचार करें:
type MyClass() =
member self.X = self
type MyClassAsSelf() as self =
member __.X = self
type MyClassAsSelfUnused() as self = // <-- warning here
member __.X =()
यह है कि क्या इन कक्षाओं के संकलन के बाद की तरह/decompiling देखो:
public class MyClass
{
public Program.MyClass X
{
get
{
return this;
}
}
public MyClass() : this()
{
}
}
public class MyClassAsSelf
{
internal FSharpRef<Program.MyClassAsSelf> self = new FSharpRef<Program.MyClassAsSelf>(null);
internal int [email protected];
public Program.MyClassAsSelf X
{
get
{
if ([email protected] < 1)
{
LanguagePrimitives.IntrinsicFunctions.FailInit();
}
return LanguagePrimitives.IntrinsicFunctions.CheckThis<Program.MyClassAsSelf>(this.self.contents);
}
}
public MyClassAsSelf()
{
FSharpRef<Program.MyClassAsSelf> self = this.self;
this..ctor();
this.self.contents = this;
[email protected] = 1;
}
}
public class MyClassAsSelfUnused
{
internal int [email protected];
public Unit X
{
get
{
if ([email protected] < 1)
{
LanguagePrimitives.IntrinsicFunctions.FailInit();
}
}
}
public MyClassAsSelfUnused()
{
FSharpRef<Program.MyClassAsSelfUnused> self = new FSharpRef<Program.MyClassAsSelfUnused>(null);
FSharpRef<Program.MyClassAsSelfUnused> self2 = self2;
this..ctor();
self.contents = this;
[email protected] = 1;
}
}
ध्यान दें कि एक जांच है कि एक चर परिवर्तक में सेट किया गया है। यदि चेक विफल रहता है तो फ़ंक्शन को कॉल किया जाता है: LanguagePrimitives.IntrinsicFunctions.FailInit()
।
System.InvalidOperationException:: यह अपवाद उत्पन्न है एक वस्तु या मूल्य का प्रारंभ एक वस्तु के परिणामस्वरूप या मूल्य रिकर्सिवली इससे पहले कि यह पूरी तरह से आरंभ किया गया था एक्सेस किए जा रहे।
मुझे लगता है कि चेतावनी बस इतना है कि आप एक अनावश्यक रनटाइम चेक के मामूली ओवरहेड से बच सकते हैं। हालांकि, मुझे नहीं पता कि स्थिति को कैसे बनाया जाए जहां त्रुटि फेंक दी गई है, इसलिए मुझे चेक का सही उद्देश्य पता नहीं है। शायद कोई और इस पर प्रकाश डाल सकता है?
जब विरासत चित्र में आती है तो यह प्रासंगिक हो जाता है - मुझे याद है कि यह एक विशेष रूप से बालों वाले परिदृश्य में एक मूल सारणी वर्ग के साथ स्वयं पहचानकर्ता है। लेकिन मेरे पास यहां देने के लिए एक हाथ, आत्मनिर्भर उदाहरण नहीं है। – scrwtp