编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值相关的知识,希望对你有一定的参考价值。

 

建议35:使用default为泛型类型变量指定初始值

 有些算法,比如泛型集合List<T>的Find算法,所查找的对象可能会是值类型,也有可能是引用类型。在这种算法内部,我们常常会为这些值类型或引用类型变量指定默认值。于是,问题来了:值类型变量的默认初始值是0值,而引用类型变量的默认初始值是null值,显然,这会导致下面的编译出错:

        public T Func<T>()
        {
            T t = null;return t;
        }

 

无法将 null 转换为类型参数“T”,因为它可能是一种不可为 null 的值类型。请考虑改用“default(T)”。

        public T Func<T>()
        {
            T t = 0;
            return t;
        }

 

 无法将类型“int”隐式转换为“T”。

所以上面的代码应该改为:

        public T Func<T>()
        {
            T t = default(T);
            return t;
        }

 

 这样,如果它在运行时碰到T是一个整型,那么运行时会为其赋值0;如果T在运行时是一个Person这样的引用类型,则会为其赋null值。

List<T>的Find方法源码为:

[__DynamicallyInvokable]
public T Find(Predicate<T> match)
{
    if (match == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
    }
    for (int i = 0; i < this._size; i++)
    {
        if (match(this._items[i]))
        {
            return this._items[i];
        }
    }
    return default(T);
}

 

 

 

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

以上是关于编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值的主要内容,如果未能解决你的问题,请参考以下文章

编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试

编写高质量代码改善C#程序的157个建议——建议141:不知道该不该用大括号时,就用

编写高质量代码改善C#程序的157个建议——建议36:使用FCL中的委托声明

编写高质量代码改善C#程序的157个建议——建议52:及时释放资源

编写高质量代码改善C#程序的157个建议——建议150:使用匿名方法Lambda表达式代替方法

编写高质量代码改善C#程序的157个建议——建议41:实现标准的事件模型