我已经了解了getter和setter主题,我无法理解这个主题的新类型:
让我们说某人正在声明一种新的获取和设置方法:
public int Id { get; set; };
我想知道的是,我在下面写的内容与常规公共变量(public int id)之间的区别是什么。
欢迎提出意见。
答案 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)
公共属性使选项保持打开状态,以便在获取或设置值时执行验证或其他逻辑。公共领域没有。
例如:
- 您可能想要检查年龄值是否为负或高得多
- 您可能希望确保在设置名字时,它已正确装入
如果您将这些属性作为公共字段提供,您将无法在以后执行这些规则。
您还可以使用属性来执行延迟实例化,这在使用资源密集型代码时可能很有用。