C#构造函数,是否通过引用

本文关键字:引用 是否 构造函数 | 更新日期: 2023-09-27 18:19:50

看看这篇Microsoft文章如何:编写一个复制构造函数(C#)和这个通用C#复制构造函数,使用对类实例的引用不是比使用实例的纯副本更好/更安全吗?

public class Myclass()
{
    private int[] row;
    public MyClass(ref MyClass @class)
    {
        for(int i = 0; i<@class.row.Length;i++)
        {
            this.row[i] = @class.row[i];
        }
    }
}

C#构造函数,是否通过引用

ref的实际含义:

void Change(SomeClass instance)
{
    instance = new SomeClass();
}
void ChangeRef(ref SomeClass instance)
{
    instance = new SomeClass();
}

稍后。。。

SomeClass instance = new SomeClass();
Change(instance);
//value of instance remains unchanged here
ChangeRef(ref instance);
//at this line, instance has been changed to a new instance because
//ref keyword imports the `instance` variable from the call-site's scope

我看不出这个功能对复制构造函数有什么用处。

对象本质上是引用,而不是值类型。我看不出有什么好的理由让你这样做会获得什么额外的优势。但是的,你可能会因此而遇到问题,考虑一下这个-

您创建了一个对象,并将它与引用一起传递给两个类,这些类现在可以访问引用本身的地址。现在我有了所有的权力去改变引用本身与另一个对象的引用。如果在这里,另一个类有这个对象,那么它实际上正在处理一些过时的对象,而其他类看不到正在进行的更改,你就陷入了混乱。

我认为这样做没有任何用处,反而很危险。对我来说,这听起来不像是一种OO编写代码的方式。

当应该允许方法更改引用的位置时,会使用ref关键字。引用类型总是将其引用传递到方法中(但不能通过赋值修改引用的位置)。值类型传递其值。

参见:通过参数

示例:

void PassingByReference(List<int> collection)
{
    // Compile error since method cannot change reference location
    // collection = new List<int>();
    collection.Add(1);
}
void ChangingAReference(ref List<int> collection)
{
    // Allow to change location of collection with ref keyword
    collection = new List<int>();
    collection.Add(2);
}
var collection = new List<int>{ 5 };
// Pass the reference of collection to PassByReference
PassingByReference(collection);
// collection new contains 1
collection.Contains(5); // true
collection.Contains(1); // true
// Copy the reference of collection to another variable
var tempCollection = collection;
// Change the location of collection via ref keyword
ChangingAReference(ref collection);
// it is not the same collection anymore
collection.Contains(5); // false
collection.Contains(1); // false
// compare the references use the default == operator
var sameCollection = collection == tempCollection; // false