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

C# 什么时候应该使用字段而不是属性?,c#,theory,C#,Theory,当您在类设计中使用字段和属性时,有人能清楚地表达出来吗 考虑: public string Name; 或: 我意识到第二种方法更合适、更灵活,所以这就是我通常尝试使用的方法 但是为什么我看到人们使用第一种方法呢?他们只是懒惰,还是在某些特定情况下这是正确的选择?这只是偏好的问题吗?在C#3.0中,您实际上可以编写: public string Name {get; set;} 这让你变得正派和懒惰 一般来说,通过属性,可以得到适当的封装。您可以选择允许设置值,或获取值,或两者兼而有之。使用

当您在类设计中使用字段和属性时,有人能清楚地表达出来吗

考虑:

public string Name;
或:

我意识到第二种方法更合适、更灵活,所以这就是我通常尝试使用的方法

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

在C#3.0中,您实际上可以编写:

public string Name {get; set;}
这让你变得正派和懒惰

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

这可能是首选项的一部分,也是您的团队决定如何处理快速脏的类定义的一部分,但我要说的是,使用get/set属性

在类设计中何时使用属性以及何时使用属性,有人能清楚地表达出来吗

你不应该使用公共属性。您应该始终使用属性。它更安全、更灵活。也就是说,人们会很懒惰,只使用一个公共成员。然而,在C#3.0中,您可以使用更简洁的语法来定义属性,这应该满足您内心的惰性


只需键入
prop
并点击
即可加快添加属性的惰性。

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

它们还使重构更容易

更多信息:


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

public string Name {get; set;}

private string _Name;

public string Name{   
get { return _Name; }   
set { _Name = value; }
}
如果要禁用Name的set函数,可以


公共字符串名称{get;privateset;}

使用属性可以控制其安全性:

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());
    }
  }
}

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


通过该属性,您可以控制是否允许对字段设置新值、在存储之前对值进行处理、通知相关方字段值的更改等,以及通过getter返回值的相同想法。对于2.0以上的.NETFramework,您可以为getter、setter设置访问器。比方说,您只希望用户对字段具有读取权限,然后将getter设置为公共,而将setter设置为私有或受保护。

除了已经给出的偏好属性的原因外,System.ComponentModel中还有很多很酷的东西,用于数据绑定和仅适用于属性的更改通知,而不是田地。例如,查看有关PropertyChangedHandler的文档。

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

public string Name { get; private set; }

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

顺便说一句,为你的私人成员使用下划线并不是.NET的一种做法。请查看将字段与属性混合在一起的示例。公共字符串名称;是公共字段而不是属性。看看这个毫无意义的说法。乔纳森·帕克评论+1。迪恩,你介意我们用正确的术语编辑这个问题吗?我编辑了它,因为我已经发布了一个错误的答案-请注意:在谈论代码时,你永远不应该说“永远不应该”。你永远不应该使用公共属性“听起来更像是个人意见,而不是技术答案
string Foo
{
  set
  {
    IsFooSet = value != null;
  }
}

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