【C#基础教程】第二十二章、可空类型、匿名方法、迭代器

C#编程中的匿名方法与迭代器的精妙应用 本文深入探讨了C#编程语言中的匿名方法和迭代器的特性及其应用。通过实例分析了匿名方法如何简化事件处理代码,以及迭代器如何简化枚举器的实现并提供优雅的方式来控制集合的枚举过程。... 阅读详情

目录

1.可空类型

1.1空合并操作符(??操作符)

2.匿名方法

3.迭代器


1.可空类型

  可空类型的定义:可空类型是包含null值的值类型。

  可空类型的语法:   值类型? 变量名 = null;

  可空类型的编译过程:int?会被编译器编译成Nullable<int>类型

  可空类型的使用:判断可空类型的两种情况(有值、无值)的三种方法

//可空类型
double? pi = 3.14;
char? letter = 'a';

//1.可以将 is 运算符与类型模式 结合使用,既检查 null 的可为空值类型的实例,又检索基础类型的值
//is 运算符检查表达式的结果是否与给定的类型相匹配。 
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

//2.使用Nullable<T>.HasValue 指示可为空值类型的实例是否有基础类型的值
//如果 HasValue 为 true,则 Nullable<T>.Value 获取基础类型的值。 
//如果 HasValue 为 false,则 Value 属性将引发 InvalidOperationException。
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

//3.还可将可为空的值类型的变量与 null 进行比较,而不是使用 HasValue 属性。

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

1.1空合并操作符(??操作符)

  空合并操作符的作用:它会对左右两个数进行判断。如果左边的数为null,则返回右边的数;如果左边的数不为null,则返回左边的数。

  使用空合并操作符的要求:可用于引用类型和可空类型,但不能用于值类型。

  • 不能用值类型的原因:??运算符会将左边的数与null比较,但除了可空类型,其他的值类型不能与null进行比较。

  空合并操作符的使用:

string firstName = null;
string fullName = firstName ?? "Jack";
Console.WriteLine(fullName);

2.匿名方法

  匿名方法的定义:没有名字的方法。因为没有名字,匿名方法只能在函数调用(匿名方法是把方法的定义和实现嵌套在了一起)的时候被定义。但在编译器编译时,会给匿名方法生成一个方法名

  匿名方法的意义:匿名方法同样建立在委托之上,它的存在可以简化代码。

  匿名方法的缺陷:

  • 不能在其他地方被调用,不然会形成“闭包”。闭包会演唱外部变量的生命周期。
    •   闭包形成的条件:当一个外部函数包含另一个内部函数的调用时,或内部函数使用外部函数的变量时,都会形成闭包。
    •   外部函数的判别:在方法块内的为内部函数,在方法块外的为外部函数。

  使用匿名方法的对比:

1.没使用匿名方法

public class Program
{
    delegate void MyDelegate(int a,int b);
    static void Main(string[] args)
    {
        //显式实例化委托
        MyDelegate myDelegate = new MyDelegate(Operation.Add);
        //隐式实例化委托
        MyDelegate myDelegate = Operation.Add;
        
        //隐式调用委托
        myDelegate(1,3);
    }
}
static class Operation
{
    static void Add(int a,int b)
    {
        Console.Writeline("两数相加,结果为{0}",a+b);
    }
}

2.使用匿名方法

public class Program
{
    delegate void MyDelegate(int a,int b);
    static void Main(string[] args)
    {
        //显式实例化委托
        MyDelegate myDelegate = new MyDelegate(Operation.Add)
        {
            Console.Writeline("两数相加,结果为{0}",a+b);
        };

        //隐式调用委托
        myDelegate(1,3);
    }
}

3.迭代器

迭代器的定义:记录集合中的某个位置,它使程序只能向前移动。foreach就是使用迭代器来实现功能的

 暂略

C# 2.0源码精读:泛型、迭代器与匿名方法的底层原理与实战 C#作为一门持续演进的语言,其2.0版本是关键的分水岭。泛型解决了值类型装箱拆箱的性能损耗,并让类型安全从运行时提前到编译期;迭代器通过yield return由编译器生成状态机,实现了延迟遍历;可空类型为数据库NULL映射提供了原生支持;匿名方法则极大丰富了委托回调的书写方式。这四个特性看似独立,却在运行时和编译器层面深度联动,理解它们能帮助你从根本上掌握现代C#的底层逻辑。无论是排查集合操作的性能陷阱、处理闭包捕获循环变量的经典问题,还是理解Nullable<T>的装箱规则,源码级分析都是最可靠的路径。 阅读详情

相关推荐

C#2.0源码实战:泛型/匿名方法/迭代器底层解析

C#2.0是.NET Framework 2.0的语言基石,首次完整引入泛型、匿名方法、迭代器块、部分类和可空类型五大核心特性。这些特性并非历史遗迹,而是ASP.NET WebForms及早期MVC运行时的底层契约,深刻影响着线程上下文、ViewState序列化、内存分配与数据库NULL映射等关键行为。理解其IL生成机制(如constrained.指令、c__DisplayClass闭包、d__0状态机)有助于精准定位装箱开销、异步上下文丢失、内存泄漏等遗留系统顽疾。本文聚焦C#2.0源码包的工程化实践,覆

weixin_31309419的博客 275

C# 入门一一可空类型、匿名方法和迭代器

一、可空类型 定义:可空类型也是值类型,但它是包含null值的值类型。有两种表示方式,如下: //T?a 类型 ---第一种 int? value = 1; //Nullable&lt;T&gt; ---第二种 Nullable&lt;int&gt; value = 1; 代码可以通过HasValue属性来判断可空类型是否有值:如果有值则直接输出可空类型的值;如果没有值,...

xuanyin235的专栏 407

C# 2.0宝典源码解读:泛型、yield与可空类型背后的设计智慧

编程语言的发展总有其历史脉络,理解旧版本的核心特性,往往能帮助我们更深刻地掌握现代语法。C# 2.0作为语言演进的重要里程碑,引入了泛型、匿名方法、迭代器、可空值类型等基础能力,这些机制至今仍是.NET开发的基石。泛型从CLR层面提供类型安全的集合操作,避免了装箱拆箱的性能损耗;yield关键字通过编译器生成状态机,简化了集合遍历的实现逻辑;可空值类型则让数据库NULL映射变得更加自然。这些设计不仅解决了当时的痛点,也为后续Lambda、async/await等高级特性铺平了道路。在实际工程中,无论是维护老

weixin_33483304的博客 259

C# 学习笔记 10.可空类型,匿名方法,迭代器

1.可空类型 1.可空类型也是值类型,但是它包含了null值的值类型。 表示一个可空类型 int i = null;// 报错 无法将 null 转换为“int”,因为后者是不可以为 null 的值类型 int? i = null; 编译通过 //但是c#中肯定没有int?这个类型,编译器会解释Nullable<int> 类型,即可空类型。 可空类型的定义是 public struct Nullable<T> where T : struct //定义 Nulla...

xiao_shentong的博客 362

KUKA机器人自动回原点程序

创建两个全局变量分别用于储存机器人的笛卡尔姿态与关节角姿态。打开System文件夹中的config文件创建全局变量的点位。在USER GROBALS用户自定义变量Userdefined variables下创建一个E6POS类型的点位,一个E6AXIS类型的点位。

A567852的博客 5212

STM32使用ASR01语音播报模块

自己再根据鹿小班模块进行操作进行相关操作,先接上usb数据线。这里提供一套修改好的天问程序模板和stm32f103模板。这里使用的asr01语音播报模块是模块化编程。这里使用的asr01语音播报模块是模块化编程。记得先生成模型再去编译下载。先下载天问block软件。

lml1781978327的博客 1万+

C#可空类型,匿名方法,迭代器,自动实现属性,隐式类型,对象集合初始化器,匿名类型,Lambda表达式,变量范围

1、可空类型:引用类型的默认值为null,值类型的默认值为0。但有时候会需要值类型的值为null,故而有了非空类型。eg、(1)、public static void Main(){ int? a = null;//可空类型,并没有int?这种类型,这只是C#提供的一种方便形式,编译器会自动去转化 Console.WriteLine (a); Nullable&lt;int&gt; b = nul...

qq_35335038的博客 497

手教你如何使用Simulink和相关工具箱模拟和实现无人机的多机接力信号中继的建模

扩大通信范围:单架无人机的通信能力有限,通过多机接力的方式可以显著扩展通信覆盖范围。提高可靠性:当某架无人机出现故障或电量不足时,其他无人机可以接管其任务,确保通信不中断。适应复杂环境:在山区、森林等复杂地形中,多机接力可以绕过障碍物,建立稳定的通信链路。使用Communications Toolbox中的模块来模拟无线通信链路。例如,可以使用模块模拟噪声信道,或者使用模块计算信号衰减。matlab深色版本。

MHD0815的博客 767

[读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器

前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法。 另外C#2.0还提出了可空类型,匿名方法和迭代器3个优美的特性。 1,泛型 1.1 泛型是什么 泛型的英文表述是"generic", 这个单词意为通用的。从字面意思可知,泛型代表的就是"通用类型",它可以代替任意的数据类型,

tyfbhlxd的博客 318

(侧边抽屉)移动端APP汉堡页设计全解:从规范落地到体验优化

汉堡页是一种隐藏式侧边导航组件,由汉堡图标(三条水平横线)、侧边抽屉面板、主界面遮罩层三部分构成。点击汉堡图标后,面板通常从左侧滑入,覆盖主界面部分区域(或悬浮于主界面之上);关闭时可通过点击关闭按钮、遮罩层、返回键或侧滑手势完成,是移动端特有的空间优化设计模式。

qq_67370502的博客 615

全网详细解决:无法将 “xxx” 项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次

全网详细解决:无法将 “xxx” 项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

念兮为美 5万+

C# 2.0中的匿名方法

 匿名方法的由来没有匿名方法的时候(C# 1.0)addButton.Click += new EventHandler(AddClick);void AddClick(object sender,EventArgs e){   listBox.Items.Add(textBox.Text);}有了匿名方法之后(C# 2.0)addButton.Click += delegat

BraveHeart专栏 1210

【人工智能之深度学习】15. 工业时序预测实战:LSTM与TCN融合的装备故障预警系统设计与实现

摘要:工业装备故障预警是智能制造领域的核心技术之一,其通过分析传感器时序数据实现故障提前预测,可显著降低运维成本并提升设备可靠性。本文针对工业时序数据多源异构、非平稳性、噪声干扰及样本不平衡等挑战,提出一种LSTM与TCN融合的故障预警架构——利用TCN捕捉局部时序特征,结合注意力增强LSTM建模长期依赖关系,通过门控机制实现特征自适应融合。以3MW风电齿轮箱为研究对象,设计包含数据预处理、特征工程、模型训练及部署的完整流程,实验结果表明,该融合模型准确率达94.6%,故障预测提前量较单一模型提升30%以上

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1441

C# 可空类型 匿名方法 迭代器

可空类型Demo using System; namespace NullDemo { class Program { static void Main(string[] args) { //?语法糖 DateTime? date= null; int? a = nul...

DanielChen的博客 250

pyradiomics使用——1. 医学影像的组学特征值(Radiomics Features)提取

文章目录1. 使用插件1.1 插件安装1.2 插件使用2. 使用python代码2.1 安装2.2 使用2.2.1 官方示例2.2.2 快速使用2.2.3 其它使用3. 组学特征字段意义说明 Github地址:https://github.com/AIM-Harvard/pyradiomics 官方文档地址:https://pyradiomics.readthedocs.io/en/latest/features.html 1. 使用插件 从pyradiomics的Github仓库中可以知道,pyradio

啷个哩个啷 7369

《网络安全自学教程》- OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

OSI分哪七层,每层的作用是什么,解释数据在七层模型中是怎样传输的,封包和解封过程,数据包在每一层是怎么封装和解封的。

wangyuxiang946的博客 1万+

c#2.0的新功能(三):分部类、匿名方法等

一、分部类1、定义partial class A{         string aa;} partial class A{        void DoTest() {...}}其实就是class A{         string aa;         void DoTest() {...}}2、好处(1). 可以把一个类的定义

甜心奶酪的专栏 739

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# Linq,扩展方法,迭代器,Lambda

C# Linq,扩展方法,迭代器,Lambda 1.匿名类: 假设存在Student实体表。 // 第一种: Student student = new Student(); student.Id = 1; student.Name = "大水治禹"; student.Age = 25; student.ClassId = 2; // 第二种: Student student = new Student() { Id = 1, Name = "

u012577058的博客 239

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C# 语法中级

C# 语法中级lambda 表达式1. 捕获外部变量2. 捕获迭代变量匿名类型匿名方法异常相关1. 枚举器2. 可枚举对象3. 迭代器3. 迭代器语义4. yield break 语句5. 组合序列可空类型1. Nullable< T > 结构体lambda 表达式 编译器在内部将l...

cnzzs的博客 690

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C#2.0学习7--匿名方法,迭代器

 一、匿名方法1.匿名方法的由来• 没有匿名方法的时候(C# 1.0):addButton.Click += new EventHandler (AddClick) ;void AddClick(object sender, EventArgs e) {listBox.Items.Add(textBox.Text);}• 有了匿名方法之后(C# 2.0):add

gongchl2006的专栏 1175

C#进阶08——迭代器、特殊语法

迭代器、特殊语法

weixin_45274937的博客 508

C#学习笔记(六):可空类型、匿名方法和迭代器

可空类型 为啥要引入可空类型? 在数据库中,字段是可以为null值的,那么在C#中为了方便的操作数据库的值,微软引入了可空类型。 声明可空类型 我们可以使用两种方法声明一个可空类型: 1 Nullable<int> i = null; 2 int? i = null; 第二行是第一行的简写方法,其中“?”是微软为可空类型提供的一个语法糖。 我们看看可空类型的实现...

weixin_30838921的博客 87

详解C# 迭代器

迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式。简单来说,迭代器模式使得你能够获取到序列中的所有元素而不用关心是其类型是array,list,linked list或者是其他什么序列结构。这一点使得能够非常高效的构建数据处理通道(data pipeline)--即数据能够进入处理通道,进行一系列的变换

zlzzlzzlz的专栏 2926

C# 2.0 匿名方法、迭代器

匿名方法的由来没有匿名方法的时候(C# 1.0)addButton.Click += new EventHandler(AddClick);void AddClick(object sender,EventArgs e){   listBox.Items.Add(textBox.Text);}有了匿名方法之后(C# 2.0)addButton.Click += delegate

531

C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器

前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法。另外C#2.0还提出了可空类型,匿名方法和迭代器3个优美的特性。 1,泛型1.1 泛型是什么泛型的英文表述是"generic", 这个单词意为通用的。从字面意思可知,泛型代表的就是"通用类型",它可以代替任意的数据类型,使类型参数化,从而达...

weixin_30852367的博客 163
上一篇: 【C#基础教程】第二十一章、泛型
下一篇: 【C#基础教程】第二十三章、Lambda表达式
Ohrkaninchen
博客等级 码龄5年 18粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Ohrkaninchen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值