属性或字段应该在类内部使用吗?

时间:2018-02-04 20:22:57

标签: c# oop properties field encapsulation

通常,您希望通过为内部状态提供getter和setter来封装数据。例如:

public class Person {
    private int age;
    public int Age { 
        get { return age; }
        set { age = value; }
    }
}

void Main() {
    Person alice = new Person();
    alice.Age = 20;
}

但是,让我们说我们会发生这种情况:

public class Person {
    private int age;
    public int Age { 
        get { return age; }
        set { age = value; }
    }

    public String WhatIsMyAge() {
        return "My age is: " + ???;
    }
}

void Main() {
    Person alice = new Person();
    alice.Age = 20;

    Console.WriteLine(alice.WhatIsMyAge());
}

在这里使用属性或字段是否更好?有关系吗?既然我们在本机类中,我们还在关心封装内部吗?

3 个答案:

答案 0 :(得分:2)

始终在类代码中使用属性,尤其是。我会尽量说:在类代码严重错误中意外地使用属性的支持字段。

应该尽量不小心使用支持字段:

  • 如果使用自动实现属性,则不会意外使用支持字段名称。 (当然有一个,但它没有名字;所以不小心使用它是不可能的。)
  • 如果自动实现属性不再(不再),我总是在后备字段中附加一个下划线。年龄和年龄更容易混淆_Age和年龄。
  • 有些人超越了这一点。就像使用Dictionary<string, object>作为每个类的支持字段一样。使用“CallerMemberName”和simialr语法糖,找出要用作索引的属性名称可能很简单。

答案 1 :(得分:2)

在你的例子中:

private int age;
public int Age { 
    get { return age; }
    set { age = value; }
}

您应该使用auto-implemented properties anyway

但是如果你有一个支持字段来在属性的getter或setter中提供额外的逻辑,比如验证,那么肯定使用属性而不是支持字段:这使得类型不可能为通过属性的setter分配时不会通过验证的属性赋值。

读取支持字段应该是安全的,因为getters shouldn't contain logic anyway。但为了保持一致性,请通过属性执行读取和写入操作。

答案 2 :(得分:1)

如果您使用简单属性而没有任何额外功能,则无关紧要。 但是,在这种情况下,为什么不选择使用Auto-implemented properties

如果您的属性getter或setter包含额外的功能,那么无论您是否直接使用属性访问器或支持字段,它都很重要。这完全取决于所需的行为。