• C# in Depth-处理未知数据


    1.3 处理未知数据

    我们将要介绍两种不同形式的未知数据。首先,处理确实没有数据信息的场景。其次,再来看看如何从方法调用中移除信息,使用默认值来代替。


    1.3.1 表示未知的价格

    假如你经常使用数据库的话,问题肯定是你熟悉的。

    假定产品列表不仅包含现售的产品,还包括尚未面市的产品。某些情况下,我们可能不知道价格。

    如果 decimal 是引用类型,那么只需使用 null 来表示未知的价格。但是由于它是值类型,我们不能这样表示。

    那么,在C# 1中如何表示?有3种常见的解决方案:

    ① 围绕 decimal 创建一个引用类型包装器。

    ② 维护一个单独的 Boolean 标志,它表示价格是否已知。

    ③  使用一个“魔数”(magic value)(比如 decimal.MinValue )来表示未知价格。

    其中没有一个方案是特别好的。神奇的是,在变量和属性声明中添加一个额外的字符,即可解决这个问题。

    .NET 2.0通过引入 Nullable<T> 结构,C# 2通过提供一些语法糖(syntactic sugar),使事情得到了极大的简化。现在可以将属性声明更改为如下代码块:

    decimal? price;
    public decimal? Price
    {
        get { return price; }
        private set { price = value; }
    }

    构造函数的参数也更改为 decimal? 。这样一来,就可以将 null 作为参数值传递进来,或者在类中写 Price=null 。

    null 的含义从“不指向任何对象的一个特殊引用”变成“代表没有给出其他数据的任意可空类型的一个特殊值”,其中所有引用类型和基于 Nullable<T> 的类型被视为可空类型。

    这比其他任何解决方案都更有表现力。代码的其余部分和往常一样工作——价格未知的产品默认价格低于10美元,因为可空值是通过“大于”操作符来处理比较的。

    为了检查一个价格是否已知,可以把它同 null 比较,或者使用 HasValue 属性。


    显示价格未知的产品

    所以为了在C# 3中显示所有价格未知的产品,可以像代码清单1-14这样写。

    //代码清单1-14 显示价格未知的产品
    List<Product> products = Product.GetSampleProducts();
    foreach (Product product in products.Where(p => p.Price==null ))
        Console.WriteLine(product.Name);

    C# 2代码与代码清单1-12相似,但使用了 return p.Price == null; 作为匿名方法的方
    法体。

    List<Product> products = Product.GetSampleProducts();
    Product.FindAll(delegate(Product p){return p.Price==10;})
           .ForEach(Console.WriteLine)

    1.3.2 可选参数和默认值

    有时你并不想给出方法所需的所有东西,比如对于某个特定参数,你可能总是会使用同样的值。

    传统的解决方案是对该方法进行重载,现在C# 4引入的可选参数(optional parameter)可以简化这一操作。

    在 Product 类型的C# 4版本中,构造函数接收产品的名称和价格。在C# 2和C# 3中,我们可以将价格设置为可空的 decimal 类型,但现在我们假设大多数产品都不包含价格。如果能像下面这样初始化产品就再好不过了:

    Product p=new Product("Unreleased product");

    在C# 4之前,我们只能添加一个 Product 构造函数的重载来实现这一目的。而使用C# 4可以为价格参数声明一个默认值(在本例中为 null ):

    public Product(string name, decimal? price = null)
    {
        this.name = name;
        this.price = price;
    }

    你需要为声明的可选参数指定一个常量值。这个值不一定为 null ,只不过在本例中默认值恰好为空而已。

    它可以应用于任何类型的参数,但是对于除字符串之外的引用类型来说,只能使用 null 作为可用的常量值。

    图1-4总结了C#不同版本的演变。

  • 相关阅读:
    Vue项目中跨域问题解决
    子网掩码
    C++的const类成员函数
    在python3中使用urllib.request编写简单的网络爬虫
    Linux 重定向输出到多个文件中
    背包问题
    hdu-1272 小希的迷宫
    SQLAlchemy 几种查询方式总结
    pycharm快捷键、常用设置、配置管理
    python3判断字典、列表、元组为空以及字典是否存在某个key的方法
  • 原文地址:https://www.cnblogs.com/errornull/p/10018654.html
Copyright © 2020-2023  润新知