什么时候应该使用字段而不是属性?

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

任何人都可以清楚地阐明在类设计中何时使用字段以及何时使用属性吗?

考虑:

public string Name;

或者:

private string _Name;
public string Name
{
   get { return _Name; }
   set { _Name = value; }
}

我意识到第二种方法更合适、更灵活,所以一般情况下我会尝试使用第二种方法。

但是为什么我看到人们使用第一种方法呢? 他们只是懒惰,还是在某些特定情况下这是正确的选择? 这只是一个偏好问题吗?

c# theory
8个回答
15
投票

在 C# 3.0 中你实际上可以这样写:

public string Name {get; set;}

这让你既得体又懒惰。

一般来说,有了属性,你就可以得到适当的封装。您可以选择允许设置值或获取值,或两者兼而有之。使用公共成员,您没有这个选项。

这可能是一方面的偏好,也是你的团队决定如何处理快速和肮脏的类定义的一方面,但我想说,使用 get/sets 的属性。

回答

任何人都可以清楚地阐明在类设计中何时使用属性以及何时使用属性吗?

您永远不应该使用公共属性。您应该始终使用属性。它更安全、更灵活。也就是说,人们会变得懒惰,只使用公共成员。不过,使用 C# 3.0,您可以使用更简洁的语法来定义属性,这应该可以满足您内心的懒惰。

只需输入

prop
并点击
<tab>
即可加快添加属性的惰性。


14
投票

只是对艾伦的回复的一些补充信息:

public string Name {get; set;}

相同
private string _Name;

public string Name{   
get { return _Name; }   
set { _Name = value; }
}

如果你想禁止Name的设置功能,可以有

公共字符串名称{get; 私人集;}


4
投票

属性比字段更易于维护,您可以将逻辑封装在 setter/getter 中,从而允许您隐藏实现。

它们还使重构变得更容易。

更多信息:


1
投票

除了已经给出的首选属性的原因之外,System.ComponentModel 中还有很多很酷的东西可以用于数据绑定和更改通知,这些内容仅适用于属性,而不适用于字段。例如,查看有关 PropertyChangedHandler 的文档。


0
投票

使用属性,您可以控制它的安全性:

public string Foo { protected get; private set; }

属性提供了引发事件的简单方法:

public string Foo
{
  get { return _foo; }
}
set
{
  bool cancel = false;
  if(BeforeEvent != null) // EventHandler<CancelEventArgs> BeforeEvent
  {
    CancelEventArgs e = new CancelEventArgs();
    BeforeEvent(this, e);
    cancel = e.Cancel;
  }
  if(!cancel)
  {
    _foo = value;
    if(AfterEvent != null) // EventHandler<EventArgs> AfterEvent
    {
      AfterEvent(this, new EventArgs());
    }
  }
}

我也经常使用这样的代码:

string Foo
{
  set
  {
    IsFooSet = value != null;
  }
}

bool IsFooSet
{
  get { return _isFoo; }
  set
  { 
   _isFoo = value;
   if(value) // some event raise or controls on form change
  }
}

0
投票

当您将字段公开时,您就允许用户对该字段执行他们想要执行的任何操作。 他们可以分配意外的值、无效的值、可能导致溢出的值等。

通过该属性,您可以控制是否允许为该字段设置新值、在存储该值之前修改该值、通知感兴趣的各方有关该字段值的更改等。通过吸气剂。 对于 .NET Framework 2.0 及以上版本,您可以设置 getter、setter 的访问器。 比如说,您只希望用户对该字段仅有读取访问权限,然后您将 getter 设为公开,但将 setter 设为私有或受保护。


0
投票

上面定义的属性就像 getter 和 setter。使用属性的唯一好处是您可以将其视为具有访问限制的变量。

public string Name { get; private set; }

该属性可以公开访问,但只能私下设置。 (你现在不希望任何人在未经你同意的情况下更改你的名字吧!;))


0
投票

从不同的角度来看,我喜欢Properties。

这是因为在 MS Visual Studio(2022 版本 17.10.5 至今)中默认启用 CodeLens 时会显示 Property 的引用计数,但 Field 的引用计数不会显示。

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