2009-06-03 14 views
5
Class c = new Class({ Prop = "Initial" }); 

मेरे पास उपरोक्त वर्ग है। इसे संशोधित करने के लिए आप एक विधि कैसे बनायेंगे?क्या आप संशोधित ऑब्जेक्ट को वापस करना पसंद करते हैं या नहीं?

public Class ModifyIt(Class c) 
{ 
    c.Prop = "changed"; 
    return c; 
} 

या

public void ModifyIt(Class c) 
{ 
    c.Prop = "changed"; 
} 

तो इस तरह कहा जाता है ...

Class c = ModifyIt(c); 
Console.WriteLine(c.Prop); 
// changed 

या इस

ModifyIt(c) 
Console.WriteLine(c.Prop); 
// changed 

क्या अपनी पसंद?

+0

आप ModifyIt() के पैरामीटर के रूप में 'कक्षा x' क्यों पारित कर रहे हैं? क्या आपकी विधि क्लास इंस्टेंस को 'इस' के रूप में नहीं ले जाएगी? कोड को देखते हुए आपके पास चेनिंग के बारे में अन्य सभी उत्तर वास्तव में काम नहीं करेंगे। मेरे लिए सवाल यह होगा कि यदि आपकी कक्षा एक मूल्य प्रकार से अधिक है, तो इस मामले में आपको अपने उदाहरणों को संशोधित नहीं करना चाहिए, बल्कि ऑपरेशन के परिणामस्वरूप एक नया खाता वापस करना चाहिए। – van

उत्तर

2

इसे पहली बार करने के बारे में अच्छी बात है, जिसमें आप वास्तव में इसे बदलने के बाद आइटम लौट रहे हैं, यह है कि यह विधि श्रृंखला को अनुमति देता है। जिसका अर्थ है आप कुछ इस तरह कर सकते हैं:

c.ModifyIt("hello").MessWithIt("World").ReallyScrewWithIt("!!!"); 

यह अपने विशिष्ट वर्ग के साथ भावना जहां, चेनिंग के लिए एक की जरूरत है पूर्वानुमान कर सकते हैं तो उदाहरण वापसी बनाता है। यदि नहीं, तो आप इसे शून्य बना सकते हैं। इस का एक अच्छा उदाहरण StringBuilder वर्ग है जो आप की तरह कुछ करने के लिए अनुमति देता है: - यानी, किसी परिणाम लौटने तरीकों नहीं होना चाहिए mutators, और इसके विपरीत

myStringBuilder.Replace("!", "?").Append("Something").Remove(4,3); 
+0

"इसे दूसरी तरह से करने के बारे में अच्छी बात [...] यह है कि यह विधि श्रृंखला को अनुमति देता है"। मुझे लगता है कि आप पहली बार मतलब है। टिप्पणी के लिए खेद है, अभी तक संपादित नहीं कर सकते हैं। – PatrikAkerstrand

+0

ओह, बस मेरी पोस्ट संपादित, धन्यवाद! – BFree

6

व्यक्तिगत रूप से, मैं command-query separation पसंद करते हैं। मैं return this भीड़ के लिए तर्क को समझते हैं, यानी, "श्रृंखलन" में आसानी कॉल:

foo.ChangeThis(23).ChangeThat(45).AndAlso(67); 

लेकिन ऐसा नहीं निश्चित रूप से बहुत बुरा के रूप में

var x=foo; 
x.ChangeThis(23); x.ChangeThat(45); x.AndAlso(67); 

उन मामलों कोड करने के लिए इस बीच, के फायदे है " कमांड-क्वेरी अलगाव "(अधिकांश मामलों में, भले ही उनमें से 100% नहीं), जैसा कि उस विकीपीडा यूआरएल पर चर्चा की गई है ...

3

ऑब्जेक्ट का उदाहरण लौटने का विकल्प या निर्भर नहीं होगा स्थिति पर

विधि से लौटने वस्तु के लिए एक आम मामले में इस तरह के StringBuilder वर्ग के रूप में builder pattern में देखा जाता है,:,

new StringBuilder("Hello").Append(" ").Append("World!").ToString(); 

लेकिन सामान्य रूप में अगर इस तरह के method chaining प्रदर्शन किया जा करने के लिए नहीं जा रहा है, मैं कुछ भी वापस नहीं करना चुनना होगा। यदि सामान्य उपयोग-मामले उस वस्तु का उपयोग नहीं करना है जो लौटाया गया है (और इसे छोड़कर), जो एक अपशिष्ट प्रतीत होता है।

0

सबसे पहले, अगर आप केवल एक संपत्ति बदल रहे हैं, तो मेरे पास एक अलग संशोधन समारोह नहीं होगा; मैं सिर्फ संपत्ति को सीधे बदल दूंगा। इस तरह से, मान लीजिए कि आप कुछ अधिक जटिल का एक सरल उदाहरण दे रहे हैं, शायद संशोधन समारोह के अंदर कई अलग-अलग बदलाव।

मैं एक है कि 'क्लास' ऑब्जेक्ट का उपयोग करेंगे। यह आपको एक साथ कई कॉल श्रृंखला देता है। दोबारा, मुझे लगता है कि यह एक प्रणाली का एक साधारण उदाहरण है जो वास्तव में अधिक जटिल है; मान लीजिए इसके बजाय आपके पास मेकमोडाइफिकेशन(), मेकएन्थोडोडिफिकेशन(), और मेकैटहार्डमोडाइफिकेशन() था।, के रूप में विधि, एक mutator है इसलिए, एक नया मान वापस करने की उम्मीद नहीं है

Class c = new Class(); 
c.MakeModification().MakeAnotherModification().MakeAThirdModification(); 
0

असल में मैं दूसरी शैली पसंद करते हैं बजाय: यदि आप 'क्लास' ऑब्जेक्ट प्रदान, तो आपको निम्न वाक्यात्मक तुनुकमिज़ाजी प्राप्त कर सकते हैं वास्तविक मूल्य संशोधित होने की उम्मीद है। हालांकि आपको यह इंगित करने की आवश्यकता हो सकती है कि ModifyIt यह इंगित करने के लिए कि एक वास्तविक सी संशोधित किया जाएगा, एक रेफरी चर स्वीकार करता है। सी यहां मूल्य से गुजरता है, हालांकि यह एक संदर्भ प्रकार है, फिर भी संदर्भ के प्रकार को पारित करने और रेफरी द्वारा संदर्भ प्रकारों को पारित करने के बीच अभी भी एक अंतर है।

public void ModifyIt(Myclass c) { c = new MyClass(); } 
उपरोक्त मामले में

ग चर (यानी संदर्भ से एक प्रति पारित कर दिया और एक नव instanitiated वस्तु, जो बारी में है कि आप का मतलब है को इंगित करने के लिए संशोधित किया जाएगा मूल्य द्वारा पारित हो जाएगा: निम्न देखें इस मामले में प्रकार MyClass के दो वस्तुओं होगा यहाँ एक उदाहरण है वर्णन करने के लिए:।

Myclass s = new MyClass() { prop = "value" }; ModifyIt(s); Console.WriteLine(s.prob); // this will print "value" 

हालांकि MOdifyIT एक नई वस्तु को referenct जो कि समस्या मतलब यह होना चाहिए instanitaited अशक्त के लिए शुरू हो जाएगा, यह वास्तव में नहीं था ' टी तत्काल, यह सी की विपरीत प्रतिलिपि बना दिया अगर एसई द्वारा पारित किया गया था।
आशा है कि इससे मदद मिलती है!

1

मैं व्यक्तिगत रूप से ModifyIt जैसे फ़ंक्शन को बनाना पसंद करता हूं और इसे संभवतः कक्षा में रखता हूं जो इसे संभव बनाता है। कारण मैं कहता हूं कि दोनों तरीकों से मैं कॉलिंग वेरिएबल कारण को संशोधित कर रहा हूं क्योंकि मैं इसे संदर्भ से गुजर रहा हूं। स्वाभाविक रूप से, मैं सभी कार्यों के लिए ऐसा नहीं कर सकता, लेकिन फ़ंक्शन कॉल में रेफरी डालने से यह स्पष्ट करने में मदद मिलती है कि मैं संदर्भ द्वारा एक चर पारित कर रहा हूं, वैल्यू द्वारा वैरिएबल पास नहीं कर रहा हूं। उदाहरण:

public Class ModifyIt(ref Class c) 

क्यों? क्योंकि मैं वापस आने के लिए उत्तरदायी हूं जब मैं वापस आ गया हूं और कोड को पढ़ता हूं जिसे मैंने संदर्भ द्वारा मूल्य पारित किया है और फिर कोड के लिए कुछ "खराब" है।

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