getter和setter与正则变量[C#]之间的差异
我已经了解了getter和setter主题,但我无法理解该主题的新类型: 假设有人正在声明一个新的get&set方法:getter和setter与正则变量[C#]之间的差异,c#,C#,我已经了解了getter和setter主题,但我无法理解该主题的新类型: 假设有人正在声明一个新的get&set方法: public int Id { get; set; }; 我想知道的是,我在下面写的操作与常规公共变量(public int id)之间有什么区别 欢迎评论。属性增强了OOP(面向项目编程)中的封装概念。这是C#中的一个接受者和接受者。具体地说,您可以使用一个属性和一个支持字段,而不是使用一个简单的变量类,您的值将实际存储在该字段中。属性将是访问此支持变量并获取其值或对其进行
public int Id { get; set; };
我想知道的是,我在下面写的操作与常规公共变量(public int id)之间有什么区别
欢迎评论。属性增强了OOP(面向项目编程)中的封装概念。这是C#中的一个接受者和接受者。具体地说,您可以使用一个属性和一个支持字段,而不是使用一个简单的变量类,您的值将实际存储在该字段中。属性将是访问此支持变量并获取其值或对其进行更改的方法。属性的好处是,在存储用户提供的值之前,可以使用任何逻辑。因此,您可以使用您的属性,而不是在类的方法中执行相同的检查,在这些方法中,该值由用户设置并随后使用 让我们有一个名为
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中封装的更多信息,请参阅。也就是说,第二个声明公开了我们将实际存储age
值的变量
简单地说,如果您使用第二个声明而不是第一个声明,则不会发生任何奇怪的情况-前提是您的值设置中没有任何逻辑。但是,使用第一个声明更为一致。公共属性在获取或设置值时保持选项打开,以执行验证或其他逻辑。一个公共字段没有 例如:
-您可能需要检查年龄值是否为负值或过高
-您可能希望确保在设置名字时,它的大小写正确 如果将这些属性作为公共字段提供,则以后将无法强制执行这些规则
您还可以使用属性来执行延迟实例化,这在处理资源密集型代码时可能会很有用。虽然这是正确的,但它并不能解释为什么有人会喜欢一个而不是另一个。我正在更新。我很抱歉造成混淆。感谢您的耐心。您没有窃取我的年龄示例,是吗?或者我们都是脑力劳动者他用了我们“你好世界”里的同样例子(days:)?不,我没有。这是一个很常见的例子。事实上,当我开始阅读C#和第一个向我展示属性值的示例时,我曾经有过同样的问题你们提供了我的答案,但还有一个问题你们还没有回答我:做这件事的逻辑是什么——public int Id{get;set;}?