C#——可空值类型

掌握C#中的可空值类型与引用类型 本文深入探讨了C#编程语言中的可空值类型与引用类型。可空值类型允许值类型的变量存储null值,而引用类型包括C#内置的引用类型以及自定义的引用类型。同时,本文也介绍了如何使用可空引用类型来增强代码的健壮性,并探讨了动态类型和常量在C#中的作用与声明方式。... 阅读详情

转载请注明出处:

http://hi.baidu.com/try__again/modify/blog/45bc5845c6db642bcffca39e

没有值的时候怎么办?

对于一个引用类型的变量来说,其值是一个引用。而值类型变量的值是真正的值本身。对于引用类型来说,null是一个特殊的值,它表示“该引用变量没有引用任何对象”。但是,它并不是一个有效的值类型的值。这非常容易理解,因为如果C#设计者将null设计为值类型的有效位,那么势必将增加内存开销。

在C#1中,表示空值的值类型变量往往有如下几种模式:

1、魔值,也就是说,牺牲一个值来表示空值。

2、引用类型包装,它有两种类型:直接利用object作为变量类型,并根据需要进行装箱和拆箱操作;对于一个可空值类型,为其准备一个引用类型。

3、额外的bool标记

System,Nullable<T>:

该类型是可空类型的核心结构。它是一个泛型类型,且类型参数T存在一个值类型约束,T称为可空类型的基础类型。它最重要的两个属性是HasValue和Value,前者是一个bool类型,它指出是否存在一个真正的值,后者则描述一个真正的值。

成员函数的调用:

using System;
using System.Collections.Generic;
using System.Text;

namespace CS_TEST
{
    class Program
    {
        static void Display(Nullable<int> x)
        {
            Console.WriteLine("HasValue:{0}", x.HasValue);
            if (x.HasValue)
            {
                Console.WriteLine("Value:{0}", x.Value);
                Console.WriteLine("Explicit conversion:{0}", (int)x);
            }
            Console.WriteLine("GetValueOrDefault():{0}", x.GetValueOrDefault());
            Console.WriteLine("GetValueOrDefault(10):{0}", x.GetValueOrDefault(10));
            Console.WriteLine("ToString():\"{0}\"", x.ToString());
            Console.WriteLine("GetHashCode();{0}", x.GetHashCode());
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            Nullable<int> x = 5;
            x = new Nullable<int>(5);
            Console.WriteLine("Instance with value:");
            Display(x);

            Nullable<int> y = new Nullable<int>();
            Console.WriteLine("Instance with value:");
            Display(y);

            Console.ReadLine();
        }
    }
}

Nullable:

这个类可以辅助泛型可空类型做一些事情,它只包含静态方法,不能创建实例。

3个静态方法:

public static int Compare<T>(Nullable<T> n1, Nullable<T> n2)public static bool Equals<T>(Nullable<T> n1, Nullable<T> n2)

第三个方法不是泛型方法:

public static Type GetUnderlyingType<Type nullbaleType>

如果第三个方法的参数是一个可空类型,那么返回它的基础类型,否则返回null。

C#2提供给可空类型的语法:

?修饰符:T? 等价于 Nullable<T>,用法完全一样,只是语法不同,举例如下:

            int? nullable = 5;//定义可空类型
            object boxed = nullable;//装箱
            Console.WriteLine(nullable.GetType());

            int normal = (int)boxed;//拆箱成基础类型
            Console.WriteLine(normal);

            nullable = (int?)boxed;//拆箱成可空类型
            Console.WriteLine(nullable);

            nullable = new int?();//将可空类型变量初始化为空值
            boxed = nullable;//装箱
            Console.WriteLine(boxed==null);

            nullable = (int?)boxed;//拆箱成可空类型
            Console.WriteLine(nullable.HasValue);

            //将空值可空类型拆箱成基础类型,将抛出异常
            normal = (int)boxed;//拆箱成基础类型
            Console.WriteLine(normal);

使用null进行赋值和比较:

C#允许使用null在比较和赋值中表示一个可空类型的空值,就跟引用类型一样。

值得注意的一个地方:

DataTime? death;

DataTime birth;

求寿命的方法:

public TimeSpan Age

{

    get

    {

        if (death == null) return DataTime.Now - birth;

        return death.Value - birth;

    }

}

此外,null可以作为参数进行传递,代表一个空值可空类型变量

思考:为什么在最后一行代码中要使用death.Value - birth而非death - birth?

可空类型转换:

null 到 T?的隐式转换

T 到 T?的隐式转换

T?到 T 的显式转换

S? 到 T?的转换(显式隐式皆可)

S 到 T?的转换

S?到 T的显示转换

需要注意的是,如果S?是空值,那么S?-->T的显示类型转换会抛出一个异常。

可空类型操作符的提升:略

提几个比较值得注意的地方:

对于比较操作符,(null == null) == true,其它含有null的比较均为false;

对于一元或者二元运算,如果有一个操作数为null,那么运算的结果也是一个null,即空值。

可空逻辑:

bool? a, b;

此时可空布尔类型有三种值,true, false, null。

此时布尔表达式的值取决于,如果空值的取值对布尔表达式的值有影响,那么布尔表达式的值为null。布尔表达式的值为确定的布尔表达式的值。

空接合操作符:??

对于表达式:first??second

(1) 求first的值

(2) 如果first的值非空,那么first的值就为表达式的值

(3) 否则表达式的值为second的值

因此,如前所述的代码:

        if (death == null) return DataTime.Now - birth;

        return death.Value - birth;

可以写成:

        return (death??DataTime.Now) - birth;

现在回答一下前面红色标注的问题:

若使用death - birth,其结果是一个DataTime?,因为从T到T?存在一个隐式类型转换,而反过来的转换泽必定是显式的。直接使用death肯定是可以的,但是需要作者对返回的结果再进行处理。

C#中可空值类型与引用类型的深入探讨 本文深入探讨了C#编程语言中的可空值类型与引用类型的概念、特性及其使用场景。首先解析了可空值类型如何通过简写形式`T?`表示其基础值类型的所有值以及null值。接着分析了引用类型的基本概念,包括引用类型与值类型的对比、内置引用类型以及数组类型的特殊性。此外,文中还介绍了可空引用类型以及动态类型的特点,包括它们的使用方法和注意事项。最后,文章概述了常量和变量的基本概念,以及局部常量的声明方式。... 阅读详情

相关推荐

基因家族扩张收缩分析可视化(CAFE5)

CafePlotter 是一个用于可视化 CAFE5 基因家族扩张收缩分析结果的 Python 工具

xuzhougeng blog 3636

判断OBject对象为空

/** * 判断Object对象为空或空字符串 * @param obj * @return */ public static Boolean isObjectNotEmpty(Object obj) { String str = ObjectUtils.toString(obj, “”); return StringUtils.isNotBlank(str); } 在项目中很多情况下,通过接口获...

傲娇青年的博客 3482

从波士顿动力SpotMini拆解看四足机器人机械设计:关节布局与电机选型的5个关键决策点

本文深入解析波士顿动力SpotMini四足机器人的机械设计,聚焦关节布局与电机选型的5个关键决策点。通过拆解髋关节偏移距、膝关节传动链、电机热管理等核心设计,揭示商业级四足机器人的工程智慧,为工业巡检、物流机器人等应用提供实用参考。

postgres8guard的博客 892

C#和Unity的Object、Object之间的相等比较操作以及Object的空检查(null check)

C#和Unity的Object、Object之间的相等比较操作以及Object的空检查(null check)

行为树 2796

AI算力网络与通信领域流量分析:优化策略探讨_副本

今天的AI就像一个"超级吃货",每天要"吃"掉海量数据、“消耗"巨量算力——训练一个千亿参数的大模型,可能需要上万块GPU同时工作数周,其间产生的数据传输量足以填满数百万个1TB硬盘。这些GPU和计算节点通过网络连接形成"AI算力网络”,而数据在节点间的流动就是"通信流量"。如果把算力比作AI的"肌肉",那流量就是"血液"——血液不通畅,肌肉再强也使不上劲。

AI天才研究院 1198

Qt Coordinate System

Qt 坐标系统Qt 坐标系统 数学基础 Qt坐标系统 视口 平移变换 缩放变换 setWindow 旋转 总结数学基础 矩阵与线性变换坐标系变换Qt坐标系统 视口和OpenGL一样,视口确定了画面在窗口(QWidget)中显示的区域,Qt的绘图坐标会完全映射到视口(View port)上,就像图示一样。默认情况下,窗口和视口是重合的,视口的大小覆盖了整个窗口。和OpenGL一样,Qt的QPa

unclerunning的博客 1151

C#判断字符串对象是否为空的几种方式

① 字符串对象有初始值且不为null时使用:object.Length() == 0      Tips:此方法效率最高但在使用时可能产生异常。 ② object == string.Empty 和 object == ""      Tips:此两项方法前者的效率要略高于后者,但均逊于object.Length() == 0,使用时不会产生异常。 ③ 判断字符串对象是否存在以及是否为空:string.IsN

WanAkiko. 7621

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份全面的IEC61850通信协议测试验证实战指南,强调测试必须从理论走向工程实践。文章详细讲解了如何搭建测试环境,并深入剖析了MMS、GOOSE、SV三大核心协议的实战测试方法,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备的互操作性与通信可靠性。

weixin_29204121的博客 170

判断Object(变量为{}的值)是否为空

判断Object(变量为{}的值)是否为空,实例如下: let varObject = {}; if( JSON.stringify(varObject) == "{}" ) { console.log("为空") }

weixin_40667880的博客 1446

GD32_ADC采样+DMA多通道扫描传输

所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

Yin_w的博客 8159

Unity零基础到入门 ☀️| 基础知识入门篇章,看完就可以做游戏啦! | 寻找C站宝藏

Unity入门基础知识。本篇文章介绍了关于Unity入门的一些基础知识,包括基本概念和使用实例。简单易上手,轻松实现Unity入门操作!

努力前行,总会成为自己心中的那道光 1万+

C# 可空值类型

C#可空值类型

鲤籽鲲的博客 1413

【FISCO-BCOS】十一、一键部署

一键部署包括以下服务:节点(FISCO-BCOS 2.0+)、管理平台(WeBASE-Web)、节点管理子系统(WeBASE-Node-Manager)、节点前置子系统(WeBASE-Front)、签名服务(WeBASE-Sign)。部署成功后,登录此网站:http://localhost:5000 访问WeBASE管理平台。快速搭建WeBASE管理台环境,方便用户快速体验WeBASE管理平台。修改节点管理子系统和签名服务组系统的mysql数据库配置。如使用root账户:改为。配置方法:参考如下指令。

naihe_fish的博客 2596

《CLR via C#》基本类型.可空值类型

19.可空值类型 19.1C#对可空值类型的支持

陈云佳的专栏 412

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【原理】C# 可空值类型底层实现与使用

C#可空值类型(Nullable)专题解析:从基础到游戏开发应用 本文系统介绍了C#中的可空值类型特性。主要内容包括: 基础概念:通过?后缀或Nullable<T>声明,允许值类型表示null 实现原理:底层采用包含值字段和标志位的结构体实现 发展历程:C#2.0引入,主要解决数据库映射和业务逻辑中的值缺失问题 核心优势:避免特殊值占用、简化代码、精确表达业务语义 游戏开发应用: 角色移动目标位置追踪 物品拾取状态管理 技能冷却计时处理 可空类型显著提升了代码的清晰度和健壮性,是处理值缺失场景的

设计 AI 玩游戏🎮 1645

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C#基础-可空值类型

//可空值类型,相当于掉率nullabe这个结构,结构里面有value和hasvalue两个属性,当给n赋值时,hasvalue=true,当给n=null是,hasvalue=false。 int? n = 10; Console.WriteLine(n.HasValue); Console.WriteLine(n.Val...

BowenXu11的博客 552

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

CLR via C#可空值类型

  我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身。遗憾的是,这在某些情况下会成为问题。例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型。但是,数据库中的一个列可能允许值为空;用Microsoft .NET Framework处理数据库可能变得相当困难,因为在CLR中,没有办法将一个Int32值表示为null.  Mic...

147

【C#进阶系列】19 可空值类型

可空值类型,正如字面意义上的,是可以为NULL的值类型。 这个东西存在的意义可以解决比如数据库的的Int可以为NUll的情况,使得处理数据库数据更简单。 实际上可空值类型就是Nullable<T>这个泛型值类型,而C#有一种更简单的语法糖是int?这种用法: Nullable<Int32> 数据库类型 = null; float? 可以为空的浮点类型 ...

ZQ13771472517的博客 168

C#中的可空值类型介绍

  由于一个值类型变量永远不可能为null,而数据库中的一个列是允许值为空的,为了与数据库中的列相对应,CLR引入了可空值类型。 C#中是以问号表示法声明并初始化可空值类型的,如下代码所示: #001 int? x=5; #002 int? y=null; ...

weixin_33851177的博客 122

C#中可空值类型的一些细节

可空值类型的几种实现:模式1:Magic Number 魔值该模式是牺牲一个值来专门表示空值,此模式的优势就是仅仅牺牲一个值,不会浪费任何内存,并且也不需要添加任何新的类型。该模式是IEE-754 浮点类型中所使用的,如 NaN。 模式2:引用类型包装该模式可采取两种形式。较简单的形式是直接使用Object作为变量类型,并根据需要进行装箱、拆箱。较复杂的形式是假定值类型A可空,就可为其准备一个新的引

MaloryVer9的博客 856

c#可空值类型

可空值类型,正如字面意义上的,是可以为NULL的值类型。 这个东西存在的意义可以解决比如数据库的的Int可以为NUll的情况,使得处理数据库数据更简单。 实际上可空值类型就是Nullable<T>这个泛型值类型,而C#有一种更简单的语法糖是int?这种用法: Nullable<Int32> 数据库类型 = null; float? 可以为空的浮点类型 = nul...

weixin_30291791的博客 233

C#中的可空值类型

  C# 不允许把 null 赋给一个值类型的数据。在 C# 中,以下语句是非法的: int a = null;    // 非法      但是,利用 C# 定义的一个修饰符,可将一个变量声明为一个可空(nullable)值类型。可空值类型在行为上与普通值类型相似,但可以将一个 null 值赋给它。如下所示: int? a = null;      // 合法   当把一个变量定义为可...

weixin_34278190的博客 155

小议C#中的可空值类型

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

Richard_jun's Blog 1245
上一篇: .net Cookie的用法
下一篇: LINQ查询表达式中使用对象初始化器
VS_URL
博客等级 码龄15年 12粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值