C# - 自动属性和返回支持字段之间的区别?

问题描述 投票:0回答:5

我想象的简单问题,但是这些代码行有什么区别:

代码1

public int Temp { get; set; } 

代码2

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

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

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

c# field automatic-properties
5个回答
7
投票

Code1 和 Code2 之间的主要区别在于,在 #1 中,该属性是可设置的。

您可以使用自动属性实现相同的效果,因为 setter 可以是私有的:

public int Temp { get; private set; }

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


2
投票

“automagic”属性只是一个“简写”符号:

public int Temp { get; set; } 

简单得多
public int Temp 
{   
   get { return _temp; }
   set { _temp = value; } 
}

但功能相同。只是一个很好的“速记”来提高您的工作效率,但实际上没有额外或神奇的功能。


2
投票

第一个是可写属性。

相当于

private int temp;
public int Temp { 
    get { return temp; } 
    set { temp = value; }
}

(除了不能直接使用backingfield),但它需要1行代码而不是5行代码。
当编写具有 5 或 6 个简单属性的类时,自动属性可以使类变得更短。

您可以通过写入来制作只读自动属性

public int Temp { get; }

1
投票

如果您的第二个示例同时具有 getter 和 setter,那么它们在功能上是等效的。

就目前情况而言,第一个是可公开获取的,但不能公开设置。您还可以使用自动属性实现相同的目标:

public int Temp { get; private set; }

如果您好奇,自动属性仍然有一个支持私有字段。这一点只是由编译器为你处理,这样生活就更容易了。


0
投票

我之所以使用带有支持字段的属性,是因为我想在获取或设置属性时做其他事情。例如,嵌入到属性本身的验证例程,或缓存等......

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

© www.soinside.com 2019 - 2024. All rights reserved.