重载赋值运算符时检查当前值
本文关键字:检查 赋值运算符 重载 | 更新日期: 2023-09-27 18:25:28
假设
让我们假设我们有一个这样的类…
public class SomeClass
{
public int Value { get; set; }
public static implicit operator SomeClass(int value)
{
return new SomeClass() { Value = value };
}
}
然后我们简单地使用一个任务,比如…
SomeClass mySpecialObj = 1; /* mySpecialObj.Value is now 1 */
场景
现在,如果我给一个已经有引用的对象赋值,例如
SomeClass mySpecialObj = 1; // 1st assignment
mySpecialObj = 2; // 2nd assignment
问题
在第二次赋值时,是否可以检查赋值运算符中的当前值?
public static implicit operator SomeClass(int value)
{
// can I check mySpecialObj.Value here??
}
您没有重载赋值运算符,而是创建了从int
到SomeClass
的隐式转换。这是两件截然不同的事情。
因此,mySpecialObj = 2
实际上意味着:
- 使用整数
2
创建SomeClass
的新实例 - 然后将该实例分配给变量
mySpecialObj
或者,
mySpecialObj = new SomeClass{ Value = 2};
现在应该很清楚,答案是否定的,转换操作无法知道新实例将被分配给的变量的值(如果它被分配给了变量)。
您不能在C#中执行此操作。原因是您没有重载赋值运算符,而是定义了一个隐式转换运算符,这是不一样的。
当你做这个
mySpecialObj = 2;
C#使用转换运算符的主体创建一个新的、独立的对象。当重新分配引用时,您的代码已经完成执行。您的代码无法访问所分配的变量,因为该变量不参与运算符定义的转换。事实上,你的操作符可以在任务的上下文之外使用——例如,如果你做这个
private static void Foo(SomeClass s) {
Console.WriteLine(s.Value);
}
隐式转换运算符的存在使您可以执行以下操作:
Foo(123);
现在,从123
产生的SomeClass
根本没有分配给任何变量。