2010-09-16 6 views
9

मैं हमेशा कुछ प्रकार की कम विशेषाधिकार वाली चीज़ों, या कम सुविधाओं वाले कुछ के रूप में संरचनाओं पर विचार करता था। शायद ओओपी अवधारणाओं के कारण कक्षाओं में सबकुछ उड़ रहा है।सी # में स्थिर संरचनाओं की अनुमति क्यों नहीं है?

सी # के संपर्क में थोड़ी सी मात्रा से, मैं समझता हूं कि कक्षा स्थिर स्थापित करना, यह सुनिश्चित करता है कि उसके सभी सदस्यों & फ़ंक्शंस स्थिर हैं। इसके अलावा हम उस कक्षा को शुरू करने के लिए एक कन्स्ट्रक्टर नहीं रख सकते क्योंकि केवल एक ही उदाहरण है।

public static struct mystruct 
{ 
    public static int a; 
} 

मुझे यहां स्टैक ओवरफ़्लो पर बताया गया था कि यह एक गलत विधि है। क्या कोई विस्तार कर सकता है।

मैं कह "स्थैतिक इस आइटम के लिए मान्य नहीं है" जब मैं एक नया सीएस फ़ाइल & कंसोल में यह संकलित बनाई उचित त्रुटि मिली। आश्चर्यजनक रूप से जब मैंने यह एक मौजूदा कार्य प्रोजेक्ट में जोड़ा ताकि यह देखने के लिए कि संकलक शिकायत करेगा लेकिन मेरे आश्चर्य के लिए यह नहीं है। इसके लिए कोई कारण ??

+6

सी # में, '' static' एक प्रकार घोषणा पर सार sealed' के लिए एक उपनाम है पाया (यह भी इस तरह के यकीन तरीके हैं बनाने के रूप में कुछ अन्य संकलन समय चेकों की अनुमति देता है स्थैतिक भी)। चूंकि structs मूल्य प्रकार हैं और polymorphic व्यवहार की अनुमति नहीं है, तो यह समझ में आता है कि क्यों 'स्थिर' की अनुमति नहीं है। हालांकि, आप संरचना पर स्थिर सदस्य हो सकते हैं। –

+2

@ स्टेव: यदि कक्षा स्थिर है, तो संकलक प्रकार के * उपयोग * की जांच भी करता है। उदाहरण के लिए, आप संख्या के पैरामीटर की घोषणा नहीं कर सकते हैं। आपको इसके बारे में पता ही हो सकता है, लेकिन मैं इसे ध्यान आकर्षित करना चाहता था :) –

+0

@ जोन: यह सही है - मुझे याद दिलाने के लिए धन्यवाद। –

उत्तर

17

एक स्थैतिक वर्ग स्थिर सदस्यों (किसी भी तरह के खेतों, घटनाओं, गुणों, और सबसे सामान्य तरीकों के लिए) के लिए एक कंटेनर है।

एक स्थिर संरचना बिल्कुल वही होगी, इसलिए कोई लाभ नहीं मिलेगा - लेकिन पाठक सोच सकते हैं इसका कुछ विशेष अर्थ था। भ्रम से बचने के लिए, इसलिए यह निषिद्ध है। संकल्पनात्मक रूप से यह एक स्थैतिक वर्ग के रूप में उतना ही समझ में आता है - निश्चित रूप से - structs और कक्षाओं के बीच का अंतर वास्तव में उदाहरणों के उदाहरणों के संदर्भ में है, और जैसा कि किसी भी प्रकार के स्थिर प्रकारों का कोई उदाहरण नहीं होगा, वह अंतर मूक होगा।

(यह नहीं कि मैं डिज़ाइन मीटिंग में था, जहां यह निर्णय लिया गया था, निश्चित रूप से। एरिक लिपर्ट इसके बारे में कुछ नोट्स ढूंढने में सक्षम हो सकता है। उपर्युक्त सिर्फ एक शिक्षित अनुमान है। एनोटेटेड सी # 3 स्पेक चुप है मामला, जहां तक ​​मैं देख सकता हूं।)

+2

आपका मतलब है कि आप डिज़ाइन मीटिंग में * नहीं * थे? –

+1

@ डैन: हां, मैं कभी भी सी # डिजाइन मीटिंग में नहीं रहा हूं। मैं निश्चित रूप से * प्यार * होगा। –

+0

@ जोन: क्षमा करें, मैंने पहली बार गलत वाक्य को पढ़ा है। निजी तौर पर, मुझे लगता है कि मैं इस तरह की एक बैठक में * नफरत करता हूं ... स्मार्ट निर्णय लेने के लिए बहुत अधिक दबाव! –

8

यह कुछ भी पूरा नहीं करता है। आपके पास अभी भी स्थैतिक वर्गों के साथ स्थिर विधियों का संग्रह होगा। सी # में एक संरचना का तात्पर्य यह संदर्भ प्रकार के बजाय एक मान प्रकार है, जिसका स्थिर स्तर पर कोई अर्थ नहीं है।

1

स्थिर प्रकारों की अवधारणा structs के लिए समझ में नहीं आता है। स्ट्रक्चर प्रति-मूल्य-मूल्य अर्थशास्त्र का अर्थ है - जो केवल तब ही समझ में आता है जब आप किसी प्रकार को तत्काल बना सकते हैं। स्थिर वर्गों को एक प्रकार में स्थैतिक तरीकों को एक साथ समूहित करना आसान बनाने के लिए पेश किया गया था जिसे तत्काल नहीं किया जा सकता है। स्थैतिक structs को अनुमति देना अनावश्यक और भ्रमित दोनों होगा।

इस बारे में सोचें। static class Foo और static struct Foo व्यवहार में भिन्न कैसे होगा? और यदि वे नहीं करते हैं ... क्यों static struct अवधारणा का परिचय दें? यह केवल लोगों को यह सोचने में भ्रमित कर सकता है कि एक अंतर है ...

+0

मैं अपना पॉइंट लेता हूं। लेकिन निश्चित रूप से "वर्ग" प्रतिलिपि द्वारा संदर्भित अर्थशास्त्र, उदाहरण बनाने की क्षमता, और विरासत के माध्यम से कार्यान्वयन विवरण साझा करने का तात्पर्य है, इनमें से कोई भी स्थिर वर्गों के बारे में सच नहीं है। यह बिल्कुल स्पष्ट नहीं है कि स्थिर वर्ग स्थिर संरचना से * बेहतर * है, और यह तर्कसंगत रूप से खराब है। –

+0

@Eric: वास्तव में यह करता है ... और शायद कुछ तीसरी तरह की अवधारणा (मॉड्यूल जैसा कि आप जॉन की पोस्ट पर अपनी टिप्पणी में उल्लेख करते हैं) बेहतर हो सकता है। मुझे लगता है कि मैं जो कहने की कोशिश कर रहा था (खराब) यह है कि * दोनों * स्थिर वर्ग और स्थैतिक संरचना भ्रमित हो रही है और एक व्यवहारिक अंतर को दर्शाती है जो अस्तित्व में नहीं थी। – LBushkin

1

क्योंकि संरचनाओं को स्ट्रक्चर पर लागू करने के लिए भाषा में अनुमति नहीं दी जाती है।

स्थिर वर्ग पहले से ही समान क्षमता को परिभाषित करता है।

+0

प्राचीन लिंक के लिए कोई कारण? –

+0

@ जॉन: इसे इंगित करने के लिए धन्यवाद। इसे हटाने के माध्यम से ठीक किया गया।जब मैंने संदर्भ पृष्ठ की खोज की तो Google में पहली बार जो चीज आई थी। –

3

फ़ाइल "यह वही तरीका है" के तहत है। चूंकि आप इसे स्थिर वर्ग के साथ कर सकते हैं, इसलिए स्थैतिक structs को अनुमति देने का कोई कारण नहीं है। यह सिर्फ लोगों को भ्रमित करेगा कि उनके बीच क्या अंतर है। उन्हें एक या दूसरे को चुनना पड़ा।

3

Also we cannot have a constructor to initialize that class as there is only a single instance.

वास्तव में, वहाँ एक स्थिर वर्ग का कोई उदाहरण है। किस तरह की स्थिर संरचनाओं के लिए समर्थन की कमी की व्याख्या करता है - या इसके बजाय, की कमी ऐसी चीज के लिए की आवश्यकता है।

(सी # में class और struct) .NET में संदर्भ प्रकार और मूल्य प्रकार के बीच भेद इन प्रकार के उदाहरणों कैसे नियंत्रित किया जाता है के बारे में पूरी तरह से है। एक संदर्भ प्रकार का एक उदाहरण संदर्भ के माध्यम से एक चर के रूप में उस उदाहरण के लिए उपयोग किया जाता है। इस तरह के संदर्भों की प्रतियां विधि कॉल के बीच पास की जाती हैं। किसी मान प्रकार का एक उदाहरण सीधे एक्सेस किया जाता है, और उदाहरण की प्रतियां विधि कॉल के बीच ही पास की जाती हैं।

किसी भी उदाहरण के बारे में बात करने के लिए, यह भेद अप्रासंगिक हो जाता है; इसलिए किसी भी प्रकार का जिसमें स्थिर सदस्य शामिल होते हैं, साथ ही स्थिर वर्ग भी हो सकते हैं।

3

कोई उदाहरण फील्ड initializers

एक वर्ग में हम एक क्षेत्र/चर बना सकते हैं और एक संरचना एक ही समय में यह प्रारंभ करने में इस तरह के प्रारंभ नहीं हो सकते की अनुमति है। इन क्षेत्रों को कार्यों के माध्यम से या ऑब्जेक्ट का उपयोग करके प्रारंभ किया जाना चाहिए। निर्माण के समय क्षेत्रों को प्रारंभिक मूल्य नहीं दिए जा सकते हैं। निम्नलिखित कोड एक त्रुटि देता है:

struct Point 
{ 
    public int x = 20; // Error its not possible to initialize 
    public int y=20; // Error its not possible to initialize 
} 

हालांकि एक संरचना में स्थिर फ़ील्ड हो सकते हैं, जिन्हें संरचना के अंदर शुरू किया जा सकता है। निम्नलिखित उदाहरण संरचना के अंदर स्थिर फ़ील्ड का उपयोग दिखाता है।

struct Point { 
     public static int x = 25; 
     public static int y = 50; 
} 

Struct & तरीके

एक सी # struct भी तरीकों हो सकते हैं। विधियां या तो स्थैतिक या गैर स्थैतिक हो सकती हैं। लेकिन स्थैतिक विधियां केवल अन्य स्थिर सदस्यों तक पहुंच सकती हैं और वे संरचना के किसी ऑब्जेक्ट का उपयोग करके इनकार नहीं कर सकते हैं। वे केवल संरचना नाम का उपयोग कर आह्वान कर सकते हैं।

struct Point 
{  
    static int x = 25;  
    static int y = 50; 
    public void SetXY(int i, int j)  
    {   
     x = i;   
     y = j;  
    }  

    public static void ShowSum()    
    {   
     int sum = x + y;   
     Console.WriteLine("The sum is {0}",sum);  
    } 
} 

के रूप में पर "http://www.csharpfriends.com/articles/getarticle.aspx?articleid=120"

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^