खोज…


टिप्पणियों

आमतौर पर एक struct का उपयोग केवल तब किया जाता है जब प्रदर्शन बहुत महत्वपूर्ण होता है। चूंकि मूल्य प्रकार स्टैक पर रहते हैं, इसलिए उन्हें कक्षाओं की तुलना में बहुत जल्दी पहुँचा जा सकता है। हालांकि, ढेर में ढेर की तुलना में बहुत कम जगह है, इसलिए संरचनाओं को छोटा रखा जाना चाहिए (Microsoft अनुशंसा करता है कि struct एस 16 बाइट्स से अधिक नहीं ले)।

C # में एक class सबसे अधिक इस्तेमाल किया जाने वाला (इन तीनों में से) प्रकार है, और आम तौर पर आपको पहले के साथ जाना चाहिए।

जब भी आपको स्पष्ट रूप से परिभाषित, विशिष्ट सूची हो सकती है, तो एक enum का उपयोग किया जाता है, जिसे केवल एक बार (संकलन समय पर) परिभाषित करने की आवश्यकता होती है। एनमर्स प्रोग्रामर्स के लिए कुछ मूल्य के हल्के संदर्भ के रूप में सहायक होते हैं: तुलना करने के लिए constant चर की एक सूची को परिभाषित करने के बजाय, आप एक एनुम का उपयोग कर सकते हैं, और यह सुनिश्चित करने के लिए कि आपको गलती से गलत मूल्य का उपयोग नहीं करने के लिए Intellisense समर्थन मिलता है।

संरचना परिभाषा

System.ValueType से विरासत में मिली संरचनाएँ मूल्य प्रकार हैं, और स्टैक पर रहते हैं। जब मान प्रकार को एक पैरामीटर के रूप में पारित किया जाता है, तो वे मूल्य से पारित हो जाते हैं।

Struct MyStruct
{
    public int x;
    public int y;
}

मान से पास होने का अर्थ है कि पैरामीटर का मान विधि के लिए कॉपी किया गया है, और विधि में पैरामीटर में किए गए किसी भी परिवर्तन को विधि के बाहर परिलक्षित नहीं किया जाता है। उदाहरण के लिए, निम्नलिखित कोड है, जो एक विधि नामित कॉल पर विचार AddNumbers चर में पारित, a और b , प्रकार के होते हैं जो int है, जो एक मूल्य प्रकार है।

int a = 5;
int b = 6;

AddNumbers(a,b);

public AddNumbers(int x, int y)
{
    int z = x + y; // z becomes 11
    x = x + 5; // now we changed x to be 10
    z = x + y; // now z becomes 16
} 

भले ही हम करने के लिए 5 जोड़ा x विधि के अंदर, के मूल्य में a अपरिवर्तित रहता है, क्योंकि यह एक मूल्य प्रकार है, और कहा कि इसका मतलब है x की एक प्रति था a के मूल्य, लेकिन वास्तव में नहीं a

याद रखें, मूल्य प्रकार स्टैक पर रहते हैं, और मूल्य द्वारा पारित किए जाते हैं।

कक्षा की परिभाषा

System.Object से विरासत में मिली कक्षाएं, संदर्भ प्रकार हैं, और ढेर पर रहते हैं। जब संदर्भ प्रकार को एक पैरामीटर के रूप में पारित किया जाता है, तो वे संदर्भ द्वारा पारित किए जाते हैं।

public Class MyClass
{
    public int a;
    public int b;
}

संदर्भ द्वारा पास होने का अर्थ है कि पैरामीटर का एक संदर्भ विधि के लिए दिया गया है, और पैरामीटर के किसी भी परिवर्तन को वापस आने पर विधि के बाहर परिलक्षित किया जाएगा, क्योंकि संदर्भ स्मृति में सटीक समान ऑब्जेक्ट के लिए है । आइए पहले के समान उदाहरण का उपयोग करें, लेकिन हम पहले कक्षा में int एस को "लपेट" देंगे।

MyClass instanceOfMyClass = new MyClass();
instanceOfMyClass.a = 5;
instanceOfMyClass.b = 6;

AddNumbers(instanceOfMyClass);

public AddNumbers(MyClass sample)
{
    int z = sample.a + sample.b; // z becomes 11
    sample.a = sample.a + 5; // now we changed a to be 10
    z = sample.a + sample.b; // now z becomes 16
} 

इस बार, जब हम बदल sample.a को 10 , का मूल्य instanceOfMyClass.a भी बदल जाता है, क्योंकि यह संदर्भ द्वारा पारित किया गया था। संदर्भ से पारित होने का अर्थ है कि ऑब्जेक्ट के लिए एक संदर्भ (जिसे कभी-कभी एक संकेतक भी कहा जाता है) ऑब्जेक्ट की एक प्रति के बजाय, विधि में पारित किया गया था।

याद रखें, संदर्भ प्रकार ढेर पर रहते हैं, और संदर्भ द्वारा पारित किए जाते हैं।

Enum परिभाषा

एक एनुम एक विशेष प्रकार की कक्षा है। enum कीवर्ड कंपाइलर को बताता है कि यह क्लास अमूर्त System.Enum क्लास से इनहेरिट करता है। Enums का उपयोग वस्तुओं की अलग-अलग सूचियों के लिए किया जाता है।

public enum MyEnum
{
    Monday = 1,
    Tuesday,
    Wednesday,
    //...
}

आप एक एनम को कुछ अंतर्निहित मूल्य में स्थिरांक को मैप करने का एक सुविधाजनक तरीका मान सकते हैं। उपर्युक्त परिभाषित एनम सप्ताह के प्रत्येक दिन के लिए मूल्यों की घोषणा करता है, और 1 शुरू होता है। Tuesday फिर स्वचालित रूप से 2 , Wednesday से 3 तक मैप हो जाएगा, आदि।

डिफ़ॉल्ट रूप से, एनमेस अंतर्निहित प्रकार के रूप में int उपयोग करते हैं और 0 से शुरू होते हैं, लेकिन आप निम्न में से किसी भी अभिन्न प्रकार का उपयोग कर सकते हैं: byte, sbyte, short, ushort, int, uint, long, or ulong , और किसी भी स्पष्ट मान को निर्दिष्ट कर सकते हैं आइटम। यदि कुछ वस्तुओं को स्पष्ट रूप से निर्दिष्ट किया गया है, लेकिन कुछ नहीं हैं, तो अंतिम परिभाषित 1 के बाद प्रत्येक आइटम को 1 से बढ़ा दिया जाएगा।

हम इस उदाहरण का उपयोग किसी अन्य मान को MyEnum पर कास्टिंग करके करेंगे जैसे:

MyEnum instance = (MyEnum)3; // the variable named 'instance' gets a 
                             //value of MyEnum.Wednesday, which maps to 3.

int x = 2;
instance = (MyEnum)x; // now 'instance' has a value of MyEnum.Tuesday

एक और उपयोगी, हालांकि अधिक जटिल है, एनुम के प्रकार को Flags कहा जाता है। Flags विशेषता के साथ एक एनुम को सजाने Flags , आप एक बार में एक से अधिक मूल्य के एक चर को असाइन कर सकते हैं। ध्यान दें कि ऐसा करते समय आपको आधार 2 प्रतिनिधित्व में मूल्यों को स्पष्ट रूप से परिभाषित करना चाहिए

[Flags]
public enum MyEnum
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32, 
    Sunday = 64
}

अब आप एक समय में एक से अधिक मानों की तुलना कर सकते हैं, या तो बिटवाइज़ तुलनाओं का उपयोग कर सकते हैं या, यदि आप .NET 4.0 या बाद में, अंतर्निहित Enum.HasFlag विधि का उपयोग कर रहे हैं।

MyEnum instance = MyEnum.Monday | MyEnum.Thursday; // instance now has a value of
                                                   // *both* Monday and Thursday,
                                                   // represented by (in binary) 0100. 

if (instance.HasFlag(MyEnum.Wednesday))
{
    // it doesn't, so this block is skipped
}
else if (instance.HasFlag(MyEnum.Thursday))
{
    // it does, so this block is executed
}

चूँकि Enum वर्ग को System.ValueType से उप- System.ValueType किया जाता है, इसलिए इसे एक मान प्रकार के रूप में माना जाता है और इसे संदर्भ द्वारा नहीं, बल्कि मान द्वारा पारित किया जाता है। आधार ऑब्जेक्ट हीप पर बनाया गया है, लेकिन जब आप एक फ़ंक्शन कॉल में एक एनुम मान पास करते हैं, तो एनम के अंतर्निहित मान प्रकार (आमतौर पर System.Int32) का उपयोग करके मूल्य की एक प्रति स्टैक पर धकेल दी जाती है। कंपाइलर इस मान और आधार ऑब्जेक्ट के बीच जुड़ाव को ट्रैक करता है जो स्टैक पर बनाया गया था। अधिक जानकारी के लिए ValueType Class (सिस्टम) (MSDN) देखें।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow