【发布时间】:2015-06-29 13:23:27
【问题描述】:
只是想确定一下。
公开课产品 { 私人十进制单位价格; 公共 int ID { 获取;放; } 公共字符串代码 { 获取;放; } 公共字符串名称 { 获取;放; } //私有字符串代码; 公开小数单价 { 得到 { 返回单位价格; } 放 { 如果(值 >=0) 单位价格 = 价值; } } }为什么我们必须将私有变量设置为 unitPrice 才能将值返回给 UnitPrice,是否出于某些原因?
【问题讨论】:
只是想确定一下。
公开课产品 { 私人十进制单位价格; 公共 int ID { 获取;放; } 公共字符串代码 { 获取;放; } 公共字符串名称 { 获取;放; } //私有字符串代码; 公开小数单价 { 得到 { 返回单位价格; } 放 { 如果(值 >=0) 单位价格 = 价值; } } }为什么我们必须将私有变量设置为 unitPrice 才能将值返回给 UnitPrice,是否出于某些原因?
【问题讨论】:
你不会让它private 只是为了返回它的值。 private 是这里的access modifier 之一。它们用于限制代码中特定变量的访问/使用范围。
private 在这里表示unitPrice 当前可访问或只能由该特定类使用。没有其他外部程序集可以使用此变量。
如果您想在其他区域访问外部变量,您可以选择将其设为public。
希望这可以清除它。
【讨论】:
从设计的角度来看,单价属性与其他属性完全相同,但是因为它有一个约束。
if (value >=0)
只有正价是有效的,您别无选择,只能预见房产所基于的私有变量。
在早期版本的 .NET 中,我们不能这样做:
public int Id { get; set; }
而且必须一直完整地写出来。上面的符号更方便,它也使代码更清晰。以前是这样的:
private int _id;
public int Id{
get{ return _id;}
set{ _id = value;}
}
【讨论】:
公共属性 UnitPrice 公开给要读取或修改的其他类。但是,作为一个属性,您的类可以对值进行一定程度的控制——例如,您可以验证任何更改。此外,在内部,您可以完全更改获取和修改值的方式,而无需更改类的合同。因此,换句话说,您可以在不影响任何消费者的情况下进行此类更改。
支持字段 unitPrice 纯粹是一个实现细节,它是由类封装的内部状态。公开此字段意味着您失去了修改值的派生的所有机会,并且您没有验证对值的更改的入口点。属性一开始可能看起来毫无意义的抽象,但它们将有助于使您的代码更易于维护,因为更改可以更容易地限制在单个类中。
get 和 set 块是纯粹的语法糖,编译器在底层创建了两个方法,称为 get_UnitPrice() 和 set_UnitPrice(x),用于对属性进行读/写操作。您可以只使用类似的方法,但属性更具可读性,并且被设计为与类状态交互的低成本方式,并且方法用于提供行为。
【讨论】:
是的,当您想对变量进行一些控制时,get 和 set 属性很有用。考虑以下情况。
如果您将变量指定为私有变量,您希望没有人能够访问您的变量。
但是,如果您希望其他人能够访问您的私有变量,但又不希望其他人更改它。在这种情况下,您可以使用属性
public class Product
{
private decimal price;
public decimal Price{get{ return price;}}
}
现在其他人可以访问价格,但他们无法更改
在您的情况下,您允许其他人获取和设置您的单价,这等于公开访问单价。但是,您允许在一个条件下将单价设置为 0。因此 C# 属性非常适合这种情况。
希望这会有所帮助!
【讨论】: