属性和自动实现

she*_*enk 10 c# field properties

我在Outlook 2013的VSTO插件中使用.NET 4.5.我在完全掌握属性和访问器方面遇到了一些麻烦.我假设的自动实现的访问器就是你刚刚写的get; 组; 而不是得到{// code}等等也给我带来了麻烦.我有一本我在班上内部使用的词典.这是我的代码:

private Dictionary<string, string> clientDict { get; set; }
private Dictionary<string, string> clientHistoryDict { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后是:

clientDict = new Dictionary<string, string>();
clientHistoryDict = new Dictionary<string, string>();
Run Code Online (Sandbox Code Playgroud)

我在稍后的代码中使用与同一类中的属性相同的名称.

我从来没写过:

private Dictionary<string, string> _clientDict; // etc.
Run Code Online (Sandbox Code Playgroud)

创建我刚才直接使用属性的变量.

我尝试更改我的代码来执行此操作,我遇到了一些问题,并意识到我对属性的理解有点混乱.

以下是我需要澄清的几个问题,我似乎无法找到正确的答案.

首先,有没有理由使用私有财产?我的字典永远不会在类之外或任何派生类中访问,所以是否有理由使用属性?我不使用任何特殊的验证或setter中的任何东西或类似的东西.

其次,当我尝试更改我的代码以使用变量,然后通过像典型属性示例那样的属性访问它们时,我遇到了问题.我找到了一个getter设置的示例return _clientDict,但是setter只是set; 它给了我错误:我必须设置一个body,因为它不是抽象的或部分的.为什么在这种情况下它不会为我自动实现setter?

最后,当我在声明它的同一个类中的属性上调用new时,使用属性和相同类型的普通变量之间的区别是什么?在这种情况下,属性是否与变量完全不同?当应该使用私有变量完成时,以这种方式使用属性是不好的做法吗?

这些可能是一些误入歧途的问题,但我找不到任何其他有信息帮助我理解这些区别的地方.我一直在玩房产试图找出所有这些,但我可以使用这样的帮助.

Yuv*_*kov 11

首先,有没有理由使用私有财产?

通常,没有.属性非常适合封装.一个优点(有许多 更多)使用属性的是,它可以转让之前进行验证.当你有东西时private,你通常不需要保护自己的东西.此外,属性有设置不同访问器(的优势private,protected等等),其中字段不.

为什么在这种情况下它不会为我自动实现setter?

我们必须明白,自动实现的属性不是黑魔法.编译器将为我们生成一个私有支持字段,而不是提供一个selfelfs.从他的角度来看,他看到你有一个返回私有字段的getter,但是setter是自动的,通常会在你的代码中指出某种逻辑错误.为什么你会返回一个值,但设置一个完全不同的值?当您使用支持字段创建属性时,您必须同时提供getter和setter,这些是规则.

当我在声明它的同一个类中的属性上调用new时,使用属性和相同类型的普通变量之间的区别是什么?

从语义上讲,没什么.new属于正在构造的类型,并将发出构造函数调用.区别在于分配了新创建的对象.字段将导致编译器发出stfld操作码.对于属性,它将发出一个call调用属性setter的属性.当您访问属性时,编译器将最终调用get_YourPropertyNamevs ldfld对该字段进行调用.

当应该使用私有变量完成时,以这种方式使用属性是不好的做法吗?

我不会称之为不好的做法,但我觉得拥有私人财产有点奇怪.

有关字段和属性的更多见解,请参阅C#中字段和属性之间的区别是什么?

  • 私有财产的论点是未来变革的潜力.虽然你现在没有验证逻辑,但是你可能在将来,已经有一个属性为你提供了一个地方来改变这个逻辑,而不是每个地方的任务都在你的班级中发生,使你的类不变量更容易维护.它可能不是一个很好的*参数,特别是在所有情况下,但它*可以*帮助封装某些类型的波动性. (2认同)