CSharp中的字段和属性

属性和字段

在C#中,Properties和Fields都是用来表示类的属性的。

但是它们有以下主要区别:
Fields:

  • 字段,用于直接存储值
  • 默认访问权限为private
  • 没有任何 getter 或 setter 方法
  • 不能有附加的逻辑

Properties:

  • 属性,用于通过 getter 和 setter 方法间接访问字段
  • 可以自定义访问权限(public、private、protected 等)
  • 可以有 getter 和 setter 方法以及附加逻辑
  • 可以实现只读(只有 getter)或只写(只有 setter)

简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Person
{
private string name; // 字段

public string Name // 属性
{
get { return name; }
set
{
if (value != null && value.Length > 0)
{
name = value;
}
}
}
}

这里,name 是一个字段,用于直接存储值。
Name 是属性,具有 getter 和 setter 方法,并在 setter 中加入了校验逻辑。
所以,总结来说:

  • Fields直接存储值,简单。
  • Properties通过方法访问值,可以加入额外的逻辑与控制访问权限。
    在实际编程中,由于Properties更加强大与灵活,所以使用更加广泛。但对性能有要求的场景,Fields也有其存在的意义。

Fields序列化的具体规则是:

  • 如果字段具有公共访问权限(public),那么其值会被JSON序列化
  • 如果字段具有私有访问权限(private)或者受保护的访问权限(protected),那么其值不会被JSON序列化

例如:

1
2
3
4
5
6
7
8
9

public class Person
{
public string Name { get; set; } // 属性

public string Age; // 公共字段,会被序列化

private string Gender; // 私有字段,不会被序列化
}

序列化结果为:

1
2
3
4
{
"Name": "John",
"Age": "30"
}

可见,公共字段Age的值被序列化了,而私有字段Gender的值没有被序列化。

所以

JSON序列化包含:

  • 有get的使用public修饰的Properties(属性)
  • public修饰的Fields(字段)

简单的说只要是public修饰的字段和属性才能被JSON序列化。