属性和自动实现

本文关键字:实现 属性 | 更新日期: 2023-09-27 17:50:37

我在outlook 2013的VSTO插件中使用。net 4.5。我在完全掌握属性和访问器方面遇到了一些麻烦。自动实现的访问器我假设是当你写get时;设置;而不是get {//code}等也给我带来麻烦。我有一本字典,我在班上内部使用。下面是我的代码:

private Dictionary<string, string> clientDict { get; set; }
private Dictionary<string, string> clientHistoryDict { get; set; }

then later:

clientDict = new Dictionary<string, string>();
clientHistoryDict = new Dictionary<string, string>();

我在后面的代码中使用与属性相同的名称,在同一个类中。

我从来没有真正写过:

private Dictionary<string, string> _clientDict; // etc.

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

我试着修改我的代码来做到这一点,我遇到了一些问题,并意识到我对属性的理解有点混乱。

这里有几个问题我需要澄清,我似乎找不到正确的答案。

首先,是否有理由使用私有属性?我的字典从来没有在类之外或任何派生类中访问过,所以有理由使用属性吗?我没有在setter中使用任何特殊验证之类的东西。

第二,当我试图改变我的代码来使用变量,然后通过属性访问它们,就像你典型的属性示例一样,我遇到了问题。我发现了一个例子,其中getter被设置为return _clientDict,但setter只是set;。它给了我一个错误:我必须给set一个主体,因为它不是抽象的或部分的。为什么它不能在这个实例中为我自动实现setter ?

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

这些可能是一些误导的问题,但我找不到任何其他地方有信息来帮助我理解这些区别。我一直在摆弄属性,试图弄清楚所有这些,但我可以使用我的帮助。

属性和自动实现

首先,是否有理由使用私有属性?

通常没有。属性非常适合封装。使用属性的一个优点(还有更多)是它可以在赋值之前进行验证。当你有一些private时,你通常不需要来保护自己的东西。此外,属性还具有设置不同访问器(privateprotected等)的优势,而字段则不能。

为什么它不能在这个实例中为我自动实现setter ?

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

当我在它所在的同一个类的属性上调用new时声明,这和属性有什么区别同类型的正态变量呢?

语义,new属于正在构造的类型,并将发出构造函数调用。不同之处在于,一旦新创建的对象被赋值为。字段将导致编译器发出stfld操作码。对于一个属性,它将发出一个call来调用属性设置器。当你访问属性时,编译器最终会在字段上调用get_YourPropertyNameldfld

在应该使用属性的时候使用它是不好的做法吗完成了私有变量吗?

我不会说这是不好的做法,但我觉得有一个私有属性有点奇怪。

有关字段和属性的更多信息,请参见c#中字段和属性的区别是什么?

是否有理由使用私有属性?

不——这就是自动实现的全部意义。当你想要做的只是获取或设置私有成员变量中的内容时,它节省了你编写所有额外代码的时间。net在幕后处理遮蔽私有成员变量的创建。

当我试图改变我的代码来使用变量,然后通过属性访问它们,就像你典型的属性示例一样,我遇到了问题。我发现了一个例子,其中getter被设置为返回_clientDict,但setter只是设置;它给了我一个错误:我必须给集合一个主体,因为它不是抽象的或部分的。为什么它不能在这个实例中为我自动实现setter ?

我的理解是,自动实现要么全有,要么全无。(但这一点可以纠正)。也就是说,我见过用简单定义为set { }的set块编译代码。编辑:只是为了澄清set { }块实际上不会设置值,它本质上是吞下调用而不做任何事情-它将编译。

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

据我所知,没有真正的区别。完全相同的事情正在发生,只是。net正在为您处理管道。