15

「MyClass」(C#) のオブジェクトを Parameter-by-Value でメソッドに渡すにはどうすればよいですか? 例:

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

5 に答える 5

15

デフォルトでは、オブジェクトタイプはC#の値で渡されます。ただし、オブジェクト参照をメソッドに渡すと、オブジェクトの変更は保持されます。オブジェクトを不変にしたい場合は、クローンを作成する必要があります。

これを行うには、クラスにICloneableインターフェイスを実装します。ICloneableの使用方法の模擬例を次に示します。

public class MyClass : ICloneable
{
  private int myValue;

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

  public void object Clone()
  {
     return new MyClass(myValue);
  }
}
于 2012-06-21T16:08:31.010 に答える
8

デフォルトでは、値で渡されます。ただし、オブジェクト参照を値渡ししているため、オブジェクト内の値を引き続き編集できます。

オブジェクトがまったく変更されないようにするには、オブジェクトをメソッドに渡す前に実際に複製する必要があります。これには、元のオブジェクトのコピーである新しいインスタンスを作成し、コピーを渡す方法を実装する必要があります。

于 2012-06-21T16:05:39.620 に答える
5
public static void DontModify(MyClass a)
{
    MyClass clone = (MyClass)a.Clone();
    clone.SomeIntProperty+= 100;// Do something more meaningful here
    return;
}
于 2012-06-21T16:07:44.007 に答える
3

オブジェクトにCloneメソッドを作成して、戻り値をメソッドに渡すことができます。C#は参照型を値で渡すことができないため、これは適切な代替手段となる可能性があります。

public MyClass CreateClone()
{
    return new MyClass() { SomeIntProperty = this.SomeIntProperty };
}
于 2012-06-21T16:08:10.590 に答える