C# 质疑私有变量

C# questions private variables

只是想确定一下。

    public class Product
    {
        private decimal unitPrice;

        public int Id { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }

        //private string code;

        public decimal Unitprice
        {
            get 
            { 
                return unitPrice; 
            }
            set 
            { 
              if (value >=0)
                  unitPrice = value;
            }
        }
    }

为什么我们必须将 unitPrice 的私有变量设为 return UnitPrice 的值,是否出于某些原因写入?

你不让它 private 只是为了 return 它的价值。 private 是这里的 access modifier 之一。它们用于限制代码中该特定变量的 access/usage 范围。

private 表示 unitPrice 当前可访问或只能由该特定 class 使用。没有其他外部程序集可以使用此变量。

如果你想在其他区域访问外部变量,你可以选择public

希望这能解决问题。

从设计的角度来看,单价属性与其他属性完全相同,但因为有限制。

 if (value >=0)

只有正价格有效,您别无选择,只能预见 属性 所基于的私有变量。

在 .NET 的早期版本中,我们不能这样做:

public int Id { get; set; }

而且不得不一直把它完整地写出来。上面的符号更方便,也使代码更清晰。以前是这样的:

private int _id;

public int Id{
     get{ return _id;}
     set{ _id = value;}
}

public 属性 UnitPrice 暴露给其他 class es 以供读取或修改。但是作为 属性 可以让您 class 对值有一定程度的控制 - 例如,您可以验证任何更改。此外,在内部,您可以完全更改获取和修改值的方式,而无需更改 class 的合同。所以换句话说,您可以在不影响任何消费者的情况下进行此类更改。

支持字段 unitPrice 纯粹是一个实现细节,它是由 class 封装的内部状态。公开此字段意味着您失去了修改值派生的任何和所有机会,并且您没有用于验证值更改的入口点。属性乍一看似乎毫无意义的抽象,但它们将有助于使您的代码更易于维护,因为更改可以更容易地局限于单个 classes。

get 和 set 块纯粹是语法糖,编译器在幕后创建了两个方法,称为 get_UnitPrice() 和 set_UnitPrice(x),用于 read/write 操作在 属性 上。您可以只使用类似的方法,但属性更具可读性,并且旨在成为与 class 状态交互的低成本方式,而方法用于提供行为。

是的,当您想要对变量进行一些控制时,get 和 set 属性很有用。考虑以下情况。

如果您将变量指定为私有变量,则您不希望任何人能够访问您的变量。

但是如果你希望其他人能够访问你的私有变量但不希望其他人更改它。在这种情况下,您可以使用 Properties

public class Product
{
 private decimal price;
 public decimal Price{get{ return price;}}
}

现在其他人可以访问价格但他们无法更改

在您的情况下,您允许其他人获取和设置您的单价,这等同于授予单价 public 访问权限。但是,您允许在一个条件下将单价设置为 0。因此 C# 属性非常适合这种情况。

希望对您有所帮助!!