2012-03-08 8 views
8

मैं उस टीम के डिजाइन विचारों को समझने की कोशिश कर रहा हूं जिसने विधि Environment.GetCommandLineArgs बनाई है।पर्यावरण। गेटकॉमैंडलाइन आर्ट्स - यह एक विधि क्यों है? संपत्ति क्यों नहीं?

यह एक स्थिर संपत्ति हो सकती है, System.Web.HttpContext.Current जैसी बहुत स्थिर संपत्ति हो सकती है। आखिरकार, लौटाए गए मूल्य को एक बार उपलब्ध नहीं होना चाहिए। तो यह वर्तमान चल रही प्रक्रिया की एक संपत्ति की तरह है।

मुझे पता है कि .NET में कोई भी संपत्ति गेटटर/सेटर विधियों के लिए एक वाक्य रचनात्मक चीनी है। लेकिन स्पष्ट गेटर विधि के बजाय संपत्ति का उपयोग करने का यह सही कारण है।

या शायद यहां कुछ ऐसा है जो मुझे याद आ रहा है?

आपको क्या लगता है?

+1

बीसीएल टीम ने गुणों और विधियों के बीच एक अर्थपूर्ण भेद का सम्मान किया। गुण केवल तभी उपयोग किए जाते हैं जब प्रोग्रामर उन्हें किसी क्षेत्र तक पहुंचने के बराबर कॉल कर सकता है। इस मामले में, 'GetCommandLineArgs' इस तरह से काम नहीं करता है, इसलिए यह एक विधि है। इस बारे में सोचें कि हर बार मूल्य को पुनः प्राप्त करने या गणना करने के लिए। –

उत्तर

4

मुझे संदेह है क्योंकि यह हर बार जब आप इसे कॉल करते हैं तो सरणी की एक प्रति बनाता है। उदाहरण के लिए, इस कार्यक्रम पर विचार करें:

using System; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     string[] argsCopy = Environment.GetCommandLineArgs(); 
     args[0] = "x"; 

     // 0 is the command in this case 
     argsCopy[1] = "y"; 

     string[] argsCopy2 = Environment.GetCommandLineArgs(); 
     Console.WriteLine(argsCopy2[1]); 
    } 
} 

यदि आप इसे "परीक्षण मूल" के साथ चलाते हैं तो यह अभी भी "मूल" प्रिंट करेगा।

तो तुम जब कहते हैं:

सब के बाद, एक बार दिए गए मान उपलब्ध परिवर्तन नहीं होना चाहिए।

वास्तव में, यह ठीक है क्योंकि सरणियों हमेशा परिवर्तनशील हैं हर कॉल पर एक अलग मूल्य (एक नई सरणी संदर्भ) वापस आ जाएगी।

+0

हम्मम्म .. अच्छा बिंदु। मुझे लगता है कि आप सही हैं, यह मूल सरणी की ** प्रति ** ** होना चाहिए, इसलिए प्रत्येक कॉल के लिए एक नई सरणी। –

+0

यही कारण है कि मुझे लगता है ['IReadOnlyList '] (http://msdn.microsoft.com/en-us/library/hh192385%28v=vs.110%29.aspx) फ्रेमवर्क में लंबे समय से होना चाहिए था पहले और सरणी के बजाय बहुत कुछ इस्तेमाल किया। – svick

+0

@ एसविक: बिल्कुल - लेकिन जेनेरिक से पहले ऐसा करना मुश्किल होगा ... –

0

मेरी समझ से, विधियों के लिए विधियों का उपयोग किया जाता है (कुछ कर रहा है)। इसलिए एक विधि को कॉल करने का मतलब यह होगा कि आप कुछ बड़े (जीर) तर्क के माध्यम से जा रहे हैं, जैसे कि गणना या डेटाबेस-रिपोजिटरी के लिए कॉल। और गुण मूल रूप से चर या सेटिंग सेट करने के लिए हैं। अगर आप किसी व्यक्ति का नाम चाहते हैं तो आपके पास संपत्ति 'नाम' होगी और इसे व्यक्ति की तरह कॉल करें। नाम और व्यक्तिगत नहीं। नाम()। लेकिन अगर आप व्यक्ति की उम्र चाहते हैं और आपके पास केवल जन्मदिन है, तो आपके पास उम्र की गणना के लिए मूल तर्क के साथ GetAge() की विधि होगी। शायद मैं यहां पूरी तरह से गलत हूं लेकिन मेरी समझ यह है कि विधियों का उपयोग कोड और तर्क के बड़े हिस्सों के लिए किया जाता है जबकि गुणों का उपयोग (अधिक) बस सेटिंग और मूल्य प्राप्त करने के लिए किया जाता है।

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