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_YourPropertyName
vs ldfld
对该字段进行调用.
当应该使用私有变量完成时,以这种方式使用属性是不好的做法吗?
我不会称之为不好的做法,但我觉得拥有私人财产有点奇怪.
有关字段和属性的更多见解,请参阅C#中字段和属性之间的区别是什么?