【C#零基础从入门到精通】(十五)——C# Nullable可空类型详解

【C#零基础从入门到精通】(十五)——C# Nullable可空类型详解

在 C# 中,可空类型是一项重要的特性,它允许值类型的变量可以表示其正常范围内的值,还可以表示为空(null)。在传统的值类型(如intboolDateTime等)中,它们不能直接赋值为null,而可空类型弥补了这一不足,下面从可空类型的定义、使用、操作符、转换以及与数据库交互等方面详细介绍。

可空类型的定义

可空类型是基于System.Nullable<T>结构体实现的,不过在 C# 里有更简洁的语法糖,即通过在值类型后面加上问号?来定义可空类型。其通用语法为:

T? variableName;

这里的T代表任意值类型,variableName是变量名。例如:

int? nullableInt = null;
bool? nullableBool = false;
DateTime? nullableDateTime = DateTime.Now;

在上述代码中,nullableIntnullableBoolnullableDateTime 分别是可空的intboolDateTime 类型变量。

可空类型的使用

赋值操作

可空类型变量既可以赋值为对应值类型的值,也可以赋值为null。示例如下:

int? num = 10;
num = null;
访问可空类型的值

要访问可空类型变量的值,可以使用Value属性,但在访问前需要先检查HasValue属性,以避免InvalidOperationException异常。示例如下:

int? nullableNum = 20;
if (nullableNum.HasValue)
{
    int value = nullableNum.Value;
    Console.WriteLine($"可空类型的值是: {value}");
}
else
{
    Console.WriteLine("可空类型的值为 null");
}

可空类型的操作符

空合并操作符(??

空合并操作符用于在可空类型变量为null时,提供一个默认值。其语法为:

nullableValue ?? defaultValue

示例如下:

int? nullableNumber = null;
int result = nullableNumber ?? 5;
Console.WriteLine(result); // 输出 5

在这个例子中,由于nullableNumbernull,所以result被赋值为默认值5

可空类型的转换

显式转换

当需要将可空类型转换为非可空类型时,如果可空类型的值为null,则会抛出InvalidOperationException异常。因此,在转换前需要进行检查。示例如下:

int? nullableIntValue = 15;
if (nullableIntValue.HasValue)
{
    int intValue = (int)nullableIntValue;
    Console.WriteLine(intValue);
}
隐式转换

非可空类型可以隐式转换为对应的可空类型。示例如下:

int normalInt = 25;
int? nullableFromNormal = normalInt;

可空类型在数据库交互中的应用

在与数据库交互时,数据库中的字段可能允许为NULL。在 C# 中使用可空类型可以很好地映射这种情况。例如,使用 Entity Framework 进行数据访问时,数据库中允许为NULLint类型字段可以映射为 C# 的int?类型。以下是一个简单的实体类示例:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? StockQuantity { get; set; } // 库存数量,可能为 null
}

可空引用类型(C# 8.0 及以上)

从 C# 8.0 开始,引入了可空引用类型的概念,允许引用类型(如string、自定义类等)显式地标记为可空。在项目文件中启用可空引用类型后,可以这样定义可空引用类型变量:

#nullable enable
string? nullableString = null;

同时,编译器会对可空引用类型进行静态分析,帮助开发者避免空引用异常。

实例应用

using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            int? num1 = null;
            int? num2 = 123;
            int num3;
        
            num3 = num1 ?? 321;
            Console.WriteLine("num3 = {0}", num3);

            num3 = num2 ?? 321;
            Console.WriteLine("num3 = {0}", num3);
            Console.ReadLine();
        }
    }
}

运行结果如下:

num3 = 321
num3 = 123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Csharp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值