属性和字段
在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
16public 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 |
|
序列化结果为:
1 | { |
可见,公共字段Age的值被序列化了,而私有字段Gender的值没有被序列化。
所以
JSON序列化包含:
- 有get的使用public修饰的Properties(属性)
- public修饰的Fields(字段)
简单的说只要是public修饰的字段和属性才能被JSON序列化。