我想象的简单问题,但这些代码行之间有什么区别:
代码 1
public int Temp { get; set; }
和
代码 2
private int temp;
public int Temp { get { return temp; } }
我的理解是,根据代码 1 的自动属性将执行与代码 2 完全相同的功能?
我正在阅读 Head First C#,我发现很难理解为什么它使用两种不同的方式来做同样的事情?
我想象的简单问题,但这些代码行之间有什么区别:
代码 1
public int Temp { get; set; }
和
代码 2
private int temp;
public int Temp { get { return temp; } }
我的理解是,根据代码 1 的自动属性将执行与代码 2 完全相同的功能?
我正在阅读 Head First C#,我发现很难理解为什么它使用两种不同的方式来做同样的事情?
Code1 和 Code2 之间的主要区别在于,在 #1 中,该属性是可设置的。
您可以使用自动属性来实现相同的目的,因为 setter 可以是私有的:
public int Temp { get; private set; }
自动属性是在 C#3 中添加的,实际上只是使用字段的较长版本的语法糖。如果您不需要直接访问该字段,则没有理由不使用自动属性。自动属性等同于使用字段 - 编译器为您生成字段,只是无法在代码中访问。
第一个是可写属性。
相当于
private int temp;
public int Temp {
get { return temp; }
set { temp = value; }
}
(除了你不能直接使用 backingfield),但它需要 1 行代码而不是 5 行。
当编写具有 5 或 6 个简单属性的类时,自动属性可以使类更短。
您可以通过编写使只读自动属性
public int Temp { get; private set; }
“自动”属性只是一个“速记”符号:
public int Temp { get; set; }
比打字简单得多
public int Temp
{
get { return _temp; }
set { _temp = value; }
}
但功能相当。只是一个很好的“速记”来提高您的生产力,但实际上没有额外的或神奇的功能。
如果您的第二个示例同时具有 getter 和 setter,那么它们在功能上是等效的。
就目前而言,第一个是公开的,但不能公开设置。您也可以使用自动属性来实现相同的目的:
public int Temp { get; private set; }
如果你好奇,自动属性仍然有一个支持的私有字段。该位只是由编译器为您处理,因此生活更轻松。
至于我将属性与支持字段一起使用的原因是当我想要在获取或设置属性时做其他事情时。例如,嵌入到属性本身的验证例程,或缓存等......
否则,对于简单的获取和设置,我会使用自动属性格式。它更紧凑,涉及的编码更少,我认为这是一件好事。