Docs-.NET-C#-指南-语言参考-关键字-值类型:可以 null 的值类型

ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:可以 null 的值类型
1.返回顶部

1、

Nullable value types (C# reference)

  • 2019/11/04
  • 7 分钟阅读时长

A nullable value type T? represents all values of its underlying value type T and an additional null value. For example, you can assign any of the following three values to a bool? variable: truefalse, or null. An underlying value type T cannot be a nullable value type itself.

备注

C# 8.0 introduces the nullable reference types feature. For more information, see Nullable reference types. The nullable value types are available beginning with C# 2.

Any nullable value type is an instance of the generic System.Nullable<T> structure. You can refer to a nullable value type with an underlying type T in any of the following interchangeable forms: Nullable<T> or T?.

You typically use a nullable value type when you need to represent the undefined value of an underlying value type. For example, a Boolean, or bool, variable can only be either true or false. However, in some applications a variable value can be undefined or missing. For example, a database field may contain true or false, or it may contain no value at all, that is, NULL. You can use the bool? type in that scenario.

Declaration and assignment

As a value type is implicitly convertible to the corresponding nullable value type, you can assign a value to a variable of a nullable value type as you would do that for its underlying value type. You also can assign the null value. For example:

C#复制

double? pi = 3.14;
char? letter = ‘a‘;

int m2 = 10;
int? m = m2;

bool? flag = null;

// An array of a nullable type:
int?[] arr = new int?[10];

The default value of a nullable value type represents null, that is, it‘s an instance whose Nullable<T>.HasValue property returns false.

Examination of an instance of a nullable value type

Beginning with C# 7.0, you can use the is operator with a type pattern to both examine an instance of a nullable value type for null and retrieve a value of an underlying type:

C#复制运行

int? a = 42;
if (a is int valueOfA)
{
    Console.WriteLine($"a is {valueOfA}");
}
else
{
    Console.WriteLine("a does not have a value");
}
// Output:
// a is 42

You always can use the following read-only properties to examine and get a value of a nullable value type variable:

The following example uses the HasValue property to test whether the variable contains a value before displaying it:

C#复制运行

int? b = 10;
if (b.HasValue)
{
    Console.WriteLine($"b is {b.Value}");
}
else
{
    Console.WriteLine("b does not have a value");
}
// Output:
// b is 10

You also can compare a variable of a nullable value type with null instead of using the HasValue property, as the following example shows:

C#复制运行

int? c = 7;
if (c != null)
{
    Console.WriteLine($"c is {c.Value}");
}
else
{
    Console.WriteLine("c does not have a value");
}
// Output:
// c is 7

Conversion from a nullable value type to an underlying type

If you want to assign a value of a nullable value type to a non-nullable value type variable, you might need to specify the value to be assigned in place of null. Use the null-coalescing operator ?? to do that (you also can use the Nullable<T>.GetValueOrDefault(T) method for the same purpose):

C#复制运行

int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}");  // output: b is 28

int? c = null;
int d = c ?? -1;
Console.WriteLine($"d is {d}");  // output: d is -1

If you want to use the default value of the underlying value type in place of null, use the Nullable<T>.GetValueOrDefault() method.

You also can explicitly cast a nullable value type to a non-nullable type, as the following example shows:

C#复制

int? n = null;

//int m1 = n;    // Doesn‘t compile
int n2 = (int)n; // Compiles, but throws an exception if n is null

At run time, if the value of a nullable value type is null, the explicit cast throws an InvalidOperationException.

A non-nullable value type T is implicitly convertible to the corresponding nullable value type T?.

Lifted operators

The predefined unary and binary operators or any overloaded operators that are supported by a value type T are also supported by the corresponding nullable value type T?. These operators, also known as lifted operators, produce null if one or both operands are null; otherwise, the operator uses the contained values of its operands to calculate the result. For example:

C#复制

int? a = 10;
int? b = null;
int? c = 10;

a++;        // a is 11
a = a * c;  // a is 110
a = a + b;  // a is null

备注

For the bool? type, the predefined & and | operators don‘t follow the rules described in this section: the result of an operator evaluation can be non-null even if one of the operands is null. For more information, see the Nullable Boolean logical operators section of the Boolean logical operators article.

For the comparison operators <><=, and >=, if one or both operands are null, the result is false; otherwise the contained values of operands are compared. Do not assume that because a particular comparison (for example, <=) returns false, the opposite comparison (>) returns true. The following example shows that 10 is

  • neither greater than or equal to null
  • nor less than null

C#复制运行

int? a = 10;
Console.WriteLine($"{a} >= null is {a >= null}");
Console.WriteLine($"{a} < null is {a < null}");
Console.WriteLine($"{a} == null is {a == null}");
// Output:
// 10 >= null is False
// 10 < null is False
// 10 == null is False

int? b = null;
int? c = null;
Console.WriteLine($"null >= null is {b >= c}");
Console.WriteLine($"null == null is {b == c}");
// Output:
// null >= null is False
// null == null is True

The preceding example also shows that an equality comparison of two nullable value type instances that are both null evaluates to true.

If there exists a user-defined conversion between two value types, the same conversion can also be used between the corresponding nullable value types.

Boxing and unboxing

An instance of a nullable value type T? is boxed as follows:

  • If HasValue returns false, the null reference is produced.
  • If HasValue returns true, the corresponding value of the underlying value type T is boxed, not the instance of Nullable<T>.

You can unbox a boxed value of a value type T to the corresponding nullable value type T?, as the following example shows:

C#复制运行

int a = 41;
object aBoxed = a;
int? aNullable = (int?)aBoxed;
Console.WriteLine($"Value of aNullable: {aNullable}");

object aNullableBoxed = aNullable;
if (aNullableBoxed is int valueOfA)
{
    Console.WriteLine($"aNullableBoxed is boxed int: {valueOfA}");
}
// Output:
// Value of aNullable: 41
// aNullableBoxed is boxed int: 41

How to identify a nullable value type

The following example shows how to determine whether a System.Type instance represents a constructed nullable value type, that is, the System.Nullable<T> type with a specified type parameter T:

C#复制运行

Console.WriteLine($"int? is {(IsNullable(typeof(int?)) ? "nullable" : "non nullable")} type");
Console.WriteLine($"int is {(IsNullable(typeof(int)) ? "nullable" : "non-nullable")} type");

bool IsNullable(Type type) => Nullable.GetUnderlyingType(type) != null;

// Output:
// int? is nullable type
// int is non-nullable type

As the example shows, you use the typeof operator to create a System.Type instance.

If you want to determine whether an instance is of a nullable value type, don‘t use the Object.GetType method to get a Type instance to be tested with the preceding code. When you call the Object.GetType method on an instance of a nullable value type, the instance is boxed to Object. As boxing of a non-null instance of a nullable value type is equivalent to boxing of a value of the underlying type, GetType returns a Type instance that represents the underlying type of a nullable value type:

C#复制运行

int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32

Also, don‘t use the is operator to determine whether an instance is of a nullable value type. As the following example shows, you cannot distinguish types of a nullable value type instance and its underlying type instance with the is operator:

C#复制运行

int? a = 14;
if (a is int)
{
    Console.WriteLine("int? instance is compatible with int");
}

int b = 17;
if (b is int?)
{
    Console.WriteLine("int instance is compatible with int?");
}
// Output:
// int? instance is compatible with int
// int instance is compatible with int?

You can use the code presented in the following example to determine whether an instance is of a nullable value type:

C#复制运行

int? a = 14;
Console.WriteLine(IsOfNullableType(a));  // output: True

int b = 17;
Console.WriteLine(IsOfNullableType(b));  // output: False

bool IsOfNullableType<T>(T o)
{
    var type = typeof(T);
    return Nullable.GetUnderlyingType(type) != null;
}

备注

The methods described in this section are not applicable in the case of nullable reference types.

C# language specification

For more information, see the following sections of the C# language specification:

See also

2、

2.返回顶部
3.返回顶部
4.返回顶部
5.返回顶部

1、

https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/nullable-value-types

2、

6.返回顶部
作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/storebook/p/11846275.html

时间: 2024-08-28 15:49:09

Docs-.NET-C#-指南-语言参考-关键字-值类型:可以 null 的值类型的相关文章

Docs-.NET-C#-指南-语言参考-关键字-值类型:struct

ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:struct 1.返回顶部 1. struct(C# 参考) 2015/07/20 struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征. 下面的示例显示了一个简单的结构声明: C#复制 public struct Book { public decimal price; public string title; public string author; } 备注 结构还可以包含构

Docs-.NET-C#-指南-语言参考-关键字-值类型:char

ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:char 1.返回顶部 1. char(C# 参考) 2019/10/22 char 类型关键字是 .NET System.Char 结构类型的别名,它表示 Unicode UTF-16 字符: 类型 范围 大小 .NET 类型 char U+0000 到 U+FFFF 16 位 System.Char 文本 char 类型的常量可以编写为字符文本.十六进制转义序列或 Unicode 表示形式. 也可以将整型字符代码强制转

Docs-.NET-C#-指南-语言参考-关键字-值类型:内置数值转换

ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:内置数值转换 1.返回顶部 1. 内置数值转换(C# 参考) 2019/10/22 C# 提供了一组整型和浮点数值类型. 任何两种数值类型之间都可以进行隐式或显式转换. 必须使用强制转换运算符 () 才能调用显式转换. 隐式数值转换 下表显示内置数值类型之间的预定义隐式转换: From 到 sbyte short.int.long.float.double 或 decimal byte short.ushort.int.u

Docs-.NET-C#-指南-语言参考-关键字-值类型:bool

ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:bool 1.返回顶部 1. bool(C# 参考) 2015/07/20 bool 关键字是 System.Boolean 的别名. 它用于声明变量来存储布尔值:true 和 false. 备注 如需支持三值逻辑(例如,在使用支持三值布尔类型的数据库时),请使用 bool? 类型. 对于 bool? 操作数,预定义的 & 和 | 运算符支持三值逻辑. 有关详细信息,请参阅布尔逻辑运算符一文的可以为 null 的布尔逻辑运

(转载)虚幻引擎3--UnrealScript语言参考

档概要: UnrealScript 介绍和简要参考.最初作者是Tim Sweeney (EpicGames) 内容 UnrealScript语言参考 介绍 快速链接 本文档的目的 UnrealScript的设计目标 虚幻引擎3中UnrealScript的新功能 代码结构示例 Unreal虚拟机 对象层次 类 变量 变量类型 内置类型 集合数据类型 Unreal类型 变量修饰符 可编辑性 数组 Structs 修饰符 枚举 常量 Object和actor引用变量 类引用变量 表达式 赋值 在类之间

Drools文档(八) 规则语言参考

规则语言参考 概述 Drools有一个"本地"的规则语言.这种格式在标点符号上非常轻,并且通过"扩展器"支持自然语言和领域特定的语言,使语言能够变形到您的问题领域.本章主要与本机规则格式一致.用于表示语法的图表被称为"铁路"图表,它们基本上是语言术语的流程图.技术上非常热衷的也可以参考DRL.g这是规则语言的Antlr3语法.如果您使用Rule Workbench,则可以通过内容帮助为您完成许多规则结构,例如,输入"ru"并按

C语言中关键字volatile的含义【转】

本文转载自:http://m.jb51.net/article/37489.htm 本篇文章是对C语言中关键字volatile的含义进行了详细的分析介绍,需要的朋友参考下 volatile 的意思是“易失的,易改变的”.这个限定词的含义是向编译器指明变量的内容可能会由于其他程序的修改而变化.通常在程序中申明了一个变量时,编译器会尽量把它存放在通用寄存器中,例如ebx.当CPU把其值放到ebx中后就不会再关心对应内存中的值.若此时其他程序(例如内核程序或一个中断)修改了内存中它的值,ebx中的值并

c语言const关键字

作者:沉默羔羊 c语言const关键字: --  特点. 使用该关键修饰的变量不能被改变.      --指针常量. demo:   const char *p或者是 char const * p --常量指针. demo: char * const p      --常量指针和指针常量. 1.常量指针指的是如 char * const p, p是一个常量,p不能改变指向. 2.指针常量指的是如char const *p,   p指向一个字符常量,p可以改变指向.但是不能改变*p. --对于常量

C 语言 const 关键字

#include <stdio.h> int main(void){ int i = 1; int j = 100; const int * temp = &i; printf("%d\n",*temp); i = 2; printf("%d\n",*temp); temp = &j; printf("%d\n",*temp); return 0; } 输出 12100 #include <stdio.h>