自动实现属性的确切用途是什么?

3
也许这是一个重复的问题。我搜索了一下并参考了以下文章: 我理解的要点是:
  1. 像使字段只读一样访问;
  2. 我们可以包含一些逻辑;
  3. setter/getter 用于数据绑定。
我真正想澄清的是,
public class Employee {
    public string strName;
}

public class Employee {
    public string strName {get;set;} 
}

我的问题:

  1. 这两种实现有什么区别?
  2. 是否有任何场景可以证明需要使用自动实现属性而不是第一种实现方式?

更新:

我知道这是一个重复的问题,我已经提到了。请考虑我所问问题中的第二点。 答案是什么? 我理解不了。

如果我没有任何逻辑来设置该值,那么这是一个好习惯还是有必要的?

谢谢大家的回复。我现在明白了。由于我很新,无法掌握它。但现在我明白了。很抱歉浪费了你们的时间。


1
实际上,您在开头列出的三个要点是三件事,无法使用自动属性完成,或者至少不像完全编写的属性那样灵活或完整。 - O. R. Mapper
1
选择是自动实现属性还是手动实现属性,仅暴露成员变量是错误的。考虑在成熟的代码库中需要在设置名称周围放置一些逻辑的后果。哦,还有停止使用匈牙利命名法。 - Tony Hopkinson
@O.R.Mapper 感谢您的回复。好的,那么有没有任何地方可以证明我们需要使用 AIP 而不是普通实现,就像我在最后一部分中问的那样? - shanmugharaj
2
自动实现是一种语法糖,它只是让你不必为每个属性编写getter和setter,除此之外没有其他作用。 - Tony Hopkinson
它涵盖的是使您的接口具有鲁棒性以应对变化。将字段更改为属性不具备向后兼容性。属性被认为是公共接口最好的暴露方式。 - Dave Hillier
显示剩余2条评论
2个回答

5

通过自动实现属性,你可以做到以下几点:

public class Employee {
 public string StrName {get; private set;} 
}

创建一个外部只读、但内部可设置的属性。这是使用公共变量无法实现的。


按照惯例,公共属性不应该以大写字母开头吗? - Aniket Thakur
@AniketThakur 当然应该。我把责任归咎于年轻的自己! - Peter M
1
我认为{ get; private set; }中的private是我的秘密武器。这正是IDE0032在这种情况下试图让我不要做的事情。现在,我可以用最少的代码设置一个属性,在类内可设置,但在所有实际目的外部只读... - ruffin

2
在类中使用一个字段并不是一个好主意。使用属性可以更好地 封装您的数据,而当您只想在您的类中访问一个没有任何逻辑的字段时,则可以使用自动属性。
有很多场景,在类中使用字段会使事情变得更加困难,特别是随着软件的发展。
例如:假设您拥有一个... (原文未完)
public class C
{
    public int Value;
}

在你的代码库中。
然后突然你意识到无法将Value设置为零。那么你必须将Value设为私有,并提供一个SetValue()GetValue()方法。这很容易。但是等等,你如何处理所有依赖于Value的其他代码呢?
但是思考一下这个。
public class C
{
    public int Value { get; set; }
}

现在它只需要像 _value 这样的后备字段,并实现 settergetter

6
你的例子意义不是很明确。如果你想要一个可以公开获取/设置的属性,在这种情况下,你的例子没有给出为什么自动实现的getter/setter更好的理由。如果你最初将代码编写为属性,随后又更改为已实现的getter/setter,它仍然可以正常工作。 - Aidy J

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