जवाबों:
nullNullable<T>यह शून्य-आरंभिक मान लौटाता हैNullable<T>लिए खाली (छद्म नल) मान लौटाता है (वास्तव में, यह पहली गोली का पुन: विवरण है, लेकिन यह स्पष्ट करने योग्य है)default(T)जेनेरिक, और Try...पैटर्न जैसी चीजों में सबसे बड़ा उपयोग है :
bool TryGetValue(out T value) {
if(NoDataIsAvailable) {
value = default(T); // because I have to set it to *something*
return false;
}
value = GetData();
return true;
}
जैसा कि होता है, मैं इसे कुछ कोड-जनरेशन में भी उपयोग करता हूं, जहां यह खेतों / चर को इनिशियलाइज़ करने के लिए एक दर्द है - लेकिन यदि आप टाइप जानते हैं:
bool someField = default(bool);
int someOtherField = default(int)
global::My.Namespace.SomeType another = default(global::My.Namespace.SomeType);
default।
int foo = default(int);ही नहीं था int foo;? यानी, बिना मूल्य के होने के लिए डिफ़ॉल्ट रूप से अनइंस्टाल्यूटेड इन्टस नहीं है default(int)?
default(...); स्थानीय लोगों की आवश्यकता नहीं है (हालांकि तकनीकी तौर पर, मूलभूत मूल्यों .locals initहै कि वे फिर से शून्य करने के लिए लागू हो जाएगी आईएल साधन में, लेकिन आप इसे पालन करने के लिए असुरक्षित तंत्र उपयोग करने की आवश्यकता)
defaultकीवर्ड nullसंदर्भ प्रकारों के लिए और zeroसंख्यात्मक मान प्रकारों के लिए वापस आ जाएगा ।
के लिए structहै, यह struct के प्रत्येक सदस्य है कि क्या वे मूल्य या संदर्भ प्रकार के होते हैं पर निर्भर करता है शून्य या शून्य करने के लिए प्रारंभ वापस आ जाएगी।
Simple Sample code :<br>
class Foo
{
public string Bar { get; set; }
}
struct Bar
{
public int FooBar { get; set; }
public Foo BarFoo { get; set; }
}
public class AddPrinterConnection
{
public static void Main()
{
int n = default(int);
Foo f = default(Foo);
Bar b = default(Bar);
Console.WriteLine(n);
if (f == null) Console.WriteLine("f is null");
Console.WriteLine("b.FooBar = {0}",b.FooBar);
if (b.BarFoo == null) Console.WriteLine("b.BarFoo is null");
}
}
उत्पादन:
0
f is null
b.FooBar = 0
b.BarFoo is null
का डिफ़ॉल्ट मान MyObject। सामान्य कोड में डिफ़ॉल्ट कीवर्ड देखें (C # प्रोग्रामिंग गाइड) (MSDN):
सामान्य कक्षाओं और विधियों में, एक मुद्दा यह उठता है कि एक पैरामीटर प्रकार T के लिए डिफ़ॉल्ट मान कैसे दिया जाए, जब आप पहले से निम्न नहीं जानते हैं:
- क्या T एक संदर्भ प्रकार या मान प्रकार होगा।
- यदि T एक मान प्रकार है, तो यह एक संख्यात्मक मान या एक संरचना होगा।
एक पैरामीटर प्रकार टी के एक चर टी को देखते हुए, कथन t = null केवल तभी मान्य है जब T एक संदर्भ प्रकार है और t = 0 केवल संख्यात्मक मान प्रकार के लिए काम करेगा, लेकिन संरचना के लिए नहीं। समाधान डिफ़ॉल्ट कीवर्ड का उपयोग करना है, जो संदर्भ प्रकारों के लिए शून्य और संख्यात्मक मान प्रकारों के लिए शून्य लौटाएगा। संरचना के लिए, यह शून्य या अशक्त के लिए आरंभिक संरचना के प्रत्येक सदस्य को इस आधार पर लौटाएगा कि वे मूल्य या संदर्भ प्रकार हैं। GenericList वर्ग के निम्नलिखित उदाहरण से पता चलता है कि डिफ़ॉल्ट कीवर्ड का उपयोग कैसे किया जाता है। अधिक जानकारी के लिए, जेनरिक अवलोकन देखें।
public class GenericList<T>
{
private class Node
{
//...
public Node Next;
public T Data;
}
private Node head;
//...
public T GetNext()
{
T temp = default(T);
Node current = head;
if (current != null)
{
temp = current.Data;
current = current.Next;
}
return temp;
}
}
defaultकीवर्ड रिटर्न "डिफ़ॉल्ट" या अनुरोध किया प्रकार का एक चर के लिए "खाली" मूल्य।
सभी संदर्भ प्रकार (के साथ परिभाषित के लिए class, delegate, आदि), यह है null। मूल्य प्रकार (के साथ परिभाषित के लिए struct, enum, आदि) यह एक सब शून्य मान (उदाहरण के लिए, int 0, DateTime 0001-01-01 00:00:00, आदि)।
इसका उपयोग ज्यादातर जेनेरिक कोड के साथ किया जाता है जिसे संदर्भ और मूल्य दोनों प्रकारों पर लागू किया जा सकता है, क्योंकि आप nullएक मूल्य प्रकार चर को निर्दिष्ट नहीं कर सकते हैं ।
शायद यह आपकी मदद कर सकता है:
using System;
using System.Collections.Generic;
namespace Wrox.ProCSharp.Generics
{
public class DocumentManager < T >
{
private readonly Queue < T > documentQueue = new Queue < T > ();
public void AddDocument(T doc)
{
lock (this)
{
documentQueue.Enqueue(doc);
}
}
public bool IsDocumentAvailable
{
get { return documentQueue.Count > 0; }
}
}
}
सामान्य प्रकारों को अशक्त करना संभव नहीं है। कारण यह है कि एक सामान्य प्रकार को मूल्य प्रकार के रूप में भी त्वरित किया जा सकता है, और नल को केवल संदर्भ प्रकारों के साथ अनुमति दी जाती है। इस समस्या को दरकिनार करने के लिए, आप डिफ़ॉल्ट कीवर्ड का उपयोग कर सकते हैं। डिफ़ॉल्ट कीवर्ड के साथ, नल को संदर्भ प्रकारों के लिए और 0 को मान प्रकारों को सौंपा गया है।
public T GetDocument()
{
T doc = default(T);
lock (this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
डिफ़ॉल्ट कीवर्ड के संदर्भ के आधार पर कई अर्थ हैं जहां इसका उपयोग किया जाता है। स्विच स्टेटमेंट डिफ़ॉल्ट केस को परिभाषित करने के लिए एक डिफॉल्ट का उपयोग करता है, और जेनेरिक के साथ डिफॉल्ट का उपयोग जेनेरिक प्रकारों को शुरू करने के लिए या तो शून्य या 0 के आधार पर किया जाता है, यदि यह एक संदर्भ या मूल्य प्रकार है।
जब संदर्भ प्रकार होने के लिए सामान्य प्रकार के पैरामीटर को सीमित करने के लिए बाधाओं को लागू नहीं किया गया है, तो एक मूल्य प्रकार, जैसे कि एक संरचना भी पारित किया जा सकता है। ऐसे मामलों में, प्रकार के पैरामीटर को शून्य से तुलना करना हमेशा गलत होगा , क्योंकि एक संरचना खाली हो सकती है, लेकिन कभी भी अशक्त नहीं होगी
गलत कोड
public void TestChanges<T>(T inputValue)
try
{
if (inputValue==null)
return;
//operation on inputValue
}
catch
{
// ignore this.
}
}
संशोधित
public void TestChanges<T>(T inputValue)
try
{
if (object.Equals(inputValue, default(T)) )
return;
//operation on inputValue
}
catch
{
// ignore this.
}
}
class Fooसंपत्ति के साथ पैदा करता हूंint n। क्या मैं इसके बजायdefaultयहnकहने के लिए "ओवरलोड" कर सकता हूं ?50