在设置类中,这种困难的获取者和二传手构造有什么意义?



我使用的是sealedSingletonSettings类,在其中我发现了以下属性定义:

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[(即使没有一堆空格(,所以我认为没有定义索引器。

使用getset可以定义一个属性,而使用建议的代码(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方法调用(,因为属性调用将被转换为对后台字段的直接调用。

最新更新