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

C# 在C中按值传递引用类型#,c#,reference,C#,Reference,我想通过值将引用类型传递给C#中的方法。有办法吗 在C++中,如果我想通过值,我可以始终依赖复制构造函数来发挥作用。在C#中是否有其他方法,除了: 1.显式创建新对象 2.实现IClonable,然后调用Clone方法 下面是一个小例子: 让我们用C++实现一个复制构造函数类。 方法func1(类A),我可以通过说func1(objA)来调用它(自动创建副本) C#中是否存在类似的情况。顺便说一句,我使用的是Visual Studio 2005。如前所述,没有与C++的复制构造函数等价的东西 另

我想通过值将引用类型传递给C#中的方法。有办法吗

在C++中,如果我想通过值,我可以始终依赖复制构造函数来发挥作用。在C#中是否有其他方法,除了: 1.显式创建新对象 2.实现IClonable,然后调用Clone方法

下面是一个小例子:

让我们用C++实现一个复制构造函数类。 方法func1(类A),我可以通过说func1(objA)来调用它(自动创建副本)


C#中是否存在类似的情况。顺便说一句,我使用的是Visual Studio 2005。

如前所述,没有与C++的复制构造函数等价的东西


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

不,C#中没有复制构造函数。您(通过值)传递的是引用

ICloneable
也有风险,因为它对深度和浅层的定义很差(另外,它也没有得到很好的支持)。另一种选择是使用序列化,但同样,它可以快速地提取比预期多得多的数据

如果你不想让这个方法发生变化,你可以考虑让这个类不可变。那就没人能对它做什么坏事了。

看看

根据此链接(已发布):

按值传递引用类型如下所示。 引用类型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在这个问题上的帖子:

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]);
    }
}