Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-自动属性和返回支持字段之间的区别?_C#_Field_Automatic Properties - Fatal编程技术网

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

C#-自动属性和返回支持字段之间的区别?,c#,field,automatic-properties,C#,Field,Automatic Properties,我想这是一个简单的问题,但这些代码行之间的区别是什么: 代码1 public int Temp { get; set; } 及 代码2 private int temp; public int Temp { get { return temp; } } 我的理解是,根据代码1的自动属性将执行与代码2完全相同的功能 我在读《头先C#》,我发现很难理解为什么它使用两种不同的方法来做同一件事 第一个是可写属性 相当于 private int temp; public int Temp {

我想这是一个简单的问题,但这些代码行之间的区别是什么:

代码1

public int Temp { get; set; } 

代码2

private int temp;
public int Temp { get { return temp; } }
我的理解是,根据代码1的自动属性将执行与代码2完全相同的功能


我在读《头先C#》,我发现很难理解为什么它使用两种不同的方法来做同一件事

第一个是可写属性

相当于

private int temp;
public int Temp { 
    get { return temp; } 
    set { temp = value; }
}
(除了不能直接使用backingfield),但它需要1行代码而不是5行代码。
编写具有5个或6个简单属性的类时,自动属性可以使类更短

您可以通过写入来创建只读自动属性

public int Temp { get; private set; }

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

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

public int Temp { get; private set; }
自动属性是在C#3中添加的,对于使用字段的较长版本来说,它实际上只是一种语法糖。如果不需要直接访问字段,则没有理由不使用自动属性。自动属性等同于使用字段-编译器为您生成字段,它只是在代码中不可访问。

自动属性只是一种“简写”符号:

public int Temp { get; set; } 
只是打字比

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

但在功能上是等效的。只是一个很好的“速记”来提高您的生产力,但实际上没有额外的或神奇的功能。

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

目前,第一个是可以公开获取的,但不能公开设置。您还可以使用“自动属性”实现相同的功能:

public int Temp { get; private set; }

如果你好奇的话,自动属性仍然有一个支持的私有字段。编译器会为您处理该位,这样生活会更轻松。

至于为什么我会将属性与支持字段一起使用,是因为我在获取或设置属性时需要执行其他操作。例如,嵌入属性本身的验证例程或缓存等


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

我明白了,因此尝试设置此属性只会导致它返回backing字段?是的,auto属性创建了一个字段,但您不必将代码与它和“private set”混在一起确保没有外部用法可以更改该字段。我想我在这里可能有点厚,但当您实际尝试为其赋值时,为什么要返回值?因此,如果我在某个地方使用了代码2,并且使用了“Temp=2”,那么该返回值去哪里了?@t84,不,setter从不返回任何东西(当它是私有的时候,您可以使用它在类内进行设置。它不能从类外进行设置-如果您尝试这样做,您将得到一个编译错误)。啊哈,刚刚单击的东西,谢谢:)我感到困惑,认为“返回温度”是“设置”的一部分,实际上它只是“获取”的一个补充。谢谢你的解释-非常有用!