在Set accssor中分配一个值而不是使用value关键字

问题描述 投票:0回答:5

我想知道为什么这段代码工作正常并且编译器没有生成任何错误或警告?

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();
    }

这有什么有用或特别的东西吗?或者它可能是属性初始化中的一种技术?预先感谢。

编辑: 看来我们这里有一个具有默认值的只读属性我说得对吗?

c# properties initialization
5个回答
2
投票

set-accessor 只不过是一个带有参数的方法,即“value”参数。这取决于方法它做什么和不做什么。

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

1
投票

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

getter 和 setter 中的代码可以是任何内容,因此无法真正进行静态检查 - 即使您做了一些奇怪的事情,例如忽略传递给 setter 的值,这可能正是您的代码的正确选择。


1
投票

由于

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
,否则就不会。


0
投票

这段代码非常有效,并且在某些情况下也很有用。如果您想在

_value
更改时引发事件/WPF 命令,请记录该内容,并在那里执行任何其他对您有意义的操作。 让这种管理直接设置
_value
将导致“静默”分配,通过属性设置此
_value
可以引起通知。

我永远不会诚实地做这样的事情,因为对于那些不真正理解你的代码的人来说,这很混乱并且不清楚,但顺便说一句,这也是一种“解决方案”。

问候。


0
投票

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

您可以使用工具

ildasm.exe
(Visual Studio 附带)来检查。

© www.soinside.com 2019 - 2024. All rights reserved.