C# - 自动属性和返回备份字段的区别是什么?

3

我想这是一个简单的问题,但是下面这两行代码有什么区别:

代码1

public int Temp { get; set; } 

and

Code 2

private int temp;
public int Temp { get { return temp; } }

我理解的是,按照代码1的自动属性应该执行与代码2完全相同的功能?

我正在阅读《Head First C#》,我发现很难理解为什么要使用两种不同的方式来完成同样的事情?

5个回答

7
你的Code1和Code2之间的主要区别在于#1中的属性是可设置的。
你可以使用自动属性来实现相同的功能,因为setter可以是私有的:
public int Temp { get; private set; }

自动属性是在C#3中添加的,它只是使用字段的更长版本的语法糖。如果您不需要直接访问该字段,则没有理由不使用自动属性。自动属性等同于使用字段 - 编译器为您生成字段,但不能在代码中访问。

我明白了,所以尝试设置该属性只会导致返回后备字段,是吗? - JuniorDeveloper1208
是的,自动属性会创建一个字段,但您不必在代码中使用它,并且“private set”可以确保没有外部使用可以更改该字段。 - David Mårtensson
我觉得我可能有点笨,在你试图赋值的时候,为什么要返回一个值呢?所以如果我使用代码2并在某个地方使用“Temp = 2”,那么这个返回值会去哪里? - JuniorDeveloper1208
@t84,不,setter从不返回任何内容(您可以在类内部设置私有属性。它无法从类外部设置 - 如果尝试这样做,将会出现编译错误)。 - driis
啊哈,我突然明白了,谢谢 :) 我之前有些困惑,以为“return temp”是“set”的一部分,实际上它只是“get”的一个补充。 - JuniorDeveloper1208

2
第一个是可以写入的属性。
它相当于:
private int temp;
public int Temp { 
    get { return temp; } 
    set { temp = value; }
}

(除了不能直接使用后备字段外),但只需要一行代码,而不是五行。


当编写具有5或6个简单属性的类时,自动属性可以使类更短。

您可以通过编写以下内容来创建只读自动属性

public int Temp { get; private set; }

2
"自动化"属性只是一种"简写"表示法:"
public int Temp { get; set; } 

is just a lot simpler to type than

public int Temp 
{   
   get { return _temp; }
   set { _temp = value; } 
}

但从功能上来说是等效的。它只是一个方便缩写,可以提高你的生产力,但没有额外或神奇的功能。

1
如果您的第二个示例同时具有getter和setter,则它们在功能上是等效的。
目前,第一个示例可以公开获取但无法公开设置。您也可以使用自动属性来实现相同的效果:
public int Temp { get; private set; }

如果你好奇的话,自动属性仍然会有一个支持私有字段。这一部分只是由编译器为您处理,以使生活更轻松。


0

关于为什么我会使用带有后备字段的属性,是因为当我想在获取或设置属性时执行其他操作时。例如,将验证例程嵌入到属性本身中,或进行缓存等操作...

否则,对于简单的获取和设置,我会使用自动属性格式。它更紧凑,涉及的编码较少,我认为这是一件好事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接