1.3.1表示未知的价格
假定产品列表包含未上市产品,我们可能并不知道产品的价格。如果decimal是引用类型,可以使用null来表示未知价格,但它是值类型,我们不能这样表示。
C#1的解决方案:
1.围绕decimal创建一个引用类型包装器;
2.维护一个单独的Boolean标志,它表示价格是否已知;
3.使用一个“魔数”(magic value)(比如decimal.MinValue)来表示未知价格。
C#2的解决方案:
通过引入Nullable<T>结构,C#2通过提供一些语法糖(systactic sugar)使事情得到了极大的简化。
decimal? price;
public
decimal? Price
{
get{ return price; }
private set{ price = value; }
}
null的含义从“不指向任何对象的一个特殊引用”,变成“代表没有给出其他数据的任意可空类型的一个特殊值”
C#3在可空类型方面没有进行什么改进
//C#3中显示所有价格未知的产品
List
products=Product.GetSampleProducts();
foreach(Product product in products.Where(p=>p.Price==null))
{
Console.Write(product.Name);
}
C#4引入可选参数(optional parameter)
注意:与null值进行大小比较,结果始终是false。所以当判断产品价格是否大于10元时,只能用大于号,即price>10m
1.3.2可选参数和默认值
现在假设大部分产品都不包含价格,这时如果能这样初始化就好了:Product p=new Product("没价格的产品");
C#4之前只能添加一个Product构造函数的重载来实现这一目的。
而C#4可以为价格参数声明一个默认值(本例中为null,其他例子里对于非可空decimal类型也可以将默认值设为1.0,6.66,随你开心):
public Product(string name,decimal? price=null)
{
this.name=name;
this.price=price;
}
注意:除string外的引用类型,只能使用null作为可用常量。
总结:C#1:要么维护一个标志,要么更改引用类型的语意,要么利用一个魔数—>C#2/C#3:可空类型避免了采用C#1的各种繁琐的方法。语法糖进一步简化了编程—>C#4:可选参数简化了默认设置
转载请注明原文地址: https://ju.6miu.com/read-676168.html