क्या कोई जुर्माना है, जैसे कि आपको केवल उन्हें आवश्यकता होने पर उन्हें केवल शून्य के रूप में सेट करना चाहिए?सभी मूल्य प्रकार शून्य नहीं होने का कारण क्या है?
धन्यवाद
क्या कोई जुर्माना है, जैसे कि आपको केवल उन्हें आवश्यकता होने पर उन्हें केवल शून्य के रूप में सेट करना चाहिए?सभी मूल्य प्रकार शून्य नहीं होने का कारण क्या है?
धन्यवाद
कई कारण:
Nullable<T>
तक .NET 2.0 मौजूद नहीं था, और यह मौजूदा कोड को तोड़ने नहीं कर सकते हैं - विशेष रूप से के लिए Nullable<T>
int
, मैं नहीं चाहते हो सकता है यह व्यर्थ होने के लिए ... मैं इसे एक int
होना चाहता हूँ, और मैं चेक-के लिए करने के लिए/संभाल nullsbyte[]
ine, और अब विचार करें कि byte
शून्य था - अतिरिक्त ओवरहेड के बहुत सारे; * प्लस यह आप Blits कर बंद कर देंगे आदि *प्रदर्शन: Nullable<T>
अतिरिक्त दंड के बहुत सारे कहते हैं, विशेष रूप से बहुत से छिपे हुए कॉल .HasValue
और .Value
/.GetValueOrDefault()
; इस विशेष रूप से "उठा लिया ऑपरेटरों" में दिखाया गया है - यानी x + y
नीचे की तरह कुछ है, जो तंग छोरों आदि के लिए कहते हैं हो जाता है:
(x.HasValue && y.HasValue) ? (x.GetValueOrDefault() + y.GetValueOrDefault()) : null
इसी तरह, x == y
जाँच करने के लिए है:
बहुत सारी भूमि के ऊपर की की GetValueOrDefault()
पर ....
कौन सा मूल्य प्रकार वास्तव में शून्य है? मैं किसी के बारे में नहीं जानता।
संपादित करें: यदि आप स्ट्रिंग प्रकार का संदर्भ लेते हैं, तो यह मान प्रकार नहीं है, लेकिन एक संदर्भ प्रकार है।
आपको उन्हें Nullable
में लपेटने की आवश्यकता है लेकिन यह कुछ अलग है। मेरा मानना है कि विषय स्टार्टर का मतलब बॉक्स के बाहर मूल्य प्रकारों को कम करने योग्य था, शायद स्ट्रिंग प्रकार का जिक्र है। – User
मुझे लगता है कि ओपी का मतलब कुछ है "अगर मूल्य प्रकारों को निरर्थक बनाया जा सकता है, तो वे सभी शुरुआत से क्यों नहीं निकलते हैं?"। – Guffa
हां, एक जुर्माना है। Nullable<T>
संरचना में मूल्य और एक बुलियन ध्वज भी शामिल है जो मूल्य की शून्यता निर्धारित करता है।
हालांकि बुलियन केवल एक बाइट है, संरचनाएं भी शब्द सीमाओं के साथ गठबंधन हैं। एक int
स्मृति के चार बाइट्स का उपयोग करता है, लेकिन int?
को आठ बाइट की आवश्यकता होती है।
जुर्माना एक अतिरिक्त शब्द से भी बदतर है। नालीबल संरचना का डिज़ाइन का मतलब है कि 'न्यूबल योग्य
मार्क Gravell जवाब के अलावा, Nullable < टी > से परिलक्षित कोड की जाँच करें:
public struct Nullable<T> where T: struct
{
private bool hasValue;
internal T value;
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
public bool HasValue
{
get
{
return this.hasValue;
}
}
public T Value
{
get
{
if (!this.HasValue)
{
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
}
return this.value;
}
}
public T GetValueOrDefault()
{
return this.value;
}
public T GetValueOrDefault(T defaultValue)
{
if (!this.HasValue)
{
return defaultValue;
}
return this.value;
}
public override bool Equals(object other)
{
if (!this.HasValue)
{
return (other == null);
}
if (other == null)
{
return false;
}
return this.value.Equals(other);
}
public override int GetHashCode()
{
if (!this.HasValue)
{
return 0;
}
return this.value.GetHashCode();
}
public override string ToString()
{
if (!this.HasValue)
{
return "";
}
return this.value.ToString();
}
public static implicit operator T?(T value)
{
return new T?(value);
}
public static explicit operator T(T? value)
{
return value.Value;
}
}
आप ' बूलियन HasValue
के अस्तित्व और गुणों का उपयोग कैसे करेंगे।
कार्यान्वयन पर विचार करें।का विरोध करने के संदर्भ जो स्मृति के संकेत दिए गए हैं वस्तुओं के रूप में सी # में एक पूर्णांक, के रूप में
public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>
एक struct ढेर पर सीधे संग्रहीत किया जाता है परिभाषित किया गया है (संदर्भ में ही ढेर में है, लेकिन आवंटन ढेर में है) ।
एक पूर्ण संदर्भ का मतलब है कि ढेर में सूचक को ढेर में किसी स्थान पर प्रारंभ नहीं किया गया है।
अतिरिक्त के बारे में मत भूलना ?? ऑपरेटर वे भी साथ फेंक दिया। int i = j ?? k; // अगर जे शून्य है, तो के उपयोग करें। –
अच्छी तरह से, यह 'Nullable' के लिए विशिष्ट नहीं है - लेकिन एक और अच्छा बिंदु –
@ क्रिस क्या यह काम करता है? जे शून्य नहीं हो सकता है, अन्यथा आप इसे किसी मान प्रकार पर असाइन नहीं कर सकते हैं, है ना? ;-) –