举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > c#可空类型的作用 C# 可空类型

c#可空类型的作用 C# 可空类型

2023-02-28 03:18 C#教程

c#可空类型的作用 C# 可空类型

c#可空类型的作用

C#可空类型是C#中的一种特殊数据类型,它可以表示一个变量的值可以为null。它是C#语言中的一个重要特性,它允许开发人员在不改变原有数据类型的情况下,将null作为一个有效的值来使用。

C#可空类型的作用是非常重要的,它能够帮助开发人员避免出现NullReferenceException异常,这是因为当使用C#中的非可空类型时,如果该对象未初始化或者被赋予null值时,就会出现NullReferenceException异常。而使用C#中的可空类型时,就不会出现这样的问题。

此外,使用C#中的可空类型也能够有效地减少代码量。例如,如果要判断一个int?对象是否有值,则不需要写很多代码来判断该对象是否已初始化或者是否已被赋予null值。而直接使用if(int?.HasValue)即可实现这样的功能。

总之,C#中的可空数据类型具有很多优势:能够避免出现NullReferenceException异常、能够有效地减少代码量、能够方便地表达“无”这样一个特殊情况。因此,在开发C#应用时应当大量使用这样的特性来提高代 码的执行效 率以 及 质 量 。

C# 可空类型

C# 可空类型

引用类型可以使用空引用表示不存在的值。

值类型通常不能表示空值。

例如:

string s = null; // OK, Reference Type
int i = null;    // Compile Error, Value Type cannot be null

要在值类型中表示 null ,必须使用一个称为可空类型的特殊结构。

可空类型用值类型表示,后跟?符号:

int? i = null; // OK, Nullable Type
Console.WriteLine (i == null); // True

Nullable< T> 是不可变结构,只有两个字段,代表 Value HasValue


隐式和显式可空转换

从T到T的转换?是隐式的,并且从T?到T是显式的。

例如:

int? x = 5; // implicit
int y = (int)x; // explicit

显式转换直接等同于调用可为空的对象的Value属性。

因此,如果 HasValue 为false,则抛出 InvalidOperationException

装箱和拆箱可空值

T?被装箱时,堆上的装箱值包含 T ,而不是 T?

这个优化是可能的,因为装箱的值是可以表达null的引用类型。

C#还允许使用as操作符取消装箱可空类型。如果转换失败,结果将为null:

object o = "string";
int? x = o as int?;
Console.WriteLine (x.HasValue); // False

运算符优化

Nullable <T> struct不定义操作符,例如<,>,甚至==。尽管如此,下面的代码编译并正确执行:

int? x = 5;
int? y = 10;
bool b = x < y; // true

如果 x y 都有值,则通过int的小于运算符进行比较;否则,返回false。

运算符提升意味着你可以在 T 上隐式使用T的运算符。

这里有些例子:


int? x = 1;
int? y = null;

// Equality operator examples
Console.WriteLine (x == y); // False
Console.WriteLine (x == null); // False
Console.WriteLine (x == 1); // True
Console.WriteLine (y == null); // True
Console.WriteLine (y == 1); // False
Console.WriteLine (y != 1); // True


// Relational operator examples
Console.WriteLine (x < 6); // True
Console.WriteLine (y < 6); // False
Console.WriteLine (y > 6); // False


// All other operator examples
Console.WriteLine (x + 5); // 6
Console.WriteLine (x + y); // null

编译器根据运算符的类别不同地处理空逻辑。

等式运算符(==和!=)

这意味着两个空值是相等的:


Console.WriteLine ( null == null); // True
Console.WriteLine ((bool?)null == (bool?)null); // True

如果恰好一个操作数为空,则操作数不等。

如果两个操作数都不为空,则比较它们的值。

关系运算符

null 值与空值或非空值进行比较返回false。

所有其他运算符(+, - ,*,/,%,&,|,^,<<,>>,+,++, - ,!,〜)在任何操作数为空时返回null。

混合可空和不可为空的运算符

您可以混合和匹配可空类型和非可空类型:


int? a = null;
int b = 1;
int? c = a + b; // c is null - equivalent to a + (int?)b

bool? 用 & 和 | 运算符

当提供的bool?类型的操作数&|运算符将null视为未知值。所以,null | true为true。

类似地, null & false为false。

以下示例枚举其他组合:


bool? n = null;
bool? f = false;
bool? t = true;
Console.WriteLine (n | n); // (null)
Console.WriteLine (n | f); // (null)
Console.WriteLine (n | t); // True
Console.WriteLine (n & n); // (null)
Console.WriteLine (n & f); // False
Console.WriteLine (n & t); // (null)

空合并运算符

?? 运算符是空合并运算符,它可以与可空类型和引用类型一起使用。

如果操作数是非空的,返回它;否则,或返回默认值。

例如:


int? x = null;
int y = x ?? 5; // y is 5

int? a = null, b = 1, c = 2;
Console.WriteLine (a ?? b ?? c); // 1 (first non-null value)

?? 运算符等效于调用具有显式默认值的 GetValueOrDefault 值。

阅读全文
以上是编程学为你收集整理的c#可空类型的作用 C# 可空类型全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • c#枚举类型enum用法 C# 枚举

    c#枚举类型enum用法 C# 枚举

    2023-02-27 C#教程

    C# 枚举枚举器是值的列表上的只读,只向前的光标。枚举器是实现以下任一接口的对象:System.Collections.IEnumeratorSystem.Colle...

  • c#for循环用法 C# for 循环

    c#for循环用法 C# for 循环

    2023-02-25 C#教程

    C# for/foreach 循环C# 循环一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。语法C# 中 for 循环的语法:f...

  • c#泛型方法 C# 泛型

    c#泛型方法 C# 泛型

    2023-02-24 C#教程

    C#泛型泛型类型定义包含占位符类型的模板。泛型可以提高类型安全性,减少铸件和拳击。泛型类型声明可以由泛型类型的消费者填充...

  • c语言函数传递数组 C# 传递数组给函数

    c语言函数传递数组 C# 传递数组给函数

    2023-02-27 C#教程

    C# 传递数组给函数 C# 数组在 C# 中,您可以传递数组作为函数的参数。您可以通过指定不带索引的数组名称来给函数传递一个指向数...

  • c#while循环用法 C# while 循环

    c#while循环用法 C# while 循环

    2023-02-27 C#教程

    C# while 循环 C# 循环只要给定的条件为真,C# 中的 while 循环语句会重复执行一个目标语句。语法C# 中 while 循环的语法:while...

© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部