Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getter和setter与正则变量[C#]之间的差异_C# - Fatal编程技术网

getter和setter与正则变量[C#]之间的差异

getter和setter与正则变量[C#]之间的差异,c#,C#,我已经了解了getter和setter主题,但我无法理解该主题的新类型: 假设有人正在声明一个新的get&set方法: public int Id { get; set; }; 我想知道的是,我在下面写的操作与常规公共变量(public int id)之间有什么区别 欢迎评论。属性增强了OOP(面向项目编程)中的封装概念。这是C#中的一个接受者和接受者。具体地说,您可以使用一个属性和一个支持字段,而不是使用一个简单的变量类,您的值将实际存储在该字段中。属性将是访问此支持变量并获取其值或对其进行

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

假设有人正在声明一个新的get&set方法:

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;}?