我使用的是sealed
Singleton
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[
(即使没有一堆空格(,所以我认为没有定义索引器。
使用get
和set
可以定义一个属性,而使用建议的代码(public Boolean aRandomProperty;
(可以声明一个简单字段。正如@VinayC所解释的,属性从外部看起来像字段,但被定义为代码。通过这种方式,属性隐藏了类的详细信息,并使您能够
- 允许从外部轻松访问,同时
- 使您能够灵活地在内部存储数据,以满足您的需求
特别是当我们查看您的特定示例时,后者非常重要:
public Boolean aRandomProperty
{
get
{
return (Boolean)this["aRandomProperty"];
}
set
{
this["aRandomProperty"] = value;
}
}
此属性使用基类的索引器来存储数据。在您的案例中,基类ApplicationSettingsBase
用于访问应用程序的配置。这个类提供了一个所谓的索引器,一种定义如下的特定类型的属性:
public object this[string key]
{
get
{
// Retrieve data using the key
}
set
{
// Store data using the key
}
}
这种属性允许您的类(或者在这种情况下是基类(像一样使用
var myInstance = new MyClassWithAnIndexer();
myInstance["test"] = 123;
var value = myInstance["test"];
这通常用于在事先不知道其名称/键的情况下将任意数据存储在类中。配置设置就是一个很好的例子,因为它们通常是从键值对中组合在一起的,其中键可以是任何东西。
总而言之,示例中的aRandomProperty
是一个使用基类的索引器来存储和检索值的属性。可能的原因是
- 类的调用者不需要知道键"的名称;aRandomProperty";。进入这处房产要方便得多
- 此外,调用者不能键入错误的密钥;使用该属性,如果属性名称错误,编译器将引发错误
- 所使用的特定键稍后可以在一个位置进行更改,因为类的调用方只知道该类的属性形式的公共接口
文档提供了有关属性和索引器的详细信息。
您提出的语法是C#中的一个名为字段的语法,而不是属性(getter/setter语法(。属性(如(也存在快捷语法
public Boolean aRandomAttribute { get; set; }
文档中提供了更多的语法选项。
使用属性而不是字段来定义属性的主要原因是您获得了灵活性。例如,您可以在getter/setter中进行一些行为,以产生一些副作用,或者计算依赖值,或者进行一些验证,或者通知相关方等。只读属性是通过属性语法(通过使用非公共setter(实现的。
也许,下一个问题是,为什么不先定义字段,然后在需要注入行为时更改为属性(就像您看到的当前代码一样(。然而,这是二进制级别(库消耗(的突破性变化;因此,将其定义为一种财产使其经得起未来考验。使用Complier/JIT优化,几乎没有性能损失(访问字段而不是进行getter/setter方法调用(,因为属性调用将被转换为对后台字段的直接调用。