2011-05-16 15 views
8
public void Finalise() 
    ProcessFinalisation(true); 

संकलन नहीं करता है, लेकिन सही संस्करण:केवल एक कथन के साथ विधियों को ब्रेसिज़ की आवश्यकता क्यों है?

public void Finalise() 
{ 
    ProcessFinalisation(true); 
} 

ठीक संकलित (बेशक)।

अगर मैं जब निम्न कोड केवल एक ही लाइन है अनुमति कोष्ठक के बिना अगर की:

if(true) 
    CallMethod(); 

क्यों एक ही है एक निम्नलिखित लाइन के साथ तरीकों के लिए अनुमति नहीं? क्या कोई तकनीकी कारण है?

+1

मैं कोष्ठक के खिलाफ की सलाह दी है बिना आईएफएस विश्वास करते हैं, लेकिन ऐतिहासिक कारणों से होती है। मुझे इस समय मेरा स्रोत नहीं मिल रहा है, लेकिन शायद कोई और इसकी पुष्टि कर सकता है? – Bazzz

+0

"if" एक कथन है और वह नियम केवल कथन के लिए है। तरीके कक्षाओं के सदस्य हैं। –

+0

आपको जवाब खोजने के लिए 1 9 70 के दशक में वापस जाना होगा। यह सी –

उत्तर

2

के बाद से सी # 6.0 आप घोषणा कर सकते हैं:

void WriteToConsole(string word) => Console.WriteLine(word) 

और फिर हमेशा की तरह इसे कहते:

public static void Main() 
{ 
    var word = "Hello World!"; 
    WriteToConsole(word); 
} 
14

स्पष्ट उत्तर भाषा का नमूना है; तर्क के लिए ... मुझे लगता है कि मुख्य रूप से सादगी - यह छोटे छोटे एकल-कथन विधियों की संख्या के लिए कल्पना और कंपाइलर की जांच के लिए अतिसंवेदनशीलता के ऊपरी हिस्से के लायक नहीं था। विशेष रूप से, मैं सामान्य रूप से सामान्य बाधाओं के साथ मुद्दों को देख सकता हूं (यानी हस्ताक्षर के अंत में where T : IBlah, new())।

ध्यान दें कि ब्रेसिज़ का उपयोग न करने से कभी-कभी अस्पष्टताएं हो सकती हैं, और कुछ स्थानों पर फेंक दिया जाता है। मैं व्यक्तिगत रूप से थोड़ा अधिक व्यावहारिक हूं, लेकिन प्रत्येक के लिए स्वयं।

यह भी ब्याज कि सी # उस्तरा अंदर स्पष्ट ब्रेसिज़ बिना उपयोग की अनुमति नहीं है की हो सकता है। बिलकुल भी (यानी if आदि के लिए)।

+0

धन्यवाद मार्क, क्या आपके पास ऐसा उदाहरण है जहां ब्रेसिज़ का उपयोग नहीं करना अस्पष्टता का कारण बनता है? –

+3

@ टॉम - मेरा मतलब है * रखरखाव * अस्पष्टता - क्लासिक उदाहरण एक ही इंडेंटेशन पर दूसरा कथन जोड़ रहा है, लापता ब्रेस को नहीं देख रहा है। –

+0

आह आपको धन्यवाद! –

11

मार्क मूल रूप से सही है। अपने उत्तर पर थोड़ा सा विस्तार करने के लिए: ऐसे कई स्थान हैं जहां सी # को "नग्न" कथन की अनुमति देने के बजाय बयानों के ब्रेसिड ब्लॉक की आवश्यकता होती है। वे हैं:

  • विधि, कन्स्ट्रक्टर, विनाशक, संपत्ति एक्सेसर, ईवेंट एक्सेसर या इंडेक्सर एक्सेसर का शरीर।
  • कोशिश, पकड़, आखिरकार, चेक, अनचेक या असुरक्षित क्षेत्र का ब्लॉक।
  • एक कथन का ब्लॉक लैम्ब्डा या अज्ञात विधि
  • यदि ब्लॉक में सीधे स्थानीय चर घोषित किया गया है तो एक if या loop कथन का ब्लॉक। (यानी, "जबकि (x! = 10) int y = 123;" अवैध है; आपको घोषणा को ब्रेस करना होगा।)

इनमें से प्रत्येक मामले में यह संभव होगा एक अनजान व्याकरण (या एक अस्पष्ट व्याकरण को असंबद्ध करने के लिए हेरिस्टिक) सुविधा के लिए जहां एक एकल अव्यवस्थित कथन कानूनी है। लेकिन बिंदु क्या होगा? उन स्थितियों में से प्रत्येक में आप कई बयानों को देखने की उम्मीद कर रहे हैं; एकल कथन दुर्लभ, असंभव मामला हैं। ऐसा लगता है कि इन बहुत ही असंभव मामलों के लिए व्याकरण को स्पष्ट बनाने के लिए यह वास्तव में लायक नहीं है।

+0

"एक कथन का ब्लॉक लैम्ब्डा" - क्या यह थोड़ा सा सतर्क नहीं है क्योंकि एक कथन लैम्ब्डा ब्रेसिज़ के साथ एक है? – configurator

+1

@configurator: निश्चित रूप से, लेकिन ऐसा इसलिए है क्योंकि हमने ऐसा निर्णय लिया है। एक बयान लैम्ब्डा एक लैम्ब्डा हो सकता है जहां कोई कथन => अगर हम चाहते थे तो इसका पालन करता है। यह कहना आसान है कि इसे एक ब्लॉक होना है। "action = x => foreach (x में var y) कंसोल। राइटलाइन (वाई);" अगर हम इसे पार्स करने के नियमों के साथ आते हैं तो लैम्बडा एक कानूनी कथन हो सकता है। –

1

संक्षिप्त उत्तर: सी # सी के बाद स्टाइल किया गया है, और सी अनिवार्य है कि सी फ़ंक्शन घोषणाओं के कारण कार्यों को ब्रेक किया जाता है। इतिहास के साथ

लांग संस्करण: कश्मीर & आर सी में वापस, कार्यों इस तरह घोषित किया गया:

int function(arg1, arg2) 
int arg1; 
int arg2; 
{ code } 
बेशक

आपको लगता है कि व्यवस्था में unbraced कार्य नहीं कर सका।एएनएसआई सी वाक्य रचना अनिवार्य हम सभी जानते हैं और प्यार:

int function(int arg1, int arg2) 
{ code } 

लेकिन क्योंकि वे बड़े compilers कि केवल पता था कि कश्मीर & आर वाक्य रचना [और कश्मीर & आर घोषणाओं के लिए समर्थन था के साथ कहर का कारण होगा unbraced कार्यों की अनुमति नहीं दी, अभी भी आवश्यक]।

समय चल रहा था, और सालों बाद सी # सी [या सी ++, वाक्यविन्यास के संदर्भ में एक ही अंतर] के आसपास डिजाइन किया गया था, और चूंकि सी ने असंबद्ध कार्यों की अनुमति नहीं दी, न ही सी #।

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