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

    xiaoxiao2021-04-19  172

    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

    最新回复(0)