重载赋值运算符时检查当前值

本文关键字:检查 赋值运算符 重载 | 更新日期: 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??
}

重载赋值运算符时检查当前值

您没有重载赋值运算符,而是创建了从intSomeClass的隐式转换。这是两件截然不同的事情。

因此,mySpecialObj = 2实际上意味着:

  1. 使用整数2创建SomeClass的新实例
  2. 然后将该实例分配给变量mySpecialObj

或者,

mySpecialObj = new SomeClass{ Value = 2};

现在应该很清楚,答案是否定的,转换操作无法知道新实例将被分配给的变量的值(如果它被分配给了变量)。

您不能在C#中执行此操作。原因是您没有重载赋值运算符,而是定义了一个隐式转换运算符,这是不一样的。

当你做这个

mySpecialObj = 2;

C#使用转换运算符的主体创建一个新的、独立的对象。当重新分配引用时,您的代码已经完成执行。您的代码无法访问所分配的变量,因为该变量不参与运算符定义的转换。事实上,你的操作符可以在任务的上下文之外使用——例如,如果你做这个

private static void Foo(SomeClass s) {
    Console.WriteLine(s.Value);
}

隐式转换运算符的存在使您可以执行以下操作:

Foo(123);

现在,从123产生的SomeClass根本没有分配给任何变量。