C#中能否为属性set方法添加额外操作而无需定义私有变量?
嘿,这个问题问得特别到位!很多刚上手C#属性的开发者都会纠结这个——为啥明明有自动属性的语法糖,加个自定义逻辑就得回到写私有字段的老路子?
先给你一个明确的答案:目前在C#里,如果你想在set访问器里加入自定义操作(比如调用DoSomething()),就必须显式声明私有字段。原因其实很简单:
自动属性{ get; set; }本质是编译器帮你做的“偷懒”语法糖——它会偷偷生成一个你看不到的幕后私有字段,以及对应的默认get/set逻辑。但一旦你自定义了get或者set中的任何一个,编译器就会停止自动生成这个幕后字段了:因为它不知道你要怎么处理属性值的存储逻辑,总不能瞎猜对吧?
所以你一开始写的那种带私有字段的写法,其实是目前实现需求的标准方式。当然,在C# 6及以后的版本里,你可以用表达式体让代码更简洁一点:
private string _privateProperty; public string PublicProperty { get => _privateProperty; set { DoSomething(); _privateProperty = value; } }
如果你嫌手动写私有字段麻烦,也可以借助一些第三方工具来简化,比如Fody的PropertyChanged插件——它能通过代码注入的方式,帮你自动生成私有字段和属性变化时的逻辑,让你能像写自动属性一样轻松加自定义操作。不过这属于额外工具,不是C#原生语法支持的。
至于你写的那段伪代码,目前C#还不支持这种混合写法——没办法既让编译器帮你生成幕后字段,又让你自定义set里的逻辑。
内容的提问来源于stack exchange,提问作者Daniel Müller
相关产品推荐
相关产品推荐

