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

时间:2009-03-13 06:00:17

标签: c# theory

当你使用字段以及何时在类设计中使用属性时,任何人都可以清楚地表达出来吗?

考虑:

public string Name;

或者:

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

我意识到第二种方法更加合理和灵活,所以我通常会尝试使用它。

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

7 个答案:

答案 0 :(得分:15)

在C#3.0中你可以写一下:

public string Name {get; set;}

这让你变得适当和懒惰。

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

这可能只是一部分偏好,而且是你的团队如何决定处理快速和脏类定义的一部分,但我会说,使用属性来获取/设置。

回答

  

当你使用属性以及何时在类设计中使用属性时,任何人都可以清楚地表达出来吗?

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

只需输入prop并点击<tab>即可加快添加属性时的懒惰。

答案 1 :(得分:14)

Alan的回复中还有一些其他信息:

public string Name {get; set;}

相同
private string _Name;

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

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

public string Name {get; 私有设置;}

答案 2 :(得分:3)

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

它们也使重构更容易。

更多信息:

答案 3 :(得分: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
  }
}

答案 4 :(得分:0)

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

使用该属性,您可以控制是否允许在字段中设置新值,在存储之前按摩该值,通知感兴趣的各方有关字段值的更改等。并且返回值的想法相同通过吸气剂。对于2.0以上的.NET框架,您可以设置getter,setter的访问器。比如,您只希望用户只对该字段具有读取权限,然后将getter公之于众,但将setter设为私有或受保护。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

public string Name { get; private set; }

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