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