可空类型(Nullable<T>)及其引出的关于explicit、implicit的使用

问题一:Nullable<T>可赋值为null

先看两行C#代码

            int? i1 = null;
            int? i2 = new int?();        

int? 即Nullable<int>,就像int之于Int32;

Nullable<T>是非常特殊结构类型,它可赋值为null(所以此前我还以为是引用类型),其本质是等同于new;

通过调试可发现上述两个值均为null,但是事实上我们却可以调用他们的一些属性方法比如“HasValue”,由此可见“=null“只是障眼法罢了;

此时如果调用他们的”Value“属性将引发”InvalidOperationException“异常,注意不是空引用异常,异常信息为”其他信息: 可为空的对象必须具有一个值。”;

建议对于此类型的取值使用“GetValueOrDefault”方法来获取,而不是判断HasValue后去Value值;

其次建议不进行” == null “的逻辑判断,应使用HasValue属性。

问题二:Nullable<T> 可赋值为 T类型

仍然看两行C#代码

            int? iNull = 2;
            int i = (int)iNull;

非常常见的代码,但是每行代码都包含了类型,“int?”与int之间的隐式转换与显示转换,而支持可空类型转换的就是Nullable<T>提供了两个方法:

        public static explicit operator T(Nullable<T> value);
        public static implicit operator Nullable<T>(T value);

operator是运算符重载,因而这俩货也可以看成是对“=”的运算符重载,explicit支持了显示转换,implicit支持了隐式转换,使用如下:

    class UserInfo
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public static explicit operator UserInfo(int id)
        {
            Console.WriteLine("获取用户ID为【{0}】的User对象", id);
            return new UserInfo { ID = id };
        }

        public static implicit operator UserInfo(string name)
        {
            Console.WriteLine("获取用户名为【{0}】的User对象", name);
            return new UserInfo { Name = name };
        }
    }

调用:

            UserInfo user1 = (UserInfo)2;

            UserInfo user2 = "bajie";
时间: 2024-10-25 13:00:57

可空类型(Nullable<T>)及其引出的关于explicit、implicit的使用的相关文章

【C#】可空类型(Nullable)

C# 可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. 例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值.类似的,Nullable< bool > 变量可以被赋值为 true 或 false 或 null.

细说可空类型 nullable PropertyType

可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次说到了值类型与引用类型,其中就说到了,值类型是不能为空的,int i=null是错的,值类型为能为空,但我们有时候需要让值类型也可以为空,怎么办呢,那就在值类型的值的范围上扩充一个null值. 为什么要有可空类型 我们在日常开发中,什么地方需要让值类型也变成可空呢?如果你有试过把数据库内的数据对象化

Nullable可空类型

一个Nullable类型就是基本类型加上一个"是否为null指示器"的合成类型.对于一个类型,如果既可以给他分配一个值,也可以给它分配null引用,我们就说这个类型是可空的. 可空类型会多了两个属性 1.HasValue 是否有值 2.Value 获取值 来看个DEMO,这个东西,真没什么好说的.就是容易忘记,如何判断. public class Program { static void Main(string[] args) { int? avalue = null; if (av

可空类型(Nullable)

可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值 语法: < data_type> ? <variable_name> = null;   using System; namespace CodeReview { class Program { /// <summary> /// C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值 ///例如,Nullable<

Unity使用可空类型(Nullable Types)

译林军 范春彦|2014-04-09 09:46|5407次浏览|Unity(375)0 你怎么确定一个Vector3,int,或float变量是否被分配了一个值?一个方便的方式就是使用可空类型! 有时变量携带重要信息,但只有在特定的游戏事件发生时触发.例如:一个角色在你的游戏可能闲置,直到他被告知去一个指定的目的地. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class Character : MonoBehaviour {     Ve

53. C# -- 可空类型(Nullable)

C# 可空类型(Nullable) 理论: C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. 例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值. Nullable< bool > 变量可以被赋值为 true 或 false 或 null

Kotlin---------------可空类型与? ?: ?. !!

可空类型主要是为了从编译层面尽可能的减少NPE. 在Kotlin中申明一个变量,如果类型后面不加?则不能直接给此变量赋值为null,在类型后面加上?就变成了可空类型,而可空类型可以直接赋值为null var name: String = null//Error:Null can not be a value of a non-null type String var name1: String? = null//可空类型,可以赋值为null 那么可空类型和普通的类型在使用上有什么区别呢,这就涉及

可空类型

可空类型.匿名方法和迭代器这三个优美的特性是在C#2.0里面提出来的. 1.可空类型 当我们在使用数据库的时候,会发现这样的一个矛盾点:数据库的字段设置是允许为null的,比如日期的字段,当你想把数据库表映射为C#中的对象时会发现,DateTime类型在C#语言中是不能为null的! 1.1 简介 可空类型也是值类型,但它是包含null值的值类型:int? nullable=null; int?就是可空的int类型.很明显,这又是一个语法糖,肯定不会存在int?这样的类型.对于编译器而言,int

C# 可空类型

可以为null的类型赋其基础类型正常范围的值和null值. 例如:Nullable<Int32>可以赋值为-2147483618到2147483618之间任意值和null.(int?=null 或int?=9) 在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用. 例如,数据库中的布尔型字段可以存储值 . 例子说明: using System; namespace CalculatorApplication { class Nullables

动软Model 模板 生成可空类型字段

动软代码 生成可空类型 <#@ template language="c#" HostSpecific="True" #> <#@ output extension= ".cs" #> <# TableHost host = (TableHost)(Host); host.Fieldlist.Sort(CodeCommon.CompareByintOrder); #> using System; using S