C#中是不是简单的情况下只用属性就好而不用写字段?

比如简单的字段,只需要取值和赋值,是不是就可以省略,代之以属性?

而在较复杂的字段才需要同时使用字段和属性?

阅读 6.3k
1 个回答

C#属性和字段的区别可以参考:C#中属性和字段的区别

文末提到

属性没有存储数据的功能,数据都存在字段中,所以只有修改字段的数据才能更改数据,修改属性的值没用。

C#的属性其实就是字段的 get 和 set 方法,比如

private string name;
public string Name {
    get { return name; }
    set { name = value; }
}

有一些反编译工具反编译出来就变成了

private string name;
public string get_Name() {
    return name;
}
public void set_Name(string value) {
    name = value;
}

因为上面(第一段代码)这种写法比较多,属性最常的定义是对字段进行封闭,所以C#从3.0开始加入了自动属性,也就是编译器帮你封装字段,比如代码:

public string Name { get; set; }

等同的代码就像这样

private string _name;
public string Name {
    get { return _name; }
    set { _name = value; }
}

至于是使用字段还是属性……按OOP的思想,推荐尽量使用属性,就像Java都推荐使用 getXxx 和 setXxx 来封装字段一样;封装之后如果需要对字段进行一些处理,直接修改属性,不会影响到之前写的代码,比如要保证 Name 不是 null

private string name;
public string Name {
    get {
        return name ?? string.Empty;   // 保证 Name 不会是 null
    }
    set {
        if (value == null) {
            // 如果给空值就抛异常
            throw new ArgumentNullException("Name");
        }
        name = value;
    }
}

上面这段代码就把所有用到 Name 的地方都加了处理。如果是直接使用字段 name 的话,那就得去找到所有使用 name 的地方,加上处理,即容易遗漏,又增加了大量的重复代码。

当然使用属性还是字段,并不是必须如何如何,还是要看使用场景和个人习惯的。

logo
101 新手上路
子站问答
访问
宣传栏