15

如何通过 Parameter-by-Value 将“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

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 回答
0
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

于 2015-01-29T19:03:43.437 回答