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值。接着分析了引用类型的基本概念,包括引用类型与值类型的对比、内置引用类型以及数组类型的特殊性。此外,文中还介绍了可空引用类型以及动态类型的特点,包括它们的使用方法和注意事项。最后,文章概述了常量和变量的基本概念,以及局部常量的声明方式。... 阅读详情

相关推荐

Cadence 17.2配置CIS数据库报错?手把手解决ODBC驱动位数不匹配问题

本文详细解析了Cadence 17.2配置CIS数据库时常见的ODBC驱动位数不匹配问题,提供了从系统环境检查到分步解决方案的完整指南。重点解决32位应用程序与64位ODBC驱动之间的架构冲突,包含驱动安装、DSN配置及高级排查技巧,帮助电子工程师快速恢复设计环境。

play7的博客 970

判断OBject对象为空

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

傲娇青年的博客 3482

超声信号处理——硬件电路中的混频应用

本文介绍了超声多普勒系统的信号处理原理。系统通过波形振荡器产生高频信号,经换能器转换为超声波发射,接收反射信号后与原始信号混频,利用三角函数的积化和差特性产生包含多普勒频移的低频差频信号和高频和频信号。通过低通滤波器滤除高频成分后,即可获得纯净的多普勒信号。这种处理方法将MHz级高频信号转换为可听低频信号,降低了系统复杂度与成本。数学推导表明,差频信号频率正好

fcxgfdjy的博客 1123

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

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

行为树 2796

芯片良率提升:从设计到制造的系统性工程实践

在半导体制造领域,良率是衡量生产效率和成本控制的核心指标,直接关系到芯片的经济效益与市场竞争力。其本质是合格芯片占总产出芯片的百分比,提升良率需要从设计源头到制造末端的全流程协同优化。从技术原理看,它涉及可制造性设计、工艺过程控制、缺陷检测与根因分析等多个复杂环节,尤其在先进制程下,随机缺陷和参数变异成为主要挑战。其技术价值不仅在于降低单颗芯片成本,更能加速产品上市、保障可靠性,并成为企业技术实力的关键体现。应用场景贯穿智能手机、数据中心、自动驾驶和人工智能等所有高端芯片领域。本文将结合【芯片制造】与【良率

weixin_42526068的博客 632

自动驾驶技术路线之争:纯视觉与多模态融合的成本与性能博弈

本文深入剖析了自动驾驶领域两大主流技术路线——纯视觉与多模态融合的本质差异。文章从成本结构、性能博弈与商业逻辑等多维度展开,揭示了纯视觉方案在硬件成本与数据算力投入上的权衡,以及多模态融合方案在安全冗余与感知稳定性方面的优势。这场技术路线之争,实则是车企在性能、成本与商业化落地之间寻求平衡的综合博弈。

weixin_29038303的博客 390

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

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

WanAkiko. 7621

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

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

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

weixin_40667880的博客 1446

基于Simulink的压缩空气储能(Compressed Air Energy Storage, CAES)

压缩空气储能(CAES)是一种将电能转化为压缩空气存储在高压容器中,然后在需要时释放空气驱动涡轮机发电的技术。它具有大规模、长寿命和环境友好的特点,在电力系统中用于削峰填谷、频率调节和备用电源等应用。本项目将详细介绍如何在MATLAB/Simulink中搭建一个完整的基于压缩空气储能的系统,并提供具体的代码实现和设计步骤。如果你需要实现更复杂的控制逻辑,可以使用MATLAB Function模块。以下是一个简单的例子,展示了如何在该模块中实现一个条件逻辑:Matlab深色版本Kp = 1;

MHD0815的博客 1274

全面解析 SAP 事务码 LTMOM 的应用与实践

综上所述,事务码 LTMOM 是 SAP 系统中不可或缺的迁移对象维护工具,它不仅提供了对数据迁移对象的精细配置功能,还通过灵活的数据转换规则与异常监控机制,为企业数据从 SAP ERP 向 SAP S/4HANA 的迁移提供了坚实保障。在数据迁移过程中,并非所有的迁移对象都需要同时启用。业内专家普遍认为,未来的系统升级与数据迁移将更注重业务需求的动态变化与数据实时性的要求,而 LTMOM 作为核心工具,其在流程自动化、数据智能校验以及跨系统数据联动方面的能力,将直接影响企业整体数字化转型的成败。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1004

C# 可空值类型

C#可空值类型

鲤籽鲲的博客 1413

【Flink on k8s】- 1 - Flink Kubernetes Operator 简介 2023

Flink Kubernetes Operator 可以与 Kubernetes 的其他功能和工具集成,可以帮助用户快速定位和解决问题。Flink Kubernetes Operator可以在Kubernetes上实现高可用性,以确保 Flink 集群的稳定性和可靠性。Flink Kubernetes Operator 可以快速地部署 Flink 集群,而无需手动配置和管理集群。Flink Kubernetes Operator可以将Flink集群与其他应用程序隔离,以避免资源争用和干扰。

欢迎来到我的博客,一起探索代码里的世界! 1344

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

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

陈云佳的专栏 412

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

设计 AI 玩游戏🎮 1645

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C#基础-可空值类型

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

BowenXu11的博客 552

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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、付费专栏及课程。

余额充值