做淘宝需要知道什么网站吗,什么网站做h5做得好,wordpress 文章 插件,在线浏览器入口在C#中#xff0c;单个下划线 _ 在不同的上下文中有不同的含义和作用#xff1a;1. 弃元#xff08;Discard#xff09;#xff08;C# 7.0#xff09;最常见的用法是作为弃元占位符#xff0c;表示不关心的值#xff1a;csharp// 忽略不需要的返回值
_ So…在C#中单个下划线_在不同的上下文中有不同的含义和作用1.弃元DiscardC# 7.0最常见的用法是作为弃元占位符表示不关心的值csharp// 忽略不需要的返回值 _ SomeMethod(); // 忽略返回值 // 元组解构时忽略某些值 var (name, _, age) GetPerson(); // 只关心name和age // out参数忽略 if (int.TryParse(123, out _)) { Console.WriteLine(解析成功); } // 模式匹配中忽略 if (obj is _) // 匹配任何非null值 { // ... } // switch表达式忽略 var result input switch { _ default // 默认情况 };2.Lambda表达式参数C# 9.0表示忽略的lambda参数csharp// 多个下划线表示多个被忽略的参数 Funcint, int, int func (_, _) 42; // 事件处理中忽略sender和args button.Click (_, _) Console.WriteLine(Clicked);3.数字分隔符C# 7.0提高数字可读性csharpint million 1_000_000; long creditCard 1234_5678_9012_3456; double pi 3.141_592_653_589_793;4.合法的标识符名称可用作变量名但不推荐csharpprivate string _field; // 私有字段常见约定 // 作为临时变量已不推荐因为可能和弃元冲突 var _ 5; // 现在这会被视为弃元5.交互式环境中的特殊变量在C#交互式窗口REPL中_存储上一次操作的结果csharp 1 2 3 _ * 2 // _ 3 6重要注意事项作用域规则弃元_在作用域内可重复使用csharp(var x, _) GetData1(); // 第一个弃元 (var y, _) GetData2(); // 第二个弃元不冲突避免与变量名冲突如果已存在名为_的变量则不能同时用作弃元csharpvar _ 5; // 声明变量 _ SomeMethod(); // 错误_ 已被用作变量类型推断弃元可以是任何类型csharp_ 10; // int _ hello; // string _ new object(); // object使用建议csharp// ✅ 推荐明确使用弃元 public void ProcessData() { var (success, _, error) TryGetData(); if (success) { // 只使用success和error } } // ✅ 推荐忽略不需要的参数 button.Click (_, _) DoSomething(); // ❌ 不推荐使用 _ 作为变量名容易混淆 var _ Calculate(); // 可能被误认为是弃元弃元语法主要目的是提高代码的可读性和性能避免分配不需要的变量是现代C#中处理不需要的值的推荐方式。1.弃元Discard的示例csharpusing System; class Program { static (string, int, string) GetPersonInfo() { return (张三, 25, 北京); } static void Main() { // 示例1元组解构时忽略某些值 Console.WriteLine( 示例1元组解构 ); var (name, _, city) GetPersonInfo(); Console.WriteLine($姓名: {name}); // 张三 Console.WriteLine($城市: {city}); // 北京 // 注意我们没有使用年龄信息用 _ 忽略了 Console.WriteLine(); // 示例2忽略out参数 Console.WriteLine( 示例2忽略out参数 ); if (int.TryParse(123, out _)) { Console.WriteLine(解析成功但我不知道具体值); // 会执行 } if (int.TryParse(abc, out _)) { Console.WriteLine(不会执行); } else { Console.WriteLine(解析失败但我不需要错误信息); // 会执行 } Console.WriteLine(); // 示例3忽略方法返回值 Console.WriteLine( 示例3忽略方法返回值 ); var count 0; _ count; // 忽略递增后的返回值 Console.WriteLine($count现在的值: {count}); // 1 Console.WriteLine(); // 示例4switch表达式中的弃元 Console.WriteLine( 示例4switch表达式 ); string GetGrade(int score) score switch { 90 A, 80 B, 70 C, 60 D, _ F // 默认情况 }; Console.WriteLine($85分: {GetGrade(85)}); // B Console.WriteLine($55分: {GetGrade(55)}); // F Console.WriteLine(); } }输出text 示例1元组解构 姓名: 张三 城市: 北京 示例2忽略out参数 解析成功但我不知道具体值 解析失败但我不需要错误信息 示例3忽略方法返回值 count现在的值: 1 示例4switch表达式 85分: B 55分: F2.实际应用场景对比csharpusing System; using System.Collections.Generic; class Program { // 模拟获取数据的复杂方法 static (bool success, string data, string error) TryGetData() { return (true, 重要数据, null); } static void Main() { Console.WriteLine( 对比使用 vs 不使用 _ ); // 传统写法需要声明不用的变量 var result1 TryGetData(); if (result1.success) { Console.WriteLine($传统获取到数据: {result1.data}); // 但 result1.error 变量还存在虽然没用 } // 使用弃元更清晰不会有不必要的变量 var (success, data, _) TryGetData(); if (success) { Console.WriteLine($弃元获取到数据: {data}); // 没有 error 变量污染作用域 } Console.WriteLine(); // 示例处理列表时的弃元 Console.WriteLine( 处理列表 ); var numbers new Listint { 1, 2, 3, 4, 5 }; // 使用弃元表示我们不关心索引 foreach (var (value, _) in numbers.Select((n, index) (n, index))) { Console.Write(${value} ); // 只输出值1 2 3 4 5 } Console.WriteLine(\n); // 示例与 null 检查的对比 Console.WriteLine( null 检查对比 ); object obj test; // 使用弃元进行模式匹配 if (obj is not null) { Console.WriteLine(对象不为null); } // 与弃元等价 if (obj is _) // 匹配任何非null对象 { Console.WriteLine(对象不为null使用弃元); } } }3.Lambda表达式中的弃元csharpusing System; class Program { static void Main() { Console.WriteLine( Lambda表达式中的弃元 ); // 事件处理传统方式 Button btn1 new Button(); btn1.Click (sender, e) { Console.WriteLine(按钮被点击了); // sender 和 e 都声明了但可能没用到 }; // 使用弃元明确表示我们不关心参数 Button btn2 new Button(); btn2.Click (_, _) { Console.WriteLine(按钮被点击了但我不关心谁点击的); }; // 模拟按钮点击 btn2.OnClick(); Console.WriteLine(); // 示例Func 中的弃元 Funcint, int, int, string formatFunc (a, _, c) $第一个值: {a}, 第三个值: {c}; Console.WriteLine(formatFunc(10, 20, 30)); // 输出第一个值: 10, 第三个值: 30 } } // 模拟Button类 class Button { public event EventHandler Click; public void OnClick() { Click?.Invoke(this, EventArgs.Empty); } }4.数字分隔符示例csharpusing System; class Program { static void Main() { Console.WriteLine( 数字分隔符 ); // 更容易阅读的大数字 int population 1_411_778_724; long creditCard 1234_5678_9012_3456L; double precise 3.141_592_653_589_793; Console.WriteLine($中国人口: {population}); Console.WriteLine($信用卡号: {creditCard}); Console.WriteLine($圆周率: {precise}); // 二进制和十六进制也可以使用 int binary 0b1010_1100_0011_1100; int hex 0xFF_AA_BB_CC; Console.WriteLine($二进制: {binary}); Console.WriteLine($十六进制: 0x{hex:X}); } }主要作用总结提高可读性明确告诉读者这个值我不关心避免未使用变量警告编译器知道你是故意不用的减少内存分配对于大对象特别有用清理作用域避免不必要的变量污染代码更简洁不需要给不用的变量起名字关键理解_就像一个垃圾桶你把不需要的东西扔进去然后就不用管它了。编译器会帮你处理掉这些垃圾不会让它们影响你的代码逻辑。