是否可以在 C# 中创建不可复制的类型
Is it possible to make an noncopyable type in C#
是否有可能在 C# 中创建一个不能被复制而只能通过引用传递的 class?
C++ 中的等效项是删除复制构造函数和复制赋值运算符。
这是默认行为。如果你有 class:
class foo {
public string bar { get; set; }
}
在某个地方你这样做:
foo f1 = new foo();
foo f2 = f1;
f1
和 f2
都将引用同一个实例。例如,如果您设置 f1.bar = "bar"
,则从 f2.bar
读取的值将是 "bar"
。
您可以创建一个内部构造函数。这样,构造函数只能从定义它的程序集中调用。
您还可以通过使用 Reflection 和 StackTrace(例如)创建更高级的逻辑,并详细控制允许创建 class 实例的人员和时间。类似的逻辑可以应用于属性,您可以在其中控制允许更改 属性 值的人。
C# 中没有析构函数,只有终结器。然而,GC 足够聪明,可以知道什么时候给定对象不再有引用,然后调用这个终结器。因此,当两个变量引用同一个对象时,只要这两个引用存在,该对象就会存在。如果两者 (!!) 都超出范围,GC 将收集要删除的对象。
是否有可能在 C# 中创建一个不能被复制而只能通过引用传递的 class?
C++ 中的等效项是删除复制构造函数和复制赋值运算符。
这是默认行为。如果你有 class:
class foo {
public string bar { get; set; }
}
在某个地方你这样做:
foo f1 = new foo();
foo f2 = f1;
f1
和 f2
都将引用同一个实例。例如,如果您设置 f1.bar = "bar"
,则从 f2.bar
读取的值将是 "bar"
。
您可以创建一个内部构造函数。这样,构造函数只能从定义它的程序集中调用。
您还可以通过使用 Reflection 和 StackTrace(例如)创建更高级的逻辑,并详细控制允许创建 class 实例的人员和时间。类似的逻辑可以应用于属性,您可以在其中控制允许更改 属性 值的人。
C# 中没有析构函数,只有终结器。然而,GC 足够聪明,可以知道什么时候给定对象不再有引用,然后调用这个终结器。因此,当两个变量引用同一个对象时,只要这两个引用存在,该对象就会存在。如果两者 (!!) 都超出范围,GC 将收集要删除的对象。