2

可能重复:
C# 中属性和字段的区别

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

例如

public string abc;

public string abc { get; set; }

请描述一下。

4

5 回答 5

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 部分进行检查。

于 2012-05-15T07:00:51.223 回答
0

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

使用您对使用您的任何人说的属性是代码,现在或将来可能在值后面有一些代码。

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

于 2012-05-15T07:07:35.740 回答
0

使用自动属性而不是字段的一个原因是兼容性。
例如,当您分配一个字段时,CLR 就是这样做的。它设置字段。
当您拥有一个属性(无论是否自动),并且您键入

someObject.Whatever = "Value";

看起来您正在分配一个字段,但实际上,C# 编译器会为您插入如下内容:

someObject.set_Whatever("Value");

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

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

于 2012-05-15T07:31:02.183 回答
0

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

除了用法上的差异之外,还要提到一件事:与字段不同,属性被编译为方法(我认为它在内部被称为类似的东西get_abc)。因此,从一开始就声明汽车财产有两个好处:

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

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

我还要说尽可能使用属性是一种很好的风格。特别是为了提供这两个原因,也是为了一致性。

于 2012-05-15T07:32:34.900 回答
0

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

于 2012-05-15T07:39:44.443 回答