getter和setter之间的差异和常规变量[C#]

时间:2014-05-03 12:59:44

标签: c#

我已经了解了getter和setter主题,我无法理解这个主题的新类型:

让我们说某人正在声明一种新的获取和设置方法:

public int Id { get; set; };

我想知道的是,我在下面写的内容与常规公共变量(public int id)之间的区别是什么。

欢迎提出意见。

2 个答案:

答案 0 :(得分:0)

属性增强了OOP中的封装概念(面向对象编程)。这是C#中的getter和setter。具体而言,您可以使用属性和支持字段来实际存储您的值,而不是使用简单的变量类。该属性将是访问此支持变量并获取其值或更改它的方法。关于属性的好处是,在存储用户为您提供的值之前,您可以使用所需的任何逻辑。因此,不要对您的类的方法进行相同的检查,而是由用户设置该值然后使用,您可以使用您的属性。

我们有一个名为Customer的课程,其中一个字段是客户的年龄。

public class Customer
{
    private int age;
    public int Age
    {
        get
        {
            return age;
        }
        set
        {
            if(age>0)
            {
                age = value;
            }
            else
            {
                throw new ArgumentException("age must be greater than 0.");
            }
        }
    }
} 

定义了上述属性后,您可以避免在任何其他地方检查类型为Customer的对象的创建者所提供的年龄。提供的值将存储在对象的创建者/使用者不应该知道的地方(封装),并且一般而言会使您作为程序员的生活变得更加容易。

所以你的构造函数现在不包含任何逻辑:

public class Customer(int age)
{
    Age = age;
}

您只需将提供的值分配给相应的属性,而不检查构造函数中提供的值的有效性。

此外,假设在您的类的方法中执行一些计算,结果将存储到名为age的变量中。如果您使用它的相应属性,则不会再次进行任何验证检查。这是一个带有一个变量的相当简单的情况。如果您有6个或7个变量(生产代码中的常见情况),请尝试考虑会发生什么。

以上适用于您拥有变量的任何地方,其值设置需要验证。另一方面,如果您的类仅包含可变值,其值不进行验证测试,则可以使用以下语法。

public class Customer
{
    public int Age { get; set; }
}

这种语法起初似乎毫无意义。为什么我们应该声明这个而不是以下一个:

public class Customer
{
    public int age;
}

第二个声明并不尊重封装原则(有关封装在OOP中的更多信息,请参考here。即,第二个声明公开了我们将实际存储值的变量age

简而言之,如果您使用第二个声明而不是第一个声明,那就不会发生任何奇怪的事情 - 前提是您的值设置中没有任何逻辑。但是,使用第一个更加一致。

答案 1 :(得分:0)

公共属性使选项保持打开状态,以便在获取或设置值时执行验证或其他逻辑。公共领域没有。

例如:
- 您可能想要检查年龄值是否为负或高得多 - 您可能希望确保在设置名字时,它已正确装入

如果您将这些属性作为公共字段提供,您将无法在以后执行这些规则。

您还可以使用属性来执行延迟实例化,这在使用资源密集型代码时可能很有用。