• C#泛型秘诀(8完)


     

    4.13 初始化泛型变量为它们的默认值

    问题

    您的泛型类包含一个变量,它的类型和类中定义的类型参数一样。在构造泛型类时,您希望这个变量被初始化为它的默认值。

    解决方案

    简单地使用default关键字把变量初始化为它的默认值:


    public class DefaultValueExample<T>
        
    {
            T data 
    = default(T);
            
    public bool IsDefaultData()
            
    {
                T temp 
    = default(T);
                
    if (temp.Equals(data))
                
    {
                    
    return (true);
                }

                
    else
                
    {
                    
    return (false);
                }

            }

            
    public void SetData(T val)
            
    {
                data 
    = val;
            }

    }


     

    下面的代码使用了这个类:


    public static void ShowSettingFieldsToDefaults()
        
    {
            DefaultValueExample
    <int> dv = new DefaultValueExample<int>();
            
    // 检查成员data是否已经被设置为它的默认值; 返回true.
            bool isDefault = dv.IsDefaultData();
            Console.WriteLine(
    "Initial data: " + isDefault);
            
    // 设置成员data.
            dv.SetData(100);
            
    // 再次检查, 这次返回false.
            isDefault = dv.IsDefaultData();
            Console.WriteLine(
    "Set data: " + isDefault);

     

    第一次调用IsDefaultData返回true,而第二次调用返回false,输出如下:

    Initial data: True

    Set data: False

    讨论

    当对一个和泛型的类型参数一样类型的变量进行初始化时,您不能仅仅设置它为null。当类型参数是一个值类型如intchar会怎么样呢?这将无法工作,因为值类型不能为null。您可能会想到可空类型,如long?或Nullable<long>可以被设置为null(参考秘诀4.7了解更多关于可空类型的内容)。但编译器无从得知将使用何种类型实参来构造类型。(译者注:这里的意思是编译器并不知道用户使用的是值类型还是引用类型,因为可空类型仅仅是对值类型而言)

    default关键字允许您告诉编译器在编译期将会使用这个变量的默认值。如果类型实参提供了一个数字值(如intlongdecimal),那么默认值为0。如果类型实参提供的是引用类型,那么默认值为null。如果类型实参提供了一个结构体,那么结构体的默认值会把它的每个成员进行初始化:数字类型为0,引用类型为null

    阅读参考

    查看秘诀4.7;查看MSDN文档中的“default Keyword in Generic Code”主题。

    (完)

  • 相关阅读:
    mac 10.15.7 修改PATH
    oc 属性类型一般用法
    ubuntu解压zip文件名乱码
    telnet 退出
    docker 根据容器创建镜像
    mac android adb device 没有显示设备
    Yii2 查看所有的别名 alias
    Yii2 App Advanced 添加 .gitignore
    ubuntu 18.04 搜狗突然就提示乱码
    An error occured while deploying the file. This probably means that the app contains ARM native code and your Genymotion device cannot run ARM instructions. You should either build your native code to
  • 原文地址:https://www.cnblogs.com/abatei/p/1065257.html
Copyright © 2020-2023  润新知