2012-06-21 7 views
6

पर मूल्य से पास करें मैं पैरामीटर-बाय-वैल्यू द्वारा विधि में "MyClass" (C#) की ऑब्जेक्ट कैसे पास कर सकता हूं? उदाहरण:सी #

MyClass obj = new MyClass(); 
MyClass.DontModify(obj); //Only use it! 
Console.Writeline(obj.SomeIntProperty); 

...

public static void DontModify(MyClass a) 
{ 
    a.SomeIntProperty+= 100;// Do something more meaningful here 
    return; 
} 
+4

लोगों को एक 'struct' उपयोग करने के लिए आपको बता सकता है: यहाँ ICloneable कैसे उपयोग करने के लिए की एक नकली उदाहरण है। मत करो। – SLaks

+0

डाउनलोड: (क्लोन एक्सटेंशन) nuget से। यह सी # ऑब्जेक्ट को GetClone() विधि के साथ बढ़ाएगा जो फ़्लैग स्वीकार करता है जहां आप यह इंगित करने के लिए उपयोग कर सकते हैं कि आप एक उथली प्रतिलिपि चाहते हैं। https://www.nuget.org/packages/CloneExtensions/1.2.0 – alsafoo

उत्तर

9

डिफ़ॉल्ट ऑब्जेक्ट प्रकार C# में मान द्वारा पारित किए जाते हैं। लेकिन जब आप एक विधि में ऑब्जेक्ट संदर्भ पास करते हैं, तो ऑब्जेक्ट में संशोधन जारी रहेगा। यदि आप अपनी ऑब्जेक्ट को अतुलनीय बनाना चाहते हैं, तो आपको क्लोन की आवश्यकता है।

ऐसा करने के लिए, अपनी कक्षा में ICloneable इंटरफ़ेस को लागू करें।

public class MyClass : ICloneable 
{ 
    private int myValue; 

    public MyClass(int val) 
    { 
    myValue = val; 
    } 

    public void object Clone() 
    { 
    return new MyClass(myValue); 
    } 
} 
+2

दुर्भाग्य से आईसीएलएबल योग्य परिभाषित नहीं करता है कि यह एक गहरी या उथली प्रतिलिपि है या नहीं। आप समाप्त हो सकते हैं (कक्षाओं का उपयोग करते समय आपने स्वयं को नहीं लिखा था) अभी भी लाइन के नीचे संदर्भों की प्रतिलिपि बना रहे हैं। और जैसा कि यह जेनेरिकों की भविष्यवाणी करता है, आईसीएलनेबल एक ऑब्जेक्ट देता है, इसलिए आपको कास्ट करने की ज़रूरत है ... पूरी चीज बदसूरत है। – linac

+2

आप 'क्लोन' विधि में 'वापसी सदस्यwiseक्लोन();' लिख सकते हैं। –

+0

मुझे लगता है कि उपयोगकर्ता को क्लोन करने की आवश्यकता है नमूना कोड पढ़कर एक बिक्री-लिखित कक्षा है। इस मामले में आप एक नई वस्तु बनाकर क्लोन को नियंत्रित कर सकते हैं। बेशक यदि आवश्यक हो तो आपको एम्बेडेड प्रकारों को क्लोन करना होगा। –

4

डिफ़ॉल्ट रूप से, यह मान द्वारा पारित कर दिया है। हालांकि, आप मूल्य के अनुसार ऑब्जेक्ट संदर्भ पास कर रहे हैं, जिसका अर्थ है कि आप अभी भी ऑब्जेक्ट के भीतर मान संपादित कर सकते हैं।

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

2
public static void DontModify(MyClass a) 
{ 
    MyClass clone = (MyClass)a.Clone(); 
    clone.SomeIntProperty+= 100;// Do something more meaningful here 
    return; 
} 
1

आप अपनी विधि पर वापसी मूल्य पारित करने के लिए अपनी ऑब्जेक्ट पर क्लोन विधि बना सकते हैं। सी # संदर्भ प्रकार को मूल्य से पास नहीं कर सकता है, इसलिए यह एक अच्छा विकल्प हो सकता है।

public MyClass CreateClone() 
{ 
    return new MyClass() { SomeIntProperty = this.SomeIntProperty }; 
} 
1
class Program 
{ 
    static void Main(string[] args) 
    { 
     Person p1 = new Person() 
     { 
      Name = "Alsafoo", 
      Address = new Address() 
      { 
       City = "Chicago" 
      } 
     }; 

     Person p2 = new Person(p1.Address); 
     p2 = p1.GetClone(CloningFlags.Shallow); 
     p2.Name = "Ahmed"; 
     p2.Address = new Address(){City = "Las Vegas"}; 
     Console.WriteLine("p1 first name: {1} --- p1 city: {2} {0}p2 first name: {3} ---- p2 city: {4}", 
      Environment.NewLine, p1.Name, p1.Address.City, p2.Name, p2.Address.City); 
     Console.ReadKey(); 
    } 
} 
public class Person 
{ 
    public Person() 
    {} 
    public Person(Address a) 
    { 
     Address = a; 
    } 
    public string Name { get; set; } 
    public Address Address { get; set; }   
} 

public class Address 
{ 
    public string City { get; set; } 
} 

डाउनलोड इस विस्तार https://www.nuget.org/packages/CloneExtensions/1.2.0