【问题标题】:What's happening when you use properties without a private field当您使用没有私有字段的属性时会发生什么
【发布时间】:2014-11-13 07:11:16
【问题描述】:

我试图帮助我的朋友理解诸如字段和属性以及 getter/setter 之类的东西。然后他使用了没有私有字段的属性,并告诉我它有效。我什至不知道这是可能的,而且似乎在网上找不到太多关于它的信息。

举个例子:

public int Number { get; set; }

代替:

private int number;
public int Number
{
   get { return number; }
   set { number = value; }
}

它似乎有效(据我所知),但现在我有以下问题:

  • 幕后发生了什么?
  • 首选哪种方式?
  • 有什么优点/缺点吗?

编辑:

我一直认为 { get;放; } 与 get { return x; 相同} 设置 { x = 值; }。哦,很好,我现在知道了。然而,问题仍然是一样的。一个被认为比另一个更好吗?优点/缺点?

【问题讨论】:

  • 与第二个代码块的方式完全相同,private int numberpublic int Number { get; set; } 完全不同。
  • 您可能正在考虑拥有private int number;public int Number { get { return number; } set { number = value; } }
  • 我建议您阅读 Auto Properties 和 Getters & Setters.. 为您自己以及您的“朋友”
  • Auto-Implemented Properties: the compiler creates a private, anonymous backing field
  • 回答你的尾随问题(我之前的评论/链接是错误的复制/粘贴)stackoverflow.com/questions/8116951/…

标签: c# properties field


【解决方案1】:

在第一种情况下,编译器会自动创建一个私有字段作为属性的后备存储,为其命名在用户代码中无法访问,并创建获取和设置其值的方法。

在您的代码中,您需要花时间明确地执行此操作,并在该支持字段的类范围内创建一个有效标识符,这与前面的示例不同。

【讨论】:

  • 它从不在任何地方使用,因为它只是一个类中的那一段代码。我可以对其进行编辑,以便在某处使用它,但这与问题并没有真正的关系,因为它是关于属性 + 私有字段而不是属性而不是围绕它的代码。
  • @anthonytimmers 好吧,在您展示的代码中,您正在创建两个不同的字段,但您并没有创建具有显式后备存储的属性。正如我所说,设置属性不会设置该字段,并且获取属性的值不会获取字段的值。你有两个领域。如果任何其他代码访问该字段(而不是属性),则它不会影响或受使用该属性的代码影响,反之亦然。
  • 会接受这个作为答案。只是想知道,所以使用自动实现的属性的唯一缺点是你不能指定你的 getter 和 setter 需要读/写什么?
  • @anthonytimmers 如果您需要在 getter 或 setter 中执行与自动生成的属性自动生成的内容不同的操作,那么您不能使用自动生成的属性;没错。
  • 好的,感谢您的澄清和回答。再一次,很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2013-12-27
  • 2014-05-27
  • 2016-09-15
  • 2016-06-04
相关资源
最近更新 更多