2010-10-31 17 views
11

सी # में बनाम कैसे एक घोषणा एक परिभाषा से भिन्न क्यों है, अर्थात्:घोषणाएं परिभाषाओं

  1. एक वर्ग घोषणा बनाम एक वर्ग परिभाषा
  2. एक चर घोषणा परिभाषा बनाम
  3. एक विधि पैरामीटर घोषणा परिभाषा
  4. बनाम

सी ++ में, यह स्पष्ट था, लेकिन सी # में मैं ईसीएमए मानक और एमएसडीएन से क्या कह सकता हूं, यह सब कुछ एक घोषणा है और जहां शब्द परिभाषा का उपयोग किया जाता है, यह घोषणा के रूप में एक ही बात का मतलब है।

उत्तर

7
  1. वह भेद मौजूद नहीं है। आप घोषणा के दायरे का जिक्र कर रहे हैं, परिभाषा का बिंदु चर/क्षेत्र के दायरे के लिए अप्रासंगिक है।

  2. int x; // 'x' is declared 
    x = 10; // 'x' is assigned 
    
    
    int y = 20; // 'y' is both declared and assigned 
    
  3. कि भावना का एक बहुत नहीं है। विधि हस्ताक्षर में एक विधि तर्क घोषित किया गया है।

मुझे लगता है कि आप थोड़ा 1 और 3

+0

ठीक है, सी ++ में: int x = 10; // एक घोषणा नहीं है और सख्ती से एक परिभाषा है। यही कारण है कि मैं सी # शब्दावली के साथ उलझन में हूँ। इसके अलावा, सी ++ कक्षा घोषणाओं की अनुमति देता है जो कक्षा परिभाषाओं से पूरी तरह अलग हैं। सी # आंशिक कक्षाओं और पूरी तरह से परिभाषित कक्षाओं की अनुमति देता है, लेकिन दोनों घोषणाएं प्रतीत होते हैं! –

+0

@ माइकल: नहीं, दोनों परिभाषाएं हैं। –

+0

@ माइकल: आंशिक कक्षाएं केवल एक वर्ग कई स्रोत फ़ाइलों में विभाजित हैं। कुछ सदस्यों को एक फ़ाइल में परिभाषित किया जाता है और कुछ दूसरों में। –

2

ऐसा इसलिए नहीं है क्योंकि सी # को एक भेद नहीं करना है।

10

में के बारे में शब्दावली भ्रमित सी ++ एक युग जहां फेराइट कोर एक डॉलर एक दर्जन से अधिक थे से मॉडल दिनांकों निर्माण कर रहे हैं। एकाधिक स्रोत कोड फ़ाइलों को एक समय में संकलित किया गया। एक एकल पास कंपाइलर के साथ। एक साथ सब कुछ गोंद करने के लिए एक लिंकर। इसने हेडर फाइलों और प्रोटोटाइपों में आवश्यक अलग-अलग घोषणाएं की।

सी # कंपाइलर आधुनिक मशीन संसाधनों का तैयार लाभ लेता है। एक असेंबली का गठन करने वाली सभी स्रोत कोड फ़ाइलों को एक ही समय में संकलित किया जाता है, संकलक कम से कम दो पास बनाता है ताकि यह विधि निकायों से पहले घोषणाओं को पार्स कर सके। अभी भी एक संभावित लिंक मॉडल है लेकिन यह बहुत ही कम इस्तेमाल होता है।

एक परिभाषा का एकमात्र विचार जो मुझे लगता है कि एक लक्ष्य विधि से मेल खाता है जो एक लक्षित विधि से मेल खाता है और एक इंटरफेस सदस्य घोषणा को इसके ठोस कार्यान्वयन से मेल खाता है।

+2

+1। – Euphoric

15

जहां शब्द परिभाषा प्रयोग किया जाता है, यह घोषणा

सही रूप में एक ही बात मतलब करने के लिए प्रयोग किया जाता है।

उनके संकलन मॉडल के कारण सी और सी ++ में मुलायम/आगे परिभाषा के रूप में 'घोषणा' की अवधारणा की आवश्यकता है। सी ++ (अवधारणात्मक रूप से) एकल पास संकलन का उपयोग करता है, सी # बहु-पास है। पर विचार करें:

class Bar; // declaration: needed in C++, illegal and unnecessary in C# 

class Foo // counts as a declaration of Foo 
{ 
    Foo f; // use of declared but still incomplete type 
    Bar b; // use of declared but still undefined class Bar 
} 

class Bar // definition and re-declaration 
{ 
} 

सी ++ पहले एक घोषणा के बिना Bar b क्षेत्र को संभाल नहीं कर सकते हैं। सी # कर सकते हैं।

1

में "सी प्रोग्रामिंग भाषा" Kernighan & रिची के अनुसार: ए 'घोषणा "चर के गुणों की घोषणा; इसमें एक नाम और चर की एक सूची शामिल है, जैसे: int fahr, सेल्सियस;

"सी ++ प्रोग्रामिंग भाषा" में स्ट्रॉस्ट्रप के अनुसार: ए "घोषणा" एक बयान है जो कार्यक्रम में नाम प्रस्तुत करता है। यह उस नाम के लिए एक प्रकार निर्दिष्ट करता है। एक प्रकार किसी नाम या अभिव्यक्ति के उचित उपयोग को परिभाषित करता है।

न तो पुस्तक विशेष रूप से "परिभाषा" को परिभाषित करती है। लेकिन दोनों एक चर के VALUE की वैज्ञानिक भावना में शब्द का उपयोग करते हैं। इस प्रकार एक समारोह घोषणा समारोह के कॉलिंग हस्ताक्षर की घोषणा करता है। एक फ़ंक्शन परिभाषा में वास्तविक कोड होता है।

इन भाषाओं में अलग-अलग अर्थ रखने की आवश्यकता yesteryear के कंपाइलर्स की वजह से है। वास्तव में नाम का उपयोग करने से पहले, उन्हें समय से पहले नामों के प्रकारों को जानने की आवश्यकता थी। अन्यथा उन्हें स्रोत कोड के माध्यम से एक और पास करने की आवश्यकता होगी।

0

मूल सवाल 1, 2, 3 के उत्तर: सी # में कोई अंतर नहीं

हालांकि तरीकों के संबंध में उन शब्दों उल्लेख के लायक हो सकता है:

  • घोषणाइंटरफ़ेस में जगह है जहां हम विधि
  • परिभाषा वास्तविक स्थान है जहां हम घोषित किए गए वास्तविक कार्यान्वयन को "परिभाषित" करते हैं पहले विधि (जैसा कि "कार्यान्वयन")
संबंधित मुद्दे