泛型代码中的默认关键字default

在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:

  • T 是引用类型还是值类型。
  • 如果 T 为值类型,则它是数值还是结构。

    给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。 解决方案是使用 default 关键字,此关键字对于引用类型会返回 null,对于数值类型会返回零。 对于结构,此关键字将返回初始化为零或 null 的每个结构成员,具体取决于这些结构是值类型还是引用类型。 对于可以为 null 的值类型,默认返回 xref:System.Nullable%601?displayProperty=fullName,它像任何结构一样初始化。

以下来自 GenericList 类的示例显示了如何使用 default 关键字

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 使用非空的整数列表进行测试.
            GenericList<int> gll = new GenericList<int>();
            gll.AddNode(5);
            gll.AddNode(4);
            gll.AddNode(3);
            int intVal = gll.GetLast();
            // 下面一行显示5.
            Console.WriteLine(intVal);

            // 用一个空的整数列表进行测试.
            GenericList<int> gll2 = new GenericList<int>();
            intVal = gll2.GetLast();
            // 下面一行显示0.
            Console.WriteLine(intVal);

            // 使用非空字符串列表进行测试.
            GenericList<string> gll3 = new GenericList<string>();
            gll3.AddNode("five");
            gll3.AddNode("four");
            string sVal = gll3.GetLast();
            // 下面一行显示five.
            Console.WriteLine(sVal);

            // 使用一个空字符串列表进行测试.
            GenericList<string> gll4 = new GenericList<string>();
            sVal = gll4.GetLast();
            // 下面一行显示一条空白行.
            Console.WriteLine(sVal);
        }
    }

    // T 是存储在一个GenericList的特定实例中的数据类型.
    public class GenericList<T>
    {
        private class Node
        {
            // 每个节点都有一个指向列表中的下一个节点的引用.
            public Node Next;
            // 每个节点都有一个T类型的值.
            public T Data;
        }

        // 这个列表最初是空的.
        private Node head = null;

        // 在列表开始的时候添加一个节点,用t作为它的数据值.
        public void AddNode(T t)
        {
            Node newNode = new Node();
            newNode.Next = head;
            newNode.Data = t;
            head = newNode;
        }

        // 下面的方法返回存储在最后一个节点中的数据值列表. 如果列表是空的, 返回类型T的默认值.
        public T GetLast()
        {
            // 临时变量的值作为方法的值返回. 
            // 下面的声明初始化了临时的温度 
            // 类型T的默认值. 如果该列表为空返回默认值.
            T temp = default(T);

            Node current = head;
            while (current != null)
            {
                temp = current.Data;
                current = current.Next;
            }
            return temp;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值