在Set访问器中赋值,而不是使用Value关键字

本文关键字:关键字 Value 访问 Set 赋值 | 更新日期: 2023-09-27 18:03:44

我想知道为什么这段代码工作良好,编译器不产生任何错误或警告?

class Program
{
    static int _value;
    static int MyValue
    {
        get { return _value; }
        set { _value = 5; }
    }

    static void Main()
    {
        Console.WriteLine(Program.MyValue); //This line print 0 (defoult value of int variables)and its normal 
        Program.MyValue = 10; //after calling the Set accssor we will see that
        Console.WriteLine(Program.MyValue); //The result is 5
        Console.ReadLine();
    }

这是有用的或特殊的东西吗?或者它可能是属性初始化中的技术?提前谢谢。

编辑:

似乎我们这里有一个Readonly属性默认值我对吗?

在Set访问器中赋值,而不是使用Value关键字

set-accessor就是一个带参数(value -形参)的方法。这取决于该方法做什么和不做什么。

void Set__MyValue(int value){
  _value=5;
}

代码是有效的c#,因此不会导致错误或警告。

getter和setter中的代码可以是任何东西,所以不能真正进行静态检查——即使你做了一些奇怪的事情,比如忽略传递给setter的值,这可能正是你的代码的正确之处。

由于set语句实际上只是指定完整方法(即set_MyValue(int value))的方便方式,因此适用所有函数的正常规则。特别是,如果您不想使用参数,则没有义务使用参数。

虽然您的示例是人为的,但在许多情况下忽略传入的value是有意义的。例如,假设您希望确保特定的string属性永远不为空。你可以这样做:

private string _myProp = string.Empty;
public string MyProp
{
    get
    {
        return _myProp;
    }
    set
    {
        if (value == null)
        {
            _myProp = string.Empty;
            return;
        }
        _myProp = value;
    }
}

如果我们想忽略value,则不忽略。

这段代码非常有效,在某些场景中也很有用。如果您想要在_value更改时引发事件/WPF命令,请记录该内容,并在那里做任何其他对您有意义的内容。使用这种管理方式直接设置_value会导致"静默"分配,通过属性设置_value会导致通知。

我永远不会诚实地做这样的事情,因为对于那些不真正理解你的代码的人来说,这是令人困惑和不清楚的,但顺便说一下,这也是一种"解决方案"。

问候。

该属性将在IL中转换为2个不同的方法(一个用于设置值,另一个用于返回值),并且在方法中忽略参数是有效的!

你可以使用ildasm.exe工具(Visual Studio自带的)来检查。