csharp:运算符

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
csharp:运算符 [2025/11/19 16:55] – [2. ?? 运算符 (双问号)] 张叶安csharp:运算符 [2025/12/22 11:37] (当前版本) 张叶安
行 1: 行 1:
-在 C# 中,`?` 和 `??` 运算符主要用于处理 **null 值(空值)** 以及 **条件逻辑**。它们不仅能简化代码,还能显著提高代码的可读性和安性(防止空引用异常)。+====== C# 常用运算符全 ======
  
-以下是这两个号在不同场景下的详细含义和用法:+C# 提供了丰富的运算符来处理算术、逻辑、位运算以及对象类型操作。除了处理 Null 值的 `?` 和 `??`,以下是其他核心运算符的详细分类讲解。
  
---- +===== 1. 算术运算符 (Arithmetic Operators=====
-### 1. ?运算符 (单问号)+
  
-`?` 在 C# 中有三种主要的法:+于执行基本的数学运算。
  
-#### A. 可空类型修饰符 (Nullable Type Modifier) +^ 运算符 ^ 描述 ^ 示例 ^ 
-用于定义一个**值类型**(如 `int``double``bool``DateTime等)可以存储 `null`+| `+` | 加法 (也用于字符串拼接) | `x + y` 或 `"Hello" + " World"` | 
 +| `-` | 减法 | `x - y` | 
 +| `*` | 乘法 | `x y
 +`/| 除法 (整数相除会截断小数) | `10 / 3结果为 `3` | 
 +| `%` | 取模 (求余数) | `10 % 3` 结果为 `1` | 
 +| `++` | 自增 (前缀或后缀) | `x++` (先用后加) / `++x` (先加后用) | 
 +| `--` | 自减 (前缀或后缀) | `x--`--x|
  
-   **原理**:`int?` 实际上是 `System.Nullable<int>` 的简写。 +<code csharp
- *   **场景**:据库中的数字字段可能为空,或者你需要表示“未设置”的状态。+int a = 10; 
 +int b = 3; 
 +Console.WriteLine(a / b); // 输出 3 (整除法) 
 +Console.WriteLine(a % b); // 输出 1 (余
 +Console.WriteLine(a + " is number"); // 符串拼接 
 +</code>
  
-```csharp +===== 2. 逻辑运算符 (Logical Operators) =====
-int  a 10;    // 正常 int,不能赋值 null +
-int? b null;  // 可空 int,可以赋值 null +
-```+
  
-#### B. 三元条件运算符 (Ternary Conditional Operator) +主要用于布尔 (`bool`逻辑判断,常用于 `if` 或 `while语句中
-这是 `if-else语句的简写形式。 +
-*   **语法**:`condition ? true_value : false_value` +
-*   **含义**:如果条件为真,返回冒号左边的值;否则返回冒号右边的值+
  
-```csharp +^ 运算符 ^ 名称 ^ 描述 ^ 
-int x = 10; +`&&| 逻辑与 (AND| 只有两边都为真,结果才为真。**短路特性**:如果左边为假,右边不再执行。 | 
-string result = (x > 5? "大于5" : "小于等于5"; +`||| 逻辑或 (OR) | 只要有一边为真,结果就为真。**短路特性**:如果左边为真,右边不再执行。 | 
-```+`!` | 逻辑非 (NOT) | 取反,真变假,假变真。 |
  
-#### C. Null 条件运算符 (Null-conditional Operator) - C# 6.0+ +<code csharp> 
-也称为“安全导航运算符”。用于在访问成员(属性、方法)或索引器之前检查对象是否为 `null`。 +bool hasLogin = true; 
-*   **语法**:`obj?.Property` 或 `arr?[index]` +bool hasPermission = false;
-*   **含义**:如果对象不为 `null`,则访问成员;如果对象为 `null`,则整个表达式直接返回 `null`,而不会抛出 `NullReferenceException`。+
  
-```csharp +if (hasLogin && !hasPermission)  
-string text = null; +{ 
-int? length = text?.Length; // length 将会是 null,而不是抛出异常 +    Console.WriteLine("已登录但无权限"); 
-```+
 +</code>
  
---- +===== 3比较/关系运算符 (Relational Operators=====
-### 2?? 运算符 (双问号)+
  
-`??` 主要用于提供默认值。+用于比较两个,返回 `true` 或 `false`
  
-#### A. Null 合并运算符 (Null-coalescing Operator) +运算符 ^ 描述 ^ 
-判断左侧的操作数是否为 `null`+| `==` | 等于 
 +`!=| 不等于 | 
 +| `>` | 大于 | 
 +| `<` | 小于 | 
 +| `>=` | 大于等于 | 
 +| `<=` | 小于等于 |
  
-   **语法**:`left ?? right` +===== 4. 类型检查与转换运算符 (Type Testing & Casting) =====
-   **含义**:如果 `left` **不为** `null`,则返回 `left`;如果 `left` **为** `null`,则返回 `right`。+
  
-```csharp +在处理多态、接口或不确定类型的对象时非常重要。
-string input = null; +
-// 如果 input 是 null,则 name 变成 "DefaultName" +
-string name = input ?? "DefaultName";  +
-```+
  
-#### BNull 合并赋值运算符 (Null-coalescing Assignment Operator) - C# 8.0+ +==== 4.1 is 运算符 ==== 
-这是 `??` 和 `=` 的组合。 +用于检查对象是否兼容于指定类型。C# 7.0+ 模式匹配
-*   **语法**:`variable ??= value` +
-*   **含义**:只有当左侧变量 `variable` 为 `null` 时,才将右侧的 `value` 赋值给它。如果左侧不为 null,则保原值不变+
  
-```csharp +<code csharp> 
-List<intnumbers = null; +object obj "Hello World";
-numbers ??new List<int>()// 因为 numbers 是 null,所以会初始化新列表 +
-numbers ??= new List<int>(); // 此时 numbers 已不是 null,这行代码不会执行任何操作 +
-```+
  
----+// 传统用法 
 +if (obj is string)  
 +
 +    Console.WriteLine("是字符串"); 
 +}
  
-### 综合代码示例+// 模式匹配用法 (推荐) 
 +if (obj is string str)  
 +
 +    // 如果转换成功,str 变量直接可用 
 +    Console.WriteLine($"字符串长度: {str.Length}"); 
 +
 +</code>
  
-为了更清晰地展示这些运算符的配合使用,请看下面的完整示例代码:+==== 4.2 as 运算符 ==== 
 +于显式引用转换。如果转换失败返回 `null` 而不是抛出异常。
  
-```csharp +<code csharp> 
-using System+object obj = "Hello"
-using System.Collections.Generic;+string s = obj as string; // 转换成功 
 +System.IO.Stream stream = obj as System.IO.Stream// 转换失败,stream 为 null
  
-public class Program +if (stream != null) { /*...*} 
-+</code>
-    public static void Main() +
-    { +
-        // 1可空类型修饰符 (?) +
-        // int? 表示这个变量可以存储数字,也可以存储 null +
-        int? nullableInt = null; +
-         +
-        // 2Null 合并运算符 (??) +
-        // 如果 nullableInt 是 null,则使用默认值 0 +
-        int finalValue = nullableInt ?? 0;  +
-        Console.WriteLine($"1. Null合并结果: {finalValue}"); /输出: 0+
  
-        // 3三元运算符 (?:) +==== 4.3 typeof 运算符 ==== 
-        // 经典条件判断 +用于获取类型的 `System.Type` 对象(通常用于反射)。
-        string status (finalValue > 5) ? "High" : "Low"; +
-        Console.WriteLine($"2. 三元运算结果: {status}"); // 输出: Low+
  
-        // 4. Null 条件运算符 (?.) +<code csharp> 
-        Person person null; +Type t typeof(string)
-        // 如果 person 为 null,name 直接为 null,不会报错 +Console.WriteLine(t.FullName); // System.String 
-        string name = person?.Name;  +</code>
-        Console.WriteLine($"3Null条件访问: '{name}'"); // 输出: '' (空)+
  
-        // 组合使用:安全访问 + 默认值 +===== 5位运算符 (Bitwise Operators=====
-        // 如果 person 为 null 或者 Name 为 null,则显示 "Unknown" +
-        string displayName person?.Name ?? "Unknown"; +
-        Console.WriteLine($"4. 组合使用结果: {displayName}"); // 输出: Unknown+
  
-        // 5. Null 合并赋值运算符 (??=) +用于直接操作整的二进制位。
-        List<string> tags = null; +
-         +
-        // 因为 tags 是 null,所以进行赋值 +
-        tags ??= new List<string>();  +
-        tags.Add("C#"); +
-         +
-        // 因为 tags 已经不是 null 了,所以右边不执行 +
-        tags ??= new List<string>();  +
-         +
-        Console.WriteLine($"5. 列表元素量: {tags.Count}"); // 输出: 1 +
-    } +
-}+
  
-// 定义一个简单的类用于测试 +^ 运算符 ^ 描述 ^ 示例 (假设 A=60, B=13) ^ 
-public class Person +| `&` | 按位与 | `A & B` (对应位都为1则为1) | 
-{ +| `|` | 按位或 | `A | B` (对应位有一个为1则为1) | 
-    public string Name { getset} +| `^` | 按位异或 | `A ^ B` (对应位不同则为1) | 
-+| `~` | 按位取反 | `~A` (0变1,1变0) | 
-``` +| `<<` | 左移 | `A << 2` (左移2位,相当于乘以4) | 
-### 总结表+| `>>` | 右移 | `A >> 2` (右移2位,相当于除以4) | 
 + 
 +===== 6. Lambda 运算符 (=>) ===== 
 + 
 +读作 "goes to"。用于定义 Lambda 表达式(匿名函数)。 
 + 
 +<code csharp> 
 +// 参数 => 表达式 
 +Func<int, int> square = x => x * x; 
 +Console.WriteLine(square(5))// 25 
 + 
 +// 在 LINQ 中广泛使用 
 +var list = new List<int> { 1, 2, 3 }; 
 +var evens = list.Where(n => n % 2 == 0); 
 +</code> 
 + 
 +===== 7. 索引与范围运算符 (Index & Range) ===== 
 + 
 +//(C# 8.0+)// 用于简化数组或集合的切片操作。 
 + 
 +^ 运算符 ^ 名称 ^ 描述 ^ 
 +`^| 索引运算符 | 从末尾开始计数。`^1` 是最后一个元素。 | 
 +| `..` | 范围运算符 | 定义一个范围。`start..end` (包含 start,不包含 end)。 | 
 + 
 +<code csharp> 
 +var words = new string[] { "The", "quick", "brown", "fox" }; 
 + 
 +// 获取最后一个元素 
 +string last = words[^1]; // "fox" 
 + 
 +// 获取中间两个元素 (索引1到索引3,不含3) 
 +string[] middle = words[1..3]; // ["quick", "brown"
 + 
 +// 获取最后两个 
 +string[] lastTwo = words[^2..]; // ["brown", "fox"
 +</code> 
 + 
 + 
 +===== 9. 综合总结表 =====
  
-运算符 | 名称 示例 | 解释 +^ 类别 ^ 常用运算符 ^ 关键点 ^ 
-| **`?`** | 可空类型 | `int? x` | 允许值类型为 null。 | +**算术** `+`, `-`, `*`, `/`, `%`, `++`, `--` | 注意整数除会丢失小数。 
-| **`?:`** | 三元运算符 | `a ? b : c` | 果 a 为真选 b,否则选 c。 | +| **逻辑** | `&&`, `||`, `!` | `&&` 和 `||` 具有短路特性。 | 
-| **`?.`** | Null 条件 | `obj?.Prop` | 如果 obj 非空则访问 Prop,否则返回 null。 | +| **比较** | `==`, `!=`, `>`, `<`, `>=`, `<=` | 总是 bool 类型。 | 
-| **`??`*Null 合并 | `a ?? b` | 如果 a 非空返回 a否则返回 b (默认值)。 | +| **位运算** | `&`, `|`, `^`, `~`, `<<`, `>>` | 用于底层二进制操作。 | 
-| **`??=`** | Null 合并赋值 | `??= b` | 仅当 a 为 null 时,将 b 赋值给 a。 |+| **赋值** | `=`, `+=`, `-=`, `*=`, `/=` `x += 5` 等同于 `x = x + 5`。 | 
 +| **类型** | `is`, `as`, `typeof`, `(T)x` | `as` 转换失败返回 null`(T)` 强制转换失败抛异常。 | 
 +| **Lambda** | `=>| 连接参数和方法体,用于 LINQ 和委托。 | 
 +| **索引/范围**| `^`, `..` | C# 8.0 新特性,用于数组切片。 | 
 +| **Null处理**| `?`, `??`, `?.`, `??=` | 参见之前的 Null 运算符文档。 |

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • csharp/运算符.1763542534.txt.gz
  • 最后更改: 2025/11/19 16:55
  • 张叶安