在C#中按值传递引用类型

时间:2008-11-05 08:28:31

标签: c# reference

我想按值将引用类型传递给C#中的方法。有没有办法做到这一点。

在C ++中,如果我想通过Value传递,我总是可以依赖复制构造函数来发挥作用。在C#中有什么办法除外: 1.明确地创建一个新对象 2.实现IClonable然后调用Clone方法。

这是一个小例子:

让我们在C ++中使用A类来实现一个复制构造函数。

方法func1(Class a),我可以通过说func1(objA)来调用它(自动创建副本)

C#中是否存在类似的内容。顺便说一下,我正在使用Visual Studio 2005。

5 个答案:

答案 0 :(得分:20)

不,C#中没有等效的拷贝构造函数。您传递的内容(按值)是引用

ICloneable也有风险,因为它的定义很差,无论是深层还是浅层(加上它得不到很好的支持)。另一个选择是使用序列化,但同样可以快速绘制比预期更多的数据。

如果担心您不希望方法进行更改,您可以考虑使该类不可变。然后 nobody 可以做任何令人讨厌的事情。

答案 1 :(得分:8)

正如已经解释的那样,没有与C ++的拷贝构造函数等效的东西。

另一种技术是使用对象不可变的设计。对于不可变对象,传递引用和副本之间没有(语义)差异。这是System.String的设计方式。其他系统(特别是函数式语言)更多地应用了这种技术。

答案 2 :(得分:1)

答案 3 :(得分:1)

根据此链接(已发布): http://msdn.microsoft.com/en-us/library/s6938f28(VS.80).aspx

按值传递引用类型如下所示。 引用类型arr通过值传递给Change方法。

除非为数组分配了新的内存位置,否则任何更改都会影响原始项目,在这种情况下,更改完全是方法的本地。

class PassingRefByVal 
{
    static void Change(int[] pArray)
    {
        pArray[0] = 888;  // This change affects the original element.
        pArray = new int[5] {-3, -1, -2, -3, -4};   // This change is local.
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }

    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]);

        Change(arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]);
    }
}

最后,有关更深入的讨论,请参阅Jon Skeet在此问题中的帖子:

Passing Objects By Reference or Value in C#

答案 4 :(得分:0)

看看this

public class Product
{
   public string Name;
   public string Color;
   public string Category;

   public Product(Product o)
   {
      this.Name=o.Name;
      this.Color=o.Color;
      this.Category=o.Category;
   } 
   // Note we need to give a default constructor when override it

   public Product()
   {
   }
} 
public Product Produce(Product sample)
{
   Product p=new Product(sample);
   p.Category="Finished Product";
   return p;
}
Product sample=new Product();
sample.Name="Toy";
sample.Color="Red";
sample.Category="Sample Product";
Product p=Produce(sample);
Console.WriteLine(String.Format("Product: Name={0}, Color={1}, Category={2}", p.Name, p.Color, p.Category));
Console.WriteLine(String.Format("Sample: Name={0}, Color={1}, Category={2}", sample.Name, sample.Color, sample.Category));