2011-02-18 19 views
15

this MSDN pageuse पर अंतिम वाक्य के अनुसार using पर प्राथमिकता दी जानी चाहिए। मैंने इसे कहीं और सुना है (this answer, उदाहरण के लिए)। ऐसा क्यों है? मुझे लगता है कि use बाद में जोड़ा गया था। लेकिन क्या अंतर है? सतह पर, using अधिक उपयोगी लगता है क्योंकि आप Dispose() कहलाते समय नियंत्रित कर सकते हैं, और यदि आवश्यक हो तो आप बाध्य मान (उदा। (fun _ -> ...)) को स्पष्ट रूप से अनदेखा कर सकते हैं।उपयोग करने से बेहतर क्यों उपयोग किया जाता है?

उत्तर

12

मुझे लगता है कि use पसंद करने का कारण यह है कि वाक्यविन्यास सरल है। कई अन्य भाषा संरचनाओं को कार्यों के रूप में व्यक्त किया जा सकता है (उदा। try .. with, for, while, ...)। यदि भाषा डिजाइनरों ने एक सरल वाक्यविन्यास जोड़ा है, तो इसका उपयोग क्यों न करें ...

जैसा कि मैंने earlier answer you referenced में लिखा था, आप use का उपयोग करते समय भी दायरे को नियंत्रित कर सकते हैं। (और इस तरह, आप ऑब्जेक्ट एक्सप्रेशन कक्षा घोषणाओं के रचनाकारों में भी इसका उपयोग कर सकते हैं।) लेकिन अधिकांश समय, स्वचालित व्यवहार ठीक है (जो निर्माण को using से सी # में सरल बनाता है)।

चाहे आप use या using का उपयोग ऐसे परिस्थितियों में करेंगे जहां आपको दायरे को नियंत्रित करने की आवश्यकता है, स्पष्ट रूप से व्यक्तिगत स्वाद का विषय है। यदि आपको use की स्पष्ट स्कॉपिंग पसंद नहीं है (जो थोड़ा अजीब दिखता है, तो मैं स्वीकार करता हूं, लेकिन मेरे लिए ठीक काम करता है), आप using का उपयोग कर सकते हैं।

संपादित करें: एक वर्ग घोषणा में, आप उदाहरण लिखने के लिए नहीं कर सकते हैं:

type Foo() = 
    use a = new Whatever() 
    // ... 

क्योंकि a के दायरे (संभवतः) होगा उदाहरण के पूरे जीवन भर। (हालांकि मुझे लगता है कि यह उपयोगी हो सकता है और यह आपके प्रकार के IDisposable के स्वचालित कार्यान्वयन को जोड़ सकता है)। यदि आप using का उपयोग करते हैं, तो आपको इस तरह की परेशानी नहीं मिलती है।

+1

मैंने ऑब्जेक्ट एक्सप्रेशन के साथ प्रयोग किया और आपके द्वारा उल्लिखित सीमा को समझ नहीं पाया। क्या आप विस्तार से बता सकते हैं? – Daniel

+0

@ Daniel: क्षमा करें, मुझे कक्षा घोषणाएं कहना था - ऑब्जेक्ट एक्सप्रेशन नहीं! –

+0

मुझे अभी भी सीमा नहीं मिल रही है। 'का उपयोग' एक कन्स्ट्रक्टर के भीतर ठीक काम करने लगता है। – Daniel

16

जब निपटाने के साथ-साथ use साथ कहा जाता है, बस (कोष्ठक की तरह या begin - end) हमेशा की तरह scoping contructs का उपयोग करके आप नियंत्रित कर सकते हैं, उदाहरण के

let F() = 
    let x = 4 
    (
     use file = System.IO.File.Open("foo.xml", System.IO.FileMode.Append) 
     let z = 4 
     printfn "file still open here" 
    ) 
    printfn "file was already closed/disposed" 

लेकिन मुझे लगता है कि यह शायद ही कभी उपयोगी है। मुझे लगता है कि IDisposable ऑब्जेक्ट का नाम/उपयोग करना भी दुर्लभ नहीं है। use अधिक वाक्य रचनात्मक रूप से सुविधाजनक है, और 95% समय आपको जो चाहिए वह करता है, इसलिए मुझे लगता है कि यही पसंद है।

+2

इस की सिंटैक्टिक विषमता 'उपयोग' का पक्ष लेने का एक और कारण है। क्या आप जानते हैं कि वे अलग आईएल उत्पादन करते हैं? – Daniel

+0

मुझे उम्मीद है कि वे समान आईएल उत्पन्न करेंगे, हालांकि मुझे नहीं पता या परवाह नहीं है। वाक्य रचनात्मक विषमता के लिए, फिर से, कोई भी इस तरह कोड नहीं लिखता है, क्योंकि कोई भी परवाह नहीं करता है कि 'निपटान' को फ़ंक्शन के अंत से पहले या फ़ंक्शन के अंत में दो पंक्तियों कहा जाता है। परिदृश्य जहां यह महत्वपूर्ण है दुर्लभ हैं। बस 'उपयोग' का प्रयोग करें। – Brian

+0

एक परिदृश्य जहां आपको कुछ लिखने की आवश्यकता होती है _after_ 'उपयोग' स्कोप सिरों का होता है यदि आपको किसी जारी ऑब्जेक्ट (लॉक की गई फ़ाइल को फिर से लिखने योग्य) के लिए सही तरीके से परीक्षण करने की आवश्यकता होती है, या उदाहरण के लिए सेमफोर के साथ। फिर भी, केवल एक फ़ंक्शन में 'उपयोग' को लपेटें और उस फ़ंक्शन को कॉल करने के बाद अपने बाद के रिलीज कोड को कॉल करें, और इस उदाहरण में स्कॉइंग की आवश्यकता नहीं है। – Abel

3

व्यक्तिगत रूप से, मैं एक ही कारण के लिए using को use पसंद करते हैं कि मैं पसंद

let a = some_expr 
some_stuff_with_a 

को

(fun a -> some_stuff_with_a) some_expr 

बाध्यकारी रूप के साथ, आप आमतौर पर कोष्ठक का एक सेट है, और संघ से बच सकते हैं पहचानकर्ता और मूल्य के बीच जो इसे बाध्य किया जा रहा है, अंतरिक्ष में करीब और देखने में आसान है।

0

use के खिलाफ एक उदाहरण बेहतर तो using है:

using की तुलना में बेहतर use रूप using एक लाइन में लिखा जा सकता है, जबकि use नहीं कर सकता है।

उदाहरण के लिए,
xx एक संसाधन जो yy द्वारा खोला जाता है दिया पैरामीटर p का उपयोग करने से एक समारोह एफसीटी द्वारा एक मूल्य के लौटने की क्रिया है।

let xx p = using (yy(p)) (fun resource-> fct resource)  // <-- this is OK 

let xx p = (use resource = yy(p); fct resource)   // <-- this is Not OK 
+8

आपको 'इन' का उपयोग करने की आवश्यकता है, जैसे: ' xx p = (fct संसाधन में संसाधन = yy (p) का उपयोग करें) '। – Tarmil

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