如何通过Parameter-by-Value将"MyClass"(C#)的对象传递给方法?例:
MyClass obj = new MyClass();
MyClass.DontModify(obj); //Only use it!
Console.Writeline(obj.SomeIntProperty);
Run Code Online (Sandbox Code Playgroud)
...
public static void DontModify(MyClass a)
{
a.SomeIntProperty+= 100;// Do something more meaningful here
return;
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*lba 10
默认情况下,对象类型在C#中按值传递.但是,当您将对象引用传递给方法时,对象中的修改将保持不变.如果您希望对象不可变,则需要克隆它.
要做到这一点,请在您的类中实现ICloneable接口.这是一个如何使用ICloneable的模拟示例:
public class MyClass : ICloneable
{
private int myValue;
public MyClass(int val)
{
myValue = val;
}
public void object Clone()
{
return new MyClass(myValue);
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,它是按值传递的。但是,您是按值传递对象引用,这意味着您仍然可以编辑对象内的值。
为了防止对象根本无法更改,您需要在将其传递到您的方法之前实际克隆该对象。这将要求您实现一些创建新实例的方法,该实例是原始对象的副本,然后传入该副本。
public static void DontModify(MyClass a)
{
MyClass clone = (MyClass)a.Clone();
clone.SomeIntProperty+= 100;// Do something more meaningful here
return;
}
Run Code Online (Sandbox Code Playgroud)