谁能清楚地阐明在类设计中何时使用字段以及何时使用属性?

考虑:

public string Name;

或者:

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

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

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

有帮助吗?

解决方案

好C#3.0中,你可以实际编写:

public string Name {get; set;}

,它允许你是适当的和懒惰。

一般来说,与特性,你会得到适当的封装。您可以选择是允许设置一个值,或者得到它,或两者兼而有之。使用公共成员,你没有这样的选择。

这可能是一个部分的偏好,以及一个部分你的团队决定如何处理快速和肮脏的类定义,但我要说,使用性质为GET /套。

要回答

  

当您使用属性,当类设计中使用的属性?任何人都可以清楚地说明

您不应该永远使用一个公共属性。你应该总是使用属性。它是更安全,更灵活。这就是说,人们会偷懒,只是使用一个公共成员。然而,随着C#3.0你可以使用一个更简洁的语法定义属性,它应该满足你内懒惰。

只需输入prop和命中<tab>加快懒惰中添加一个属性。

其他提示

只是一些附加信息,阿兰的回答是:

public string Name {get; set;}

是相同的

private string _Name;

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

如果您希望禁止名称的设置功能,您可以

公共字符串名称{;的私有设置;}

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

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

更多信息:

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

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
  }
}

当你让业界人士,就允许用户做任何他们想做的事到外地。它们可以分配意外的值,无效值,值,可能会导致溢出,等等。

通过属性,您对是否允许新值的设置到外地,存放,通知相关方的字段的值等的变化和返回值相同的想法之前按摩值控制通过吸气。对于从2.0了.NET框架,你可以设置的getter,setter方法的访问。也就是说,如果你只希望用户只具有读访问现场,那么你做的getter公众开放,但二传手私有或保护。

除了已经给出的理由宁愿性质,这里还有很多在System.ComponentModel很酷的东西做数据绑定和变更通知,只有与性质的作品,而不是场。例如,看周围PropertyChangedHandler的文档。

如上所定义的一样的属性的作用就像一个getter和setter。使用属性的唯一好处是,你可以把它像访问限制的一个变量。

public string Name { get; private set; }

此属性可公共访问的,但只能被私下设定。 (你不希望任何人从你同意改变你的名字,你现在可以;!))

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top