b / w公共变量和公共汽车属性有什么区别

时间:2012-05-15 06:32:54

标签: c#

  

可能重复:
  Difference between Property and Field in C#

我知道这是一个非常基本的问题但我在搜索后无法阅读任何有效答案

E.g

public string abc;

public string abc { get; set; }

请描述一下。

5 个答案:

答案 0 :(得分:0)

变量存储直接值,但属性是您的类及其变量的窗口。

尽管它们的工作方式相同(几乎),但是对于字段来说,一个非常好的事情是,如果你想用字段做一些额外的工作(比如验证或做任何计算),你可以这样做。

这将解释你

public string _abc;

public string abc 
{ 
  get
  {        
    return _abc;
  };

  set
  {
    if (value == null)
      _abc = "";
    else
      _abc = value;
  }; 
}

如果将null传递给属性abc,则会对其进行检查,并将空值分配给_abc。否则就是价值。

如果我们想要一个变量。我们必须做的每一件事。

if(foo == null) // here foo is some string
    _abc = ""
else
    _abc = foo;

有了属性,可以这样做     abc = foo;

现在它将检查属性的set部分。

答案 1 :(得分:0)

属性可以包含有关设置/获取值的一些代码。访问它们时,公共变量不能也不会包含任何代码。这是一个巨大的差异。

使用你所说的任何一个属性代码,你现在或将来可能会有一些代码背后的代码。

使用公共变量,你说它只是一个无聊的旧字段,它将包含一些值。

答案 2 :(得分:0)

使用auto属性而不是Field的一个原因是兼容性 例如,当您指定一个字段时,CLR就是这样做的。它设定了领域 如果您有属性(自动或不自动),则键入

someObject.Whatever = "Value";

看起来你正在分配一个字段,但实际上,C#编译器会为你插入这样的东西:

someObject.set_Whatever("Value");

这与设置字段不同。如果你有一个字段并稍后将其更改为属性(例如,如果你想实现更改通知或类似的东西),则必须重新编译使用原始字段的所有程序集,因为分配字段需要的代码与设置不同财产(无论是否自动)。

几乎没有理由使用公共领域。自动属性可以在运行时内联,因此不会有性能差异。并且他们可以打开为get / set方法添加额外逻辑的可能性,而无需重新编译依赖程序集。

答案 3 :(得分:0)

(关于我的术语:“field”=公共变量,“property”= get / set)

除了用法之外,还有一点需要提及:与字段不同,属性被编译为方法(我认为它在内部称为get_abc)。从一开始就声明自动财产有两个好处:

1)没有反思问题。如果某些反射代码基于值是一个字段,后来您认为“好吧,现在我想添加空测试”并更改为属性,那么反射代码最终会失败(除非您预期在反思,但这将是额外的努力,没有什么imho)

2)可能出现副作用的“警告”。字段只能更改值,方法可以对类执行任意操作。因此,从一开始就声明一个属性就可以发出在后台发生其他变化的可能性。 (当然,不应该在setter中做奇怪的事情,但有时从提供的一个值获得额外的初始化是不切实际的;例如测量列表的长度)

我也会说尽可能使用属性是好的风格。特别是出于提供的两个原因,也是为了保持一致。

答案 4 :(得分:0)

与公共变量的属性相同,例如属性支持绑定,但变量不是。