建议35:使用default为泛型类型变量指定初始值
2016-09-01 15:15
323 查看
建议35:使用default为泛型类型变量指定初始值
有些算法,比如泛型集合List<T>的Find算法,所查找的对象可能会是值类型,也有可能是引用类型。在这种算法内部,我们常常会为这些值类型或引用类型变量指定默认值。于是,问题来了:值类型变量的默认初始值是0值,而引用类型变量的默认初始值是null值,显然,这会导致下面的编译出错:
无法将 null 转换为类型参数“T”,因为它可能是一种不可为 null 的值类型。请考虑改用“default(T)”。
无法将类型“int”隐式转换为“T”。
所以上面的代码应该改为:
这样,如果它在运行时碰到T是一个整型,那么运行时会为其赋值0;如果T在运行时是一个Person这样的引用类型,则会为其赋null值。
List<T>的Find方法源码为:
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
有些算法,比如泛型集合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个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
- 编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
- 高级Bash脚本编程指南(12):指定变量的类型: 使用declare或者typeset
- 关于如何使用反射声明一个泛型类型变量(泛型参数是动态的)的问题
- 一些小工具方法,能将容器转换成指定的数组类型有使用泛型
- AS3的Number类型变量不指定初始值,则其初始值为NaN,而不是0.0
- shell实例(八) ---指定变量类型:使用declare或typeset,随机数
- 编写高质量代码改善C#程序的157个建议——建议45:为泛型类型参数指定逆变
- STM8使用----STVD(COSMIC)定义变量指定其类型和位定义
- 建议45:为泛型类型参数指定逆变
- 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型
- pycahrm使用docstrings来指定变量类型、返回值类型、函数参数类型
- 泛型[6]声明变量类型时使用泛型通配符
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型
- Python中使用isinstance()判断变量类型
- LINQ to Entities 不支持指定的类型成员“ReviewRemainDays”。只支持初始值设定项、实体成员和实体导航属性
- 使用反射机制绕过泛型检查类型
- 未经处理的异常在 System.Data.dll 中发生。其它信息:在应使用条件的上下文(在 '***' 附近)中指定了非布尔类型的表达式。