0

看看这篇 Microsoft 文章How to: Write a Copy Constructor (C#)和这个Generic C# Copy Constructor,使用类实例的引用比使用实例的普通副本不是最好/安全的吗?

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

3 回答 3

3

实际上是什么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

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

于 2013-06-26T01:39:52.170 回答
1

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

您创建了一个对象并将其传递给几个类,这些类现在可以访问引用本身的地址。现在我已经拥有了所有的权力去用另一个对象的引用来改变引用本身。如果在这里,另一个类有这个对象,它实际上是在处理一些陈旧的对象,而其他类看不到正在发生什么变化,你就陷入了混乱。

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

于 2013-06-26T01:43:07.980 回答
1

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
于 2013-06-26T01:45:02.397 回答