带有和不带有 { get; set; } 的属性

32

我是C#的新手

以下两者有什么区别:

public string MyValue;

public string MyValue { get; set; }

我一直以为这两者是相同的。但我的代码有问题,使用后者的形式可以解决问题。但不知道它们之间的区别。能帮忙解释一下吗?

谢谢


可能是在C# 3.0+中属性和字段的区别的重复问题。 - nawfal
可能是在C#中字段和属性的区别是什么?的重复问题。 - Mark Schultheiss
6个回答

26

第一个是公共字段,第二个是自动实现的公共属性。

它们并不相同。使用自动实现属性时,编译器将生成一个私有的备份字段。

虽然两者都可以作为从您的类中公开数据的一种方式,但应遵循信息隐藏原则使用属性 - 字段应该是私有的,只能通过属性访问。这样可以在不破坏调用方的情况下对实现进行更改。


11
如果 "后者使其工作",那么你可能正在使用数据绑定; 数据绑定通常仅针对属性(而不是字段)起作用。 这些可以是显式属性,也可以是像示例中那样的自动实现属性。
请注意,如果您正在使用BinaryFormatter,则从字段更改为属性可能会破坏序列化(我认为这种方法有很大缺陷),但是属性比字段更受欢迎。一定要进行此更改; p

感谢您提供深入的细节,这真的是必要的。 - Gautam Jain

6

这两个实际上是非常不同的结构。

这种形式是为数据分配内存的唯一方式:

string MyData;

这被称为“字段”。 这个表单被称为“自动实现属性”。
string MyData { get; set; }

编译器将其转化为类似以下的内容:
string myDataField;

string MyData
{
    get { return myDataField; }
    set { myDataField = value; }
}

所以你可以看到它们非常不同,但最终它们都会创建一个用于存储的字段。然而,使用该属性可以实现更多未来的灵活性。


4

0

0

数据注释所需
对于使用数据注释(如[Required])的模型,ASP.NET 3.1需要使用自动实现的公共属性。

我曾经吃过苦头,发现公共字段不起作用。 ModelState.IsValid将始终返回true


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接