Structure in C#: Enumeration की तरह ही Structure भी एक User Defined Type होता है। लेकिन Structure, Enumerations की तरह केवल Name/Value Pair नहीं होते बल्कि ये Class Type के समान होते हैं, जिनमें Data Members व Methods दोनों हो सकते हैं, जबकि Class व Structure में मूल अन्तर ये है कि Structure Value Type होते हैं, जबकि Class Reference Type होते हैं।
Structure को हम एक तरह से Light Weight Class समझ सकते हैं। लेकिन Structure एक तरह से Implicitly Sealed Type होते हैं, जिन्हें Inherit नहीं किया जा सकताए जबकि Classes को Inherit किया जा सकता है। एक Simple Class को Define करने के लिए हमें struct Keyword को Use करना होता है और निम्नानुसार Syntax Follow करना होता है:
struct StructName
{
//MemberDeclarations
}
Structure : The Value Type
Structures हमेंशा Value Type होते हैं। यानी Structure के सभी Data Members Memory के Stack Area में ही Separately Store होते हैं। इसलिए Structure के सभी Data Members के स्वयं के Data होते हैं।
Structure Type के Variable को null Assign नहीं किया जा सकता क्योंकि null केवल Reference Type को ही Assign किया जा सकता है, जबकि Structure Value Type होते हैं और इसीलिए दो Structure Variables कभी भी समान Object को Refer नहीं कर सकते। अत: यदि हम दो समान Structure Type के Variables को भी आपस में Compare करें, तो हमें Error प्राप्त होता है। जैसे:
// File Name: struct.cs using System; namespace CSharpIntermediateConstructsStruct { struct Real { public int x; public int y; } class Structure { static void Main(string[] args) { Real complexNumber = new Real(); Real realNumber = new Real(); if (realNumber == complexNumber) { } } } } // Output: struct.cs(24,8): error CS0019: Operator '==' cannot be applied to operands of type 'CSharpIntermediateConstructsStruct.Real' and 'CSharpIntermediateConstructsStruct.Real'
Structure Assignment
यदि हम किसी एक Structure Variable को किसी दूसरे Structure Variable में Copy करें, तो Source Structure के सभी Data Members, Target Structure में Member-Wise Copy हो जाते हैं। जबकि यदि हम एक ही Class के दो Objects को आपस में Copy करें, तो केवल Actual Object का Reference ही Copy होता है। Class Objects व Structure Variables के Assignment के बीच के अन्तर को हम निम्न Program द्वारा बेहतर तरीके से समझ सकते हैं:
// File Name: StructureAndClassAssignment.cs using System; namespace CSharpIntermediateConstructsStruct { class Complex { public int x; public int y; } struct Real { public int x; public int y; } class StructureAndClassAssignment { static void Main(string[] args) { Complex complexNumber1 = new Complex(); complexNumber1.x = 10; complexNumber1.y = 20; Complex complexNumber2 = complexNumber1; complexNumber1.x = 1000; complexNumber1.y = 2000; Console.WriteLine("Class: x:{0}, y:{1}", complexNumber2.x, complexNumber2.y); Real realNumber1 = new Real(); realNumber1.x = 100; realNumber1.y = 200; Real realNumber2 = realNumber1; realNumber1.x = 10; realNumber1.y = 20; Console.WriteLine("Struct: x:{0}, y:{1}", realNumber2.x, realNumber2.y); } } } // Output: Class: x:1000, y:2000 Struct: x:100, y:200
जैसाकि इस उदाहरण द्वारा हम समझ सकते हैं कि जब हम Complex नाम की Class का एक complexNumber1 नाम का Object Create करके Value Initialize कर देने के बाद इसी Class का complexNumber2 नाम का नया Object Create करते हैं और उस नए Object को पहले Create किए गए complexNumber1 नाम के Object से ही Initialize कर देने के बाद complexNumber1 नाम के Object के Data Members के मानों को Change कर देते हैं, तो Automatically complexNumber2 के Data Members के मान भी Change हो जाते हैं।
क्योंकि Class एक Reference Type होता है, जिसके सभी Members Store होने के लिए Memory के Heap Area में Space Reserve करते हैं और जब हम किसी Class के Object को किसी दूसरे Object में Assign करते हैं, तो वास्तव में हम केवल Reference ही Assign कर रहे होते हैं, Actual Value नहीं।
इसलिए Assignment के बाद समान Class के दोनों ही Objects समान Heap Area को Refer करते हैं। परिणामस्वरूप किसी एक Object के माध्यम से Object के Data को Change करने पर दूसरे Object के लिए भी वह Data Modify हो जाता है।
यही वजह है कि जब हम complexNmber1 के Data Members के मानों को Change करते हैं, तो Automatically complexNumber2 के Data Members के मान भी Change हो जाते हैं और हमें हमारे उपरोक्त Program का पहला Output प्राप्त होता है।
लेकिन जब हम Real नाम के Structure का एक realNumber1 नाम का Object Create करके Value Initialize कर देने के बाद इसी Structure का realNumber2 नाम का नया Variable Create करते हैं और उस नए Variable को पहले Create किए गए realNumber1 नाम के Variable से ही Initialize कर देने के बाद realNumber1 नाम के Variable के Data Members के मानों को Change कर देते हैं, तो realNumber2 के Data Members के मान Automatically Change नहीं होते।
क्योंकि Structure एक Value Type होता है, जिसके सभी Members Store होने के लिए Memory के Stack Area में Separate Space Reserve करते हैं। यही वजह है कि जब हम realNmber1 के Data Members के मानों को Change करते हैं, तो Automatically realNmber2 के Data Members के मान Change नहीं होते और हमें हमारे उपरोक्त Program का दूसरा Output प्राप्त होता है।
Structure Constructor
Constructors के विषय में हम विस्तार से तब समझेंगे जब हम Object Oriented Programming System Concepts को Use करते हुए Class Type Create करेंगे। लेकिन चूंकि Structure Construct भी एक प्रकार का User Defined Type होता है, जो बहुत हद तक Class Type Construct के समान ही होती है, इसलिए हम Structure Type में भी Constructors Create कर सकते हैं।
Constructor एक ऐसा Special Type का Method होता है, जिसका वही नाम होता है, जो Structure का नाम होता है और Constructor को हम कभी भी Manually Call नहीं करते, बल्कि जब हम किसी Structure Type का नया Object Create करते हैं, तब Appropriate Constructor Automatically Call हो जाता है।
यहां तक कि जब हम स्वयं कोई Constructor Define नहीं करते, तब भी C# Compiler हमें Structure Type के लिए एक Default Constructor Available करवाता है, जो कि एक No-Argument Constructor होता है। इसीलिए जब हम Structure Type का Object Create करते हैं, तब new Operator के साथ Specify किया जाने वाला Method, Default Constructor ही होती है। जैसे:
Complex complexNumber1 = new Complex();
Real realNumber1 = new Real();
इन दोनों Statements में Complex() व Real() Methods वास्तव में Structure द्वारा Provide किए जाने वाले Default Constructors हैं। Constructors के बारे में Detailed Discussion हम तब करेंगे जब हम Class के बारे में समझेंगे।
जब हम Structure Create करते हैं, तब हम कभी भी किसी भी Field को Define करते समय Initialize नहीं कर सकते, बल्कि Initialization का काम Constructors द्वारा ही किया जाता है। जैसे:
struct Complex { public int x = 0; public int y = 0; }
यदि हम इस तरह से Structure Create करें, तो C# Compiler हमें Compile Time Error Return करेगा, क्योंकि हमने Structure के Data Members को Declare करते समय ही उसे एक Default Value से Initialize कर दिया है।
Structures Are Sealed
Structures Implicitly Sealed होते हैं। यानी हम जिस तरह से Object Oriented Programming System Concept को Implement करते हुए किसी Class को Inherit कर सकते हैं, उस तरह से हम किसी Structure को Inherit नहीं कर सकते। इसलिए Structure Types को Sealed Data Type भी कह सकते हैं।
चूंकि Structures Inheritance को Support नहीं करते, इसलिए हम protected, internal, abstract व virtual जैसे Modifies को भी Structure Types के साथ Use नहीं कर सकते, क्योंकि इन Modifiers को केवल उन Type के साथ ही Use किया जा सकता है, जो Inheritance को Support करते हैं।
लेकिन जब हम Base Class System.ValueType के समान नाम का कोई Member Create करते हैं, तब हम Structures के साथ हम new व override Modifiers को Use कर सकते हैं, जो Inheritance Related Modifies हैं। क्योंकि Structures भी Internally System.ValueType से ही Derived होते हैं, जो कि स्वयं System.Object से Derive होते हैं।
Use of Structures
चूंकि Structures भी एक प्रकार का User Defined Value Type होता है, इसलिए इसे हम किसी Method में Return Value अथवा Parameter की तरह भी Specify कर सकते हैं।
जब हम Structure को किसी Method में Parameter की तरह Pass करते हैं, तो Calling Method से आने वाले Structure के Actual मानों को Hold करने के लिए एक नया Structure Create होता है और जब हम Called Method से किसी Structure को Return Value की तरह Return करते हैं, तो Return होने वाले Structure की एक Copy Create होकर Return होती है।
इसी तरह से जब हम ref या out Parameters के साथ Structure को Specify करते हैं, तब हम Called Methods द्वारा भी Structure के Actual Data Members को Change कर सकते हैं।
Class का Object Create करने की तुलना में Structure का Variable Create करना ज्यादा आसान होता है। इसलिए Classes की तुलना में कई बार Structures को Use करने पर हमारे Application Program की Performance Improve होती है। लेकिन इस स्थिति में हमें Boxing व Unboxing के बारे में सावधान रहना जरूरी होता है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C#.NET in Hindi | Page:908 | Format: PDF