第一章 C#开发进化史:1.3处理未知数据

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:可选参数简化了默认设置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值