C# 中鲜为人知的强大运算符

C# 还提供了一些"冷门"但功能强大的运算符,这些运算符在特定场景下能极大简化代码并提高效率。

1. 空合并赋值运算符 ??=

// 传统写法
if (variable == null)
{variable = defaultValue;
}// 使用 ??=
variable ??= defaultValue;

功能
当变量为 null 时,将右侧的值赋给它

实际应用

// 延迟初始化
private List<Item> _items;
public List<Item> Items => _items ??= new List<Item>();// 配置默认值
void LoadSettings()
{_qualityLevel ??= QualityLevel.High;_resolution ??= new Resolution(1920, 1080);
}

2. 空条件运算符 ?.?[]

// 安全访问成员
string name = user?.Profile?.Name;// 安全访问索引器
int? firstScore = scores?[0];// 安全调用方法
user?.Validate();

功能
在访问成员、调用方法或访问索引器时,如果对象为 null,则返回 null 而不是抛出异常

实际应用

// Unity 中安全访问组件
Rigidbody rb = go?.GetComponent<Rigidbody>();// 安全访问字典值
var config = settings?.GetSection("Graphics")?["Resolution"];

3. 范围运算符 ..

int[] numbers = { 0, 1, 2, 3, 4, 5 };
var slice = numbers[1..4]; // [1, 2, 3]
var allButFirst = numbers[1..]; // [1, 2, 3, 4, 5]
var lastThree = numbers[^3..]; // [3, 4, 5]

功能
创建数组或集合的切片视图

实际应用

// 处理部分数据
ProcessFrames(videoFrames[10..20]);// 获取子字符串
string domain = email[(email.IndexOf('@') + 1)..];

4. 索引运算符 ^

int[] numbers = { 0, 1, 2, 3, 4, 5 };
int last = numbers; // 5
int secondLast = numbers; // 4

功能
从集合末尾开始索引

实际应用

// 获取路径最后部分
string fileName = path.Split('/');// 检查最后几个元素
if (samples[^3..].All(s => s > threshold))
{// 最后三个样本都超过阈值
}

5. 模式匹配中的 isswitch 表达式

// is 模式匹配
if (obj is string { Length: > 5 } s)
{Console.WriteLine($"长字符串: {s}");
}// switch 表达式
var message = input switch
{int i when i > 0 => "正数",int i when i < 0 => "负数",int => "零",_ => "非数字"
};

功能
强大的类型检查和值提取

实际应用

// Unity 组件处理
void ProcessComponent(Component comp)
{switch (comp){case Rigidbody rb:rb.velocity = Vector3.zero;break;case Renderer rend when rend.material != null:rend.material.color = Color.red;break;case null:Debug.LogWarning("组件丢失");break;}
}

6. 弃元运算符 _

// 忽略不需要的输出参数
_ = int.TryParse("123", out _);// 忽略不需要的返回值
_ = Task.Run(() => BackgroundProcess());// 模式匹配中忽略部分值
if (point is (0, _))
{// X坐标为0的所有点
}

功能
明确表示忽略某个值

实际应用

// Unity 事件处理
button.onClick.AddListener(_ => 
{// 不需要事件参数PlaySound();
});// 解构忽略部分值
var (x, _, z) = GetPosition();

7. 命名参数和可选参数

void ConfigureServer(string host, int port = 8080, bool ssl = false)
{// ...
}// 调用时
ConfigureServer("example.com", ssl: true);

功能
提高代码可读性并简化重载

实际应用

// Unity 实例化对象
Instantiate(prefab, position: spawnPoint.position,rotation: Quaternion.identity,parent: transform
);// 创建颜色
var color = new Color(r: 0.5f, g: 0.7f, b: 1f);

8. 插值字符串 $

string name = "Alice";
int age = 30;
string message = $"{name} is {age} years old";

功能
更简洁的字符串格式化

高级用法

// 格式控制
$"Price: {price:C2}" // 货币格式// 表达式计算
$"Area: {width * height}"// 对齐
$"{"Name",-10} {"Age",5}"

9. 联合 switch 表达式

var result = operation switch
{"add" => a + b,"sub" => a - b,"mul" => a * b,"div" when b != 0 => a / b,_ => throw new InvalidOperationException()
};

功能
更简洁的模式匹配语法

实际应用

// Unity 状态处理
currentState = input switch
{InputType.Jump when isGrounded => PlayerState.Jumping,InputType.Attack => PlayerState.Attacking,InputType.Dash when canDash => PlayerState.Dashing,_ => currentState
};

10. 委托合并运算符 +-

event Action OnEvent;void Subscribe()
{OnEvent += Handler1;OnEvent += Handler2;
}void Unsubscribe()
{OnEvent -= Handler1;
}

功能
管理事件订阅

实际应用

// Unity 事件管理
button.onClick.AddListener(OnClick);
// ...
button.onClick.RemoveListener(OnClick);// 多播委托
Action multiAction = MethodA;
multiAction += MethodB;
multiAction(); // 调用 MethodA 和 MethodB

实用技巧:组合使用运算符

// 安全访问并设置默认值
string username = user?.Profile?.Name ?? "Guest";// 安全访问数组元素
int? score = scores?[index] ?? 0;// 模式匹配与空检查
if (obj is Player { Health: > 0 } player)
{player.Respawn();
}

这些运算符虽然相对"冷门",但在实际开发中能极大提升代码的简洁性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89878.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89878.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89878.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用window字体替换zabbix 默认的字体

我们先需要在windows系统下的C:\Windows\Fonts目录&#xff0c;找到一个喜欢的字体&#xff0c;我选择的是微软雅黑。复制到其它路径下&#xff0c;选取一个msyh.ttc。到服务器上。要把msyh.ttc改为msyh.ttf才可以。不然最后中英文都不显示[roothadoop105.yinzhengjie.com ~]# …

MySQL 17 如何正确地显示随机消息?

假设有一个场景&#xff0c;一个英语学习APP首页有一个随机显示单词的功能&#xff0c;用户每次访问首页的时候&#xff0c;都会随机滚动显示三个单词。 已知表里有10000条记录&#xff0c;来看看随机选择3个单词有什么方法&#xff0c;又存在什么问题。 建表语句&#xff1a…

7-Zip 曝出两个可导致拒绝服务的中危漏洞

研究人员在全球使用最广泛的开源文件压缩软件7-Zip中新发现两个漏洞&#xff08;CVE-2025-53816和CVE-2025-53817&#xff09;。这两个漏洞影响7-Zip 25.0.0之前的所有版本&#xff0c;虽然不能实现远程代码执行&#xff0c;但可能引发内存损坏和拒绝服务&#xff08;Denial of…

史上最简单Conda+Ollama+Open-Webui安装方法!

史上最简单CondaOllamaOpen-Webui安装方法 一、安装Anaconda 1、到Anaconda官网下载conda_24.10.1 链接&#xff1a;https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Windows-x86_64.exe 2.双击安装包&#xff0c;开始安装 选择All Users 切记安装路径不要选C盘&am…

Python-数据库概念-pymysql-元编程-SQLAlchemy-学习笔记

序 欠4前年的一份笔记 &#xff0c;献给今后的自己。 数据库 概念 数据库&#xff1a;按照数据结构来组织、存储、管理数据的仓库。 诞生 计算机的发明是为了做科学计算的&#xff0c;而科学计算需要大量的数据输入和输出。 早期&#xff0c;可以使用打孔卡片的孔、灯泡的亮灭来…

Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上

借助 U 盘或 TF 卡拷贝程序到开发板上我们已经学习了怎么在 ubuntu 和 windows 上互传文件&#xff0c;那么怎么把 ubuntu 或 win 上的程序拷贝到开发板呢&#xff0c;这里给大家介绍第一种方法&#xff0c;使用 U 盘或者 TF 卡来完成&#xff0c;如果大家使用的是 U 盘&#x…

【亲测有效】防检测插件playwright_stealth 2.X版本快速使用

这里写自定义目录标题核心方法apply_stealth_syncuse_sync和use_async一. playwright_stealth 2.0以上版本1.同步方法2.异步方法3.实例二.playwright_stealth 2.0以下版本playwright-stealth 是一个用于 Playwright 的库&#xff0c;旨在帮助自动化脚本避开一些检测机制&#x…

docker安装与简单项目上手

1.docker安装 系统版本为almalinux9.6 首先添加一下docker的软件安装源&#xff08;源选择的阿里云&#xff0c;只要是rhel的系统都适用&#xff0c;无论是rockylinux还是almalinux还是红帽企业版&#xff09; dnf config-manager --add-repo https://mirrors.aliyun.com/doc…

计算机网络基础:从协议到通信全解析(大致框架)

本节重点&#xff1a;1.了解网络发展背景&#xff0c;对局域网/广域网的概念有基本认识2.了解网络协议的意义&#xff0c;重点理解TCP/IP五层结构模型3.学习网络传输的基本流程&#xff0c;理解封装和解包分用一、计算机网络发展背景&#xff1a;人与人之间是需要协同工作的&am…

PDF 编辑器:多文件合并 拆分 旋转 顺序随便调 加水印 密码锁 页码背景

各位打工人、学生党们&#xff0c;你们是不是也遇到过这种情况&#xff0c;领导甩来一个PDF让你改&#xff0c;结果你捣鼓半天&#xff0c;发现这玩意儿根本动不了&#xff0c;简直想原地爆炸&#xff01;别急别急&#xff0c;今天就给你们安利一个办公软件——PDF编辑器&#…

【软件基础学习配置那些事 4-3】3ds Max2026 菜单栏常用命令-----文件、视图、编辑、工具、组

3ds Max学习的笔记小知识&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;后续都会补充添加&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;个人的一些学习笔记&#xff0c;如有不对&#xff0c;欢迎订正&am…

网络爬虫的介绍

网络爬虫库网络爬虫通俗来讲就是使用代码将HTML网页的内容下载到本地的过程。爬取网页主要是为了获取网中的关键信息&#xff0c;例如网页中的数据、图片、视频等。Python语言中提供了多个具有爬虫功能的库&#xff0c;下面将具的介绍。urlib库:是Python自带的标准库&#xff0…

C# 编程实战进阶:字符串与字符串数组 (3)

目录 1、给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 2、无重复字符的最长字符串 &#xff0c;给定一个字符串 s 请你找出其中不含有重复字符的最长字符串的长度。 3、给定两个字符串 s 和 t &#xff0c;它们只包含小…

Python趣味算法:百钱百鸡问题——双重循环优化与算法效率分析

如何用Python解决中国古代数学难题?本文从暴力枚举到高效优化,带你领略算法之美,效率提升100倍! 看在每天坚持分享有趣知识的份上,点个关注吧(づ ̄ 3 ̄)づ 关注是我更新的动力 ̄︶ ̄∗ ̄︶ ̄∗) 作者会分享更多涉及到各种编程语言的有趣知识!(^∀^●)ノシ 目录 …

JAVA_TWO-初识Java2

1.IDEA管理Java程序的结构2.idea编译后的class文件在哪在工程out文件夹下。3.idea一些快捷键4.导入模块File→New→Module from Existing Sources → 添加后缀.iml文件5.注释单行注释 //多行注释 /* 注释内容1注释内容2 */文档注释 /** 注释内容 */ &#xff08;文档注释内容可…

二、Dify 版本升级教程(LInux-openeuler)

首先&#xff0c;你需要先按照好dify&#xff0c;然后才能升级&#xff0c;本文教程是基与Docker Compose 如果你还没有安装&#xff0c;可以看看这个教程。 一、Dify 私有部署、本地安装教程&#xff08;LInux-openeuler&#xff09;_dify1.5版本部署-CSDN博客 安装完成后&a…

Java 大视界 -- Java 大数据在智能安防门禁系统中的多生物特征融合识别与权限管理(280)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 本博…

【Tools】Ubuntu24.04安装详细教程

00. 目录 文章目录00. 目录01. Ubuntu 24.04简介02. Ubuntu 24.04下载03. Ubuntu 24.04虚拟机创建04. Ubuntu 24.04安装步骤05. Ubuntu 24.04常用软件06. 附录01. Ubuntu 24.04简介 Ubuntu 24.04 LTS&#xff08;代号“Noble Numbat”&#xff09;是Canonical于2024年4月25日发…

linux基础入门Ubuntu 22.04 系统中添加、删除和授予用户 sudo权限

在 Ubuntu 中&#xff0c;sudo 允许授权用户以 root 级别权限执行任务&#xff0c;即使他们不知道 root 用户密码。这对于执行管理任务非常重要&#xff0c;因为它可以避免直接使用 root 用户&#xff0c;从而减少系统被误操作的风险&#xff0c;同时在企业生产中由于ubuntu系统…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1

问题描述使用git bash, cmd运行npm都可以&#xff0c;但是用Power Shell运行npm&#xff0c;却报错&#xff1a;npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/…