C# Language
structs
खोज…
टिप्पणियों
कक्षाओं के विपरीत, एक struct एक मूल्य प्रकार है, और स्थानीय स्टैक पर बनाया जाता है और डिफ़ॉल्ट रूप से प्रबंधित ढेर पर नहीं। इसका मतलब यह है कि एक बार जब विशिष्ट स्टैक गुंजाइश से बाहर हो जाता है, तो struct डी-आवंटित की जाती है। डी-आवंटित struct एस के निहित संदर्भ प्रकार भी बह गए हैं, एक बार जीसी निर्धारित करता है कि वे अब struct द्वारा संदर्भित नहीं हैं।
struct एस विरासत में नहीं मिल सकती है और विरासत के लिए आधार नहीं हो सकते हैं, वे अंतर्निहित रूप से सील हैं, और protected सदस्य भी शामिल नहीं कर सकते हैं। हालांकि, एक struct एक इंटरफ़ेस को लागू कर सकती है, जैसा कि कक्षाएं करती हैं।
एक संरचना की घोषणा
public struct Vector
{
public int X;
public int Y;
public int Z;
}
public struct Point
{
public decimal x, y;
public Point(decimal pointX, decimal pointY)
{
x = pointX;
y = pointY;
}
}
structउदाहरण फ़ील्ड को पैरामीट्रिज़्ड कंस्ट्रक्टर के माध्यम से या व्यक्तिगत रूप सेstructनिर्माण के बाद सेट किया जा सकता है।निजी सदस्यों को केवल कंस्ट्रक्टर द्वारा आरंभ किया जा सकता है।
structएक सील प्रकार को परिभाषित करती है जो अंतर्निहित रूप से System.ValueType से विरासत में मिली है।संरचनाएं किसी अन्य प्रकार से विरासत में नहीं मिल सकती हैं, लेकिन वे इंटरफेस को लागू कर सकते हैं।
संरचनाओं को असाइनमेंट पर कॉपी किया जाता है, जिसका अर्थ है कि सभी डेटा को नए इंस्टेंस पर कॉपी किया जाता है और उनमें से एक में परिवर्तन दूसरे द्वारा परिलक्षित नहीं होता है।
एक संरचना
nullनहीं हो सकती है, हालांकि इसे एकnullप्रकार के रूप में उपयोग किया जा सकता है:Vector v1 = null; //illegal Vector? v2 = null; //OK Nullable<Vector> v3 = null // OKnewऑपरेटर का उपयोग किए बिना या उसके बिना संरचना को त्वरित किया जा सकता है।//Both of these are acceptable Vector v1 = new Vector(); v1.X = 1; v1.Y = 2; v1.Z = 3; Vector v2; v2.X = 1; v2.Y = 2; v2.Z = 3;हालाँकि, एक इनिलाइज़र का उपयोग करने के लिए
newऑपरेटर का उपयोग किया जाना चाहिए:Vector v1 = new MyStruct { X=1, Y=2, Z=3 }; // OK Vector v2 { X=1, Y=2, Z=3 }; // illegal
एक संरचना सब कुछ घोषित कर सकती है जिसे एक वर्ग कुछ अपवादों के साथ घोषित कर सकता है:
- एक संरचना एक पैरामीटर रहित निर्माता की घोषणा नहीं कर सकती है।
structउदाहरण फ़ील्ड को पैरामीटर निर्मित कंस्ट्रक्टर के माध्यम से या व्यक्तिगत रूप सेstructनिर्माण के बाद सेट किया जा सकता है। निजी सदस्यों को केवल कंस्ट्रक्टर द्वारा आरंभ किया जा सकता है। - एक संरचना सदस्यों को संरक्षित घोषित नहीं कर सकती है, क्योंकि यह अंतर्निहित है।
- संरचना क्षेत्रों को केवल तब ही आरंभ किया जा सकता है जब वे स्थिर या स्थिर हों।
संरचना का उपयोग
निर्माता के साथ:
Vector v1 = new Vector();
v1.X = 1;
v1.Y = 2;
v1.Z = 3;
Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=1,Y=2,Z=3
Vector v1 = new Vector();
//v1.X is not assigned
v1.Y = 2;
v1.Z = 3;
Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=0,Y=2,Z=3
Point point1 = new Point();
point1.x = 0.5;
point1.y = 0.6;
Point point2 = new Point(0.5, 0.6);
निर्माता के बिना:
Vector v1;
v1.Y = 2;
v1.Z = 3;
Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
//Output ERROR "Use of possibly unassigned field 'X'
Vector v1;
v1.X = 1;
v1.Y = 2;
v1.Z = 3;
Console.WriteLine("X = {0}, Y = {1}, Z = {2}",v1.X,v1.Y,v1.Z);
// Output X=1,Y=2,Z=3
Point point3;
point3.x = 0.5;
point3.y = 0.6;
यदि हम इसके निर्माता के साथ एक संरचना का उपयोग करते हैं, तो हमें अनसाइनड फ़ील्ड के साथ समस्या नहीं होने वाली है (प्रत्येक अनसाइन किए गए फ़ील्ड में शून्य मान है)।
कक्षाओं के विपरीत, एक संरचना का निर्माण नहीं करना पड़ता है, अर्थात नए कीवर्ड का उपयोग करने की आवश्यकता नहीं है, जब तक कि आपको किसी एक निर्माता को कॉल करने की आवश्यकता नहीं है। एक संरचना को नए कीवर्ड की आवश्यकता नहीं होती है क्योंकि यह एक मूल्य-प्रकार है और इस प्रकार शून्य नहीं हो सकता है।
संरचना कार्यान्वयन इंटरफ़ेस
public interface IShape
{
decimal Area();
}
public struct Rectangle : IShape
{
public decimal Length { get; set; }
public decimal Width { get; set; }
public decimal Area()
{
return Length * Width;
}
}
संरचनाओं को असाइनमेंट पर कॉपी किया जाता है
साइनस संरचनाएं मान प्रकार हैं जो सभी डेटा असाइनमेंट पर कॉपी किए जाते हैं, और नई कॉपी में कोई भी संशोधन मूल कॉपी के लिए डेटा को नहीं बदलता है। शो नीचे दिए कोड स्निपेट कि p1 में कॉपी किया है p2 और पर किए गए परिवर्तनों p1 को प्रभावित नहीं करता p2 उदाहरण।
var p1 = new Point {
x = 1,
y = 2
};
Console.WriteLine($"{p1.x} {p1.y}"); // 1 2
var p2 = p1;
Console.WriteLine($"{p2.x} {p2.y}"); // Same output: 1 2
p1.x = 3;
Console.WriteLine($"{p1.x} {p1.y}"); // 3 2
Console.WriteLine($"{p2.x} {p2.y}"); // p2 remain the same: 1 2