返回顶部
首页 > 资讯 > 精选 >如何理解C#可空值类型
  • 210
分享到

如何理解C#可空值类型

2023-06-17 23:06:01 210人浏览 八月长安
摘要

如何理解C#可空值类型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。通常一个值类型变量永远不可能为null,它总是包含值类型的值本身。但是在某些情况下会遇到一些问题如:在映

如何理解C#可空值类型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

通常一个值类型变量永远不可能为null,它总是包含值类型的值本身。但是在某些情况下会遇到一些问题如:在映射数据库中的一个C#可空值列时,使用Framework来处理数据库数据时变得相当困难;为了解决这一问题CLR中引入了“C#可空值类型(nullable value type)”

为理解它们是如何工作的,先看看CLR中的逻辑:

[Serializable, StructLayout(LayoutKind.Sequential)]      public struct Nullable< T> where T : struct     {          private Boolean hasValue = false; // 用一个字段落表示装态,初始假定为Null          internal T value = default(T);          public Nullable(T value)          {              this.value = value;              this.hasValue = true;          }              public bool HasValue { get { return hasValue; } }          public T Value          {              get             {                  if (!hasValue) throw new InvalidOperationException("Nullable object must have a value.");                  return value;              }          }              public T GetValueOrDefault() { return value; }          public T GetValueOrDefault(T defaultValue)          {              if (!HasValue) return defaultValue;              return value;          }          public override bool Equals(object obj)          {              if (!HasValue) return (obj == null);              if (obj == null) return false;              return value.Equals(obj);          }              public override int GetHashCode()          {              if (!HasValue) return 0;              return value.GetHashCode();          }          public override string ToString()          {              if (!HasValue) return String.Empty;              return value.ToString();          }              public static implicit operator Nullable< T>(T value)          {              return new Nullable< T>(value);              }          }

调用和输出:

   static void Main(string[] args)             {                 Nullable< Int32> x = 5;                 Nullable< Int32> y = null;                 Console.WriteLine("x:HasValue {0}, value = {1}", x.HasValue, x.Value);                 Console.WriteLine("y:HasValue {0}, value = {1}", y.HasValue, y.GetValueOrDefault());                 Console.ReadLine();             }     输出:         x:HasValue  True, value = 5         y:HasValue False, value = 0

C#中允许使用问号来申明初始化变量(等同于上面代码)如:

Int32? x = 5;

Int32? y = null;

总结一下C#可空值类型对操作符的解释:

a.一元操作符如果操作数为null,结果为null;

b.二元操作符中任何一个为null,结果为null;

c.比较操作符如果两人个操作数都为null,两者相等;如果一个为null,两者不相等;如果两个数都不为null,对值进行比较;

注意:在操作值类型时会生成大量代码,代码类似对基类(Nullable)代码的调用;

//一元操作符:(+ ++ - -- ! ~)     x++; // x = 6;     y--; // y = null;     //二元操作符:(+ - * / % & | ^ < <  >>)     x = x + 10; // x = 15;     y = y * 10; // y = null     // 比较操作符:(== != <  > < = >=)     if (x == null) Console.WriteLine("x is null;"); else Console.WriteLine("x is not null;");     if (y == null) Console.WriteLine("y is null;"); else Console.WriteLine("y is not null;");     if (x != y) Console.WriteLine("x = y;"); else Console.WriteLine("x != y;");     if (x > y) Console.WriteLine("x > y;"); else Console.WriteLine("x < = y;");

当CLR对一个Nullable< T>实例进行装箱时,会检查它是否为null,如果为null,CLR不实际进行装箱操作,并会返回null值;

如果实例不为空,将从类型中取出值,并对其进行装箱如:

Int32? a = null;                 object o = a; //a 为null                 Console.WriteLine(" o is null = {0}", o == null); // "true"                     Int32? b = 5;                 o = b; //a 为null                 Console.WriteLine(" o's type = {0}", o.GetType()); // "System.Int32" 对可空值类型调用GetType时CLR会采取欺骗手法返回T,而不是Nullable< T>

在应用可空值类型进行拆箱时,CLR会分配内存(这是一个极特殊的行为,在其它所有情况下,拆箱永远不会导致内存的分配),原因在于一个已装箱的值类型不能简单的拆箱为值类型的可空版本,在已装箱的值类型中并不包含Boolean hasValue字段,故在拆箱时CLR必须分配一个Nullable< T>对象,已初始化hasValue = true ,value = 值类型值。这会对应用程序性能造成一定影响。

通过C#可空值类型调用接口方法

Int32? n = 5;             Int32 result = ((IComparable)n).CompareTo(5);             Console.WriteLine(result); // 0;

关于如何理解C#可空值类型问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 如何理解C#可空值类型

本文链接: https://lsjlt.com/news/294240.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解C#可空值类型
    如何理解C#可空值类型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。通常一个值类型变量永远不可能为null,它总是包含值类型的值本身。但是在某些情况下会遇到一些问题如:在映...
    99+
    2023-06-17
  • 如何理解C#值类型和引用类型
    本篇内容主要讲解“如何理解C#值类型和引用类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解C#值类型和引用类型”吧!C#值类型数据直接在他自身分配到的内存中存储数据,而C#引用类型只是...
    99+
    2023-06-17
  • C#可空类型原理是什么
    这篇文章主要介绍“C#可空类型原理是什么”,在日常操作中,相信很多人在C#可空类型原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#可空类型原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-03
  • C#中如何使用值类型和引用类型
    C#中如何使用值类型和引用类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1。变量:变量是指在程序的运行过程中随时可以发生变化的量。语法:数据类型 变量名2。常量:也称常数,...
    99+
    2023-06-17
  • C#新特性之可空引用类型
    安装 您必须下载Visual Studio 2017 15.5预览版(目前最新发布版本是15.4),下载地址:https://www.visualstudio.com/en-us/n...
    99+
    2024-04-02
  • C#可空引用类型怎么使用
    本篇内容主要讲解“C#可空引用类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#可空引用类型怎么使用”吧!安装您必须下载Visual Studio 2017 15.5预览版(目前最新...
    99+
    2023-06-29
  • C语言float类型如何赋值
    C语言中,可以使用以下方式给float类型变量赋值:1. 使用整数直接赋值:可以将整数赋值给float类型变量,C语言会将整数自动转...
    99+
    2023-10-20
    C语言
  • C#中可用的值类型有哪些
    本文小编为大家详细介绍“C#中可用的值类型有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中可用的值类型有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。值类型(Value types)值类型变量可以...
    99+
    2023-06-17
  • C#的可空数据类型怎么使用
    这篇文章主要介绍“C#的可空数据类型怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#的可空数据类型怎么使用”文章能帮助大家解决问题。C# 可空类型(Nullable)C# 提供了一个特殊的...
    99+
    2023-06-17
  • 理解 C++ 函数返回值类型的作用域
    c++++ 函数返回值类型的作用域仅限于函数体内,用于指定函数返回的值的数据类型,有助于确保类型安全和正确使用返回的值。 理解 C++ 函数返回值类型的作用域 在 C++ 中,函数的返...
    99+
    2024-04-13
    函数 c++ 返回值 作用域
  • C++中Covariant返回值类型详解
    目录前言什么是协变返回值类型(Covariant)协变返回值类型(Covariant)的作用前言 C++中当子类覆写(override)父类虚函数时,子类函数的返回值类型可以和父类函...
    99+
    2024-04-02
  • 如何理解C语言中的指针类型
    如何理解C语言中的指针类型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。0.问题知乎上回答了一个粉丝问题,结果这兄弟又连续问了...
    99+
    2024-04-02
  • C++ 函数的返回值类型如何确定?
    函数的返回值类型声明了函数将返回的值类型,避免类型不匹配和错误。确定返回值类型要考虑函数目的、操作、调用代码和可重用性。可选择的基本类型、结构体、类、指针和引用作为返回值类型。 C++...
    99+
    2024-04-19
    c++ 返回值类型
  • C++ 函数的返回值类型如何指定?
    c++++ 函数的返回值类型指定在函数声明中,它指示函数执行后返回的值的数据类型。常见的数据类型包括 void(无返回值)、基本数据类型、结构体、类和指针。返回值类型必须与函数体中实际返...
    99+
    2024-04-18
    函数 c++ 编译错误
  • 可空类型Nullable<T>用法详解
    目录一、简介二、语法和用法三、类型的转换和运算四、装箱与拆箱五、GetType()方法六、ToString()方法七、System.Nullable帮助类八、语法糖一、简介 众所周知...
    99+
    2024-04-02
  • 如何解析C++的C++数组类型
    如何解析C++的C++数组类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++数组的类型实际上是指数组元素的取值类型,对于同一个数组,其所有元素的数据类型都是相同的,数组名...
    99+
    2023-06-17
  • 理解 C++ 函数返回值:深度解析类型和含义
    c++++ 函数返回值类型定义了函数返回的数据类型及其行为:基本类型:返回原始数据,如整数、浮点数或布尔值。指针类型:返回内存地址的引用。引用类型:直接引用变量本身。void 类型:表示...
    99+
    2024-05-01
    c++ 函数返回值
  • 如何理解 C++ 函数模板的类型推断?
    类型推断是 c++++ 函数模板中编译器自动推断函数模板参数类型的重要特性,根据函数参数类型或最合适类型推断模板参数类型。如 max() 函数模板可使用不同类型数组,因为编译器从数组元素...
    99+
    2024-04-24
    c++ 函数模板
  • C++ 函数返回值类型的内存管理
    在 c++++ 中,函数返回值的内存管理因类型而异:基本类型:直接存储在函数的栈空间中,无需显式释放。指针类型:指向堆内存中的对象,需要在函数返回前显式释放以避免内存泄漏。引用类型:只是...
    99+
    2024-04-13
    函数 返回值 内存管理 c++
  • C++ 函数返回值类型推断的原理
    c++++ 中函数返回值类型由编译器推断,原理是通过模板元编程(tmp)来分析函数体,根据 return 语句的返回值推导类型:单个 return 语句:返回值为返回表达式的类型。多个 ...
    99+
    2024-04-13
    c++ 代码可读性
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作