10

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

考虑:

public string Name;

或者:

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

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

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

4

7 回答 7

15

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

public string Name {get; set;}

这可以让你变得适当和懒惰。

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

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

回答

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

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

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

于 2009-03-13T06:05:39.553 回答
14

艾伦回复的一些附加信息:

public string Name {get; set;}

是相同的

private string _Name;

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

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

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

于 2009-03-13T06:17:44.830 回答
3

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

它们还使重构更容易。

更多信息:

于 2009-03-13T06:10:09.480 回答
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
  }
}
于 2009-03-13T08:56:27.333 回答
0

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

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

于 2009-03-13T09:13:54.063 回答
0

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

于 2009-03-13T10:44:21.413 回答
0

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

public string Name { get; private set; }

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

于 2014-05-29T18:03:16.923 回答