gpt4 book ai didi

c# - 属性和自动实现

转载 作者:可可西里 更新时间:2023-11-01 09:04:05 28 4
gpt4 key购买 nike

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

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

然后:

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

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

我从来没有写过:

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

创建变量我只是直接使用属性。

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

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

首先,有没有理由使用私有(private)属性(property)?我的字典永远不会在类之外或任何派生类中访问,所以有理由使用属性吗?我不使用任何特殊验证或 setter 中的任何东西或类似的东西。

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

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

这些可能是一些被误导的问题,但我找不到任何其他地方有信息来帮助我理解这些区别。我一直在尝试使用属性来尝试解决所有这些问题,但我需要一些帮助。

最佳答案

First, is there any reason to use a private property?

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

Why would it not auto-implement the setter for me in this instance?

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

when I call new on the properties in the same class that it is declared in, what is the difference between doing that with a property and a normal variable of the same type?

在语义上,没有new 属于正在构造的类型,将发出构造函数调用。不同之处在于一旦新创建的对象被分配。字段将导致编译器发出 stfld 操作码。对于一个属性,它将发出一个 call 来调用属性 setter 。当您访问一个属性时,编译器将最终调用 get_YourPropertyName 与字段上的 ldfld

Is it bad practice to use properties this way when it should be accomplished with private variables?

我不会称之为不好的做法,但我会觉得拥有私有(private)属性(property)有点奇怪。

有关字段和属性的更多见解,请参阅 What is the difference between a Field and a Property in C#?

关于c# - 属性和自动实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30441404/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com