Settings类(继承自ApplicationSettingsBase)中复杂Getter/Setter构造的作用是什么?
问题
我正在使用一个密封的单例Settings类,其中有如下属性定义:
public Boolean aRandomProperty { get { return (Boolean)this["aRandomProperty"]; } set { this["aRandomProperty"] = value; } }
该属性的使用方式如下:
SomeOtherVariable = Settings.Instance.aRandomProperty; Settings.Instance.aRandomProperty = true;
我认为直接定义一个公共字段也能实现相同功能:
public Boolean aRandomProperty;
想请教两个问题:
- 这种带Getter/Setter的构造比普通公共字段多了哪些额外作用?
- 我完全不理解
this["aRandomProperty"]的写法,因为代码里没定义任何索引器,且Settings类继承自System.Configuration.ApplicationSettingsBase。
回答
关于this["aRandomProperty"]的解释
你的Settings类继承的System.Configuration.ApplicationSettingsBase基类已经内置了字符串类型的索引器,所以this["aRandomProperty"]是在调用基类提供的索引器,并非你自己定义的。这个索引器是ApplicationSettingsBase框架的核心,负责和底层配置存储(比如app.config或user.config文件)交互:读取时从配置文件加载对应键的值,写入时把值暂存到内存,后续调用基类的Save()方法就能将值持久化到配置文件中。
带Getter/Setter的属性比公共字段多的作用
- 自动集成配置持久化能力:用属性的写法,赋值后调用基类
Save()即可将值写入配置文件,程序重启后仍能读取;如果用公共字段,你得手动编写读写配置文件的逻辑,完全无法利用ApplicationSettingsBase的现成机制。 - 强类型安全保障:属性明确指定
Boolean类型,强制转换只在Getter中做一次,调用方无需再处理类型转换问题;直接用基类索引器每次都要手动强转,容易出现类型错误,而公共字段虽为强类型,但无法与配置系统自动同步。 - 支持扩展逻辑:可以在Getter/Setter中添加额外逻辑,比如值的合法性校验、触发属性变更通知(实现
INotifyPropertyChanged)、记录操作日志等;公共字段只能单纯存值,无法嵌入这些自定义逻辑。 - 默认值与配置特性支持:可以给属性添加
[DefaultSettingValue]这类特性配置默认值,当配置文件中没有对应键时,ApplicationSettingsBase会自动使用默认值;公共字段只能在类初始化时赋值默认值,无法与配置系统的默认值机制联动。 - 灵活的访问权限控制:可以给Getter和Setter设置不同的访问级别,比如
public get; internal set;,让外部只能读取不能修改;公共字段的访问权限是统一的,无法分开控制读写权限。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

