可能重复:
C# 中属性和字段的区别
我知道这是一个非常基本的问题,但搜索后我无法阅读任何有效的答案
例如
public string abc;
public string abc { get; set; }
请描述一下。
可能重复:
C# 中属性和字段的区别
我知道这是一个非常基本的问题,但搜索后我无法阅读任何有效的答案
例如
public string abc;
public string abc { get; set; }
请描述一下。
变量存储直接值,但属性是您的类及其变量的窗口。
尽管它们的工作方式相同(几乎),但字段的一件非常好的事情是,如果您想对字段进行一些额外的工作(例如验证或进行任何计算),您可以这样做。
这将为您解释
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 部分进行检查。
属性可以包含一些设置/获取值的代码。当您访问公共变量时,它们不能也不会包含任何代码。这是一个巨大的差异。
使用您对使用您的任何人说的属性是代码,现在或将来可能在值后面有一些代码。
使用公共变量你说它只是一个无聊的旧字段,将包含一些值。
使用自动属性而不是字段的一个原因是兼容性。
例如,当您分配一个字段时,CLR 就是这样做的。它设置字段。
当您拥有一个属性(无论是否自动),并且您键入
someObject.Whatever = "Value";
看起来您正在分配一个字段,但实际上,C# 编译器会为您插入如下内容:
someObject.set_Whatever("Value");
这与设置字段不同。如果您有一个字段并稍后将其更改为属性(例如,如果您想实现更改通知或类似的东西),您将不得不重新编译所有使用原始字段的程序集,因为分配字段需要与设置不同的代码一个属性(无论是否自动)。
几乎没有理由使用公共领域。自动属性可以在运行时内联,因此不会有性能差异。并且它们可以为您的 get/set 方法添加额外的逻辑,而无需重新编译相关程序集。
(关于我的术语:“field” = 公共变量,“property” = get/set)
除了用法上的差异之外,还要提到一件事:与字段不同,属性被编译为方法(我认为它在内部被称为类似的东西get_abc
)。因此,从一开始就声明汽车财产有两个好处:
1)反射没有问题。如果某些反射代码基于作为字段的值,然后您认为“好吧,现在我想添加空测试”并更改为属性,那么反射代码最终会失败(除非您在反思,但这将是额外的努力,恕我直言)
2)可能的副作用的“警告”。字段只能更改其值,方法可以对类做任意事情。因此,从一开始就声明一个属性意味着在后台发生其他变化的可能性。(当然不应该在 setter 中做奇怪的事情,但有时从提供的一个值中获取额外的初始化并不是不切实际的;例如测量列表的长度)
我还要说尽可能使用属性是一种很好的风格。特别是为了提供这两个原因,也是为了一致性。
与公共变量上的属性相同的区别,例如属性支持绑定但变量不支持。