【C#】C# 所有关键字总结

文章目录

    • 一、关键字分类总览
    • 二、按功能分类详解
      • [1. 类型关键字(9个)](#1. 类型关键字(9个))
      • [2. 访问修饰符(6个)](#2. 访问修饰符(6个))
      • [3. 类成员修饰符(11个)](#3. 类成员修饰符(11个))
      • [4. 控制流语句(17个)](#4. 控制流语句(17个))
      • [5. 异常处理(5个)](#5. 异常处理(5个))
      • [6. 命名空间和引用(3个)](#6. 命名空间和引用(3个))
      • [7. 继承和对象(8个)](#7. 继承和对象(8个))
      • [8. LINQ 关键字(12个)](#8. LINQ 关键字(12个))
      • [9. 异步和并发(5个)](#9. 异步和并发(5个))
      • [10. 属性访问器(4个)](#10. 属性访问器(4个))
      • [11. 泛型(1个)](#11. 泛型(1个))
      • [12. 内存管理(3个)](#12. 内存管理(3个))
      • [13. 上下文关键字](#13. 上下文关键字)
    • 三、完整示例代码
    • 四、关键字速查表
    • 五、学习建议

一、关键字分类总览

C# 关键字分为两类:

  • 保留关键字:在任何地方都不能用作标识符
  • 上下文关键字:仅在特定上下文中有特殊含义,其他地方可用作标识符

二、按功能分类详解

1. 类型关键字(9个)

关键字 类型 说明 示例
bool 值类型 布尔值,true/false bool isActive = true;
byte 值类型 8位无符号整数(0-255) byte b = 255;
sbyte 值类型 8位有符号整数(-128~127) sbyte sb = -128;
char 值类型 Unicode字符 char c = 'A';
short 值类型 16位有符号整数 short s = 32767;
ushort 值类型 16位无符号整数 ushort us = 65535;
int 值类型 32位有符号整数 int i = 100;
uint 值类型 32位无符号整数 uint ui = 100U;
long 值类型 64位有符号整数 long l = 100L;
ulong 值类型 64位无符号整数 ulong ul = 100UL;
float 值类型 32位单精度浮点数 float f = 3.14f;
double 值类型 64位双精度浮点数 double d = 3.14;
decimal 值类型 128位高精度小数 decimal m = 99.99m;
object 引用类型 所有类型的基类 object obj = new object();
string 引用类型 Unicode字符串 string s = "Hello";
class 引用类型 定义类 class Person { }
interface 引用类型 定义接口 interface IAnimal { }
delegate 引用类型 定义委托 delegate void MyDel();
void 特殊 无返回值 void Method() { }

2. 访问修饰符(6个)

关键字 访问级别 说明
public 无限制 任何代码都可以访问
private 仅包含类 只有同一个类中的代码可以访问
protected 派生类 同一类或派生类可以访问
internal 同一程序集 同一个程序集中的任何代码可以访问
protected internal 并集 同一程序集 或 派生类
private protected 交集 同一程序集中的派生类

访问范围对比

复制代码
public           >  protected internal  >  internal  >  protected  >  private protected  >  private
(无限制)           (程序集+派生类)         (程序集)      (派生类)       (程序集内派生类)        (仅本类)

3. 类成员修饰符(11个)

关键字 作用 说明
abstract 抽象 不能实例化,派生类必须实现
virtual 虚方法 派生类可以重写
override 重写 重写基类的虚方法或抽象方法
sealed 密封 不能被继承(用于类)或重写(用于方法)
static 静态 属于类型本身,不属于实例
readonly 只读 运行时常量,只能在构造函数中赋值
const 常量 编译时常量,必须在声明时赋值
partial 部分类 类定义可以分布在多个文件
async 异步 标记方法为异步方法
unsafe 不安全 允许使用指针等不安全代码
new 隐藏 显式隐藏继承的成员

static vs const vs readonly 对比

特性 const readonly static
赋值时机 声明时 声明或构造函数 声明或静态构造函数
是否属于实例 可实例可静态
是否可以修改 仅构造函数中
编译时/运行时 编译时常量 运行时常量 运行时

4. 控制流语句(17个)

条件分支
关键字 用途 示例
if 条件判断 if (x > 0) { }
else 否则分支 else { }
switch 多路分支 switch (value) { }
case 分支条件 case 1:
default 默认分支 default:
循环
关键字 用途 适用场景
for 计数循环 已知循环次数
foreach 遍历集合 遍历IEnumerable集合
while 条件循环 前测试循环
do 条件循环 后测试循环(至少执行一次)
跳转语句
关键字 用途 说明
break 跳出循环 终止最近的循环或switch
continue 继续下次循环 跳过本次循环剩余部分
return 返回 退出方法并返回值
goto 跳转 跳转到标签位置(不推荐使用)

5. 异常处理(5个)

关键字 用途 执行时机
try 监视代码块 包含可能抛出异常的代码
catch 捕获异常 发生异常时执行
finally 清理代码 无论是否异常都执行
throw 抛出异常 主动抛出异常
checked 检查溢出 检查算术运算溢出
unchecked 忽略溢出 忽略算术运算溢出

try-catch-finally 执行流程

复制代码
try块 → 无异常 → finally块
try块 → 有异常 → catch块 → finally块

6. 命名空间和引用(3个)

关键字 用途 示例
namespace 定义命名空间 namespace MyApp { }
using 引入命名空间 using System;
extern 引用外部程序集 extern alias MyAlias;

7. 继承和对象(8个)

关键字 用途 说明
this 当前实例 引用当前对象
base 基类 调用基类成员
new 创建对象/隐藏成员 new MyClass()
is 类型检查 检查对象是否兼容于某类型
as 类型转换 安全转换,失败返回null
typeof 获取类型 获取Type对象
nameof 获取名称 获取变量、类型等名称(编译时)
sizeof 获取大小 获取值类型大小(不安全上下文)

is vs as 对比

csharp 复制代码
// is - 类型检查
if (obj is string) { }  // 返回bool

// as - 类型转换
string s = obj as string;  // 失败返回null,不抛异常

// 强制转换 - 失败抛异常
string s = (string)obj;

8. LINQ 关键字(12个)

关键字 用途 说明
from 数据源 指定数据源
in 范围变量 指定要迭代的集合
where 筛选 添加筛选条件
select 投影 选择输出结果
group 分组 按指定键分组
into 临时存储 存储group或join的结果
orderby 排序 排序结果
ascending 升序 默认排序方式
descending 降序 降序排序
join 连接 连接两个数据源
let 变量 引入临时变量
by 分组键 与group一起使用

9. 异步和并发(5个)

关键字 用途 说明
async 异步方法 标记方法为异步
await 等待异步 等待Task完成,不阻塞线程
lock 线程同步 确保代码块不被多线程同时执行
volatile 易失字段 告诉编译器字段可能被多线程修改

10. 属性访问器(4个)

关键字 用途 说明
get 获取属性值 属性读取器
set 设置属性值 属性写入器
init 初始化器 只能在对象初始化时设置(C# 9.0)
value 隐式参数 set/init访问器的隐式参数

11. 泛型(1个)

关键字 用途 示例
where 泛型约束 where T : class, new()

泛型约束类型

约束 说明
where T : struct 值类型约束
where T : class 引用类型约束
where T : new() 无参构造函数约束
where T : BaseClass 基类约束
where T : IInterface 接口约束

12. 内存管理(3个)

关键字 用途 说明
stackalloc 栈分配 在栈上分配内存
fixed 固定变量 固定变量地址,防止GC移动
unsafe 不安全代码 允许使用指针

13. 上下文关键字

这些关键字在特定上下文中有特殊含义,其他地方可用作标识符:

关键字 上下文
add 事件访问器
remove 事件访问器
get 属性访问器
set 属性访问器
init 属性初始化器
value 属性set/init中
var 隐式类型局部变量
dynamic 动态类型
yield 迭代器
partial 部分类/方法
where 泛型约束
from LINQ查询
select LINQ查询
group LINQ查询
into LINQ查询
join LINQ查询
let LINQ查询
orderby LINQ查询
ascending LINQ查询
descending LINQ查询
when 异常筛选器/catch

三、完整示例代码

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.IO;

namespace CSharpKeywordsCompleteDemo
{
    #region 1. 类型关键字演示
    /// <summary>
    /// 演示所有值类型和引用类型
    /// </summary>
    class TypeKeywordsDemo
    {
        public void DemonstrateTypes()
        {
            Console.WriteLine("========== 1. 类型关键字 ==========");
            
            // 值类型(存储在栈上)
            bool boolean = true;                    // 布尔类型
            byte byteValue = 255;                   // 无符号字节 0-255
            sbyte sbyteValue = -128;                // 有符号字节 -128-127
            char charValue = 'A';                   // Unicode字符
            short shortValue = 32767;               // 16位整数
            ushort ushortValue = 65535;             // 16位无符号整数
            int intValue = 2147483647;              // 32位整数
            uint uintValue = 4294967295U;           // 32位无符号整数
            long longValue = 9223372036854775807L;  // 64位整数
            ulong ulongValue = 18446744073709551615UL; // 64位无符号整数
            float floatValue = 3.14159f;            // 单精度浮点数
            double doubleValue = 3.14159265358979;  // 双精度浮点数
            decimal decimalValue = 99.99m;          // 高精度小数(财务用)
            
            // 引用类型(存储在堆上)
            object objectValue = "万物皆对象";       // 所有类型的基类
            string stringValue = "Hello C#";        // 字符串(不可变)
            
            // 自定义引用类型
            Person person = new Person { Name = "张三", Age = 25 };
            
            Console.WriteLine($"bool: {boolean}");
            Console.WriteLine($"int: {intValue}");
            Console.WriteLine($"double: {doubleValue}");
            Console.WriteLine($"decimal: {decimalValue} (财务计算推荐)");
            Console.WriteLine($"string: {stringValue}");
            Console.WriteLine($"object: {objectValue}");
        }
        
        class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
    }
    #endregion
    
    #region 2. 访问修饰符演示
    /// <summary>
    /// 演示所有访问修饰符的可见性
    /// </summary>
    public class AccessModifiersDemo
    {
        public string PublicField = "🔓 任何地方都可访问";
        private string PrivateField = "🔒 仅本类可访问";
        protected string ProtectedField = "🛡️ 本类及派生类可访问";
        internal string InternalField = "📦 同一程序集可访问";
        protected internal string ProtectedInternalField = "📦🛡️ 同一程序集或派生类";
        private protected string PrivateProtectedField = "📦🔒 同一程序集的派生类";
        
        public void ShowAccessibleFields()
        {
            Console.WriteLine("\n========== 2. 访问修饰符 ==========");
            Console.WriteLine($"✅ 本类中可以访问: {PrivateField}");
            Console.WriteLine($"✅ 本类中可以访问: {ProtectedField}");
            Console.WriteLine($"✅ 本类中可以访问: {InternalField}");
        }
    }
    
    // 派生类演示 protected 和 protected internal
    class DerivedClass : AccessModifiersDemo
    {
        public void ShowDerivedAccess()
        {
            Console.WriteLine($"✅ 派生类可访问: {ProtectedField}");
            Console.WriteLine($"✅ 派生类可访问: {ProtectedInternalField}");
            Console.WriteLine($"❌ 派生类不可访问: PrivateField (编译错误)");
        }
    }
    #endregion
    
    #region 3. 类成员修饰符演示
    /// <summary>
    /// 演示 abstract, virtual, override, sealed, static, const, readonly
    /// </summary>
    abstract class Animal  // abstract: 不能实例化
    {
        public string Name { get; set; }
        
        // abstract: 派生类必须实现
        public abstract void MakeSound();
        
        // virtual: 派生类可以重写
        public virtual void Eat()
        {
            Console.WriteLine("动物在吃东西...");
        }
    }
    
    class Dog : Animal
    {
        // override: 重写抽象方法(必须)
        public override void MakeSound()
        {
            Console.WriteLine("🐕 汪汪汪!");
        }
        
        // override: 重写虚方法(可选)
        public override void Eat()
        {
            base.Eat();  // base: 调用基类方法
            Console.WriteLine("🐕 狗狗在吃骨头...");
        }
        
        // new: 隐藏基类成员
        public new string Name 
        { 
            get => base.Name;
            set => base.Name = $"狗狗: {value}";
        }
    }
    
    sealed class Cat : Animal  // sealed: 不能被继承
    {
        public override void MakeSound()
        {
            Console.WriteLine("🐱 喵喵喵!");
        }
        
        public override void Eat()
        {
            Console.WriteLine("🐱 猫咪在吃鱼...");
        }
    }
    
    class StaticConstReadonlyDemo
    {
        // const: 编译时常量,必须在声明时赋值
        public const double PI = 3.14159;
        
        // readonly: 运行时常量,可在构造函数赋值
        public readonly int ReadOnlyValue;
        
        // static: 属于类型本身
        public static int StaticCounter = 0;
        
        // static readonly: 静态只读
        public static readonly DateTime StartupTime;
        
        static StaticConstReadonlyDemo()
        {
            StartupTime = DateTime.Now;  // 静态构造函数中赋值
        }
        
        public StaticConstReadonlyDemo(int value)
        {
            ReadOnlyValue = value;  // 只能在构造函数中赋值
        }
        
        public void Demonstrate()
        {
            Console.WriteLine("\n========== 3. 类成员修饰符 ==========");
            Console.WriteLine($"const PI: {PI} (编译时常量)");
            Console.WriteLine($"readonly: {ReadOnlyValue} (运行时常量)");
            Console.WriteLine($"static counter: {++StaticCounter} (所有实例共享)");
            Console.WriteLine($"static readonly: {StartupTime} (静态只读)");
        }
    }
    #endregion
    
    #region 4. 控制流语句演示
    /// <summary>
    /// 演示所有控制流关键字
    /// </summary>
    class ControlFlowDemo
    {
        public void DemonstrateAll()
        {
            Console.WriteLine("\n========== 4. 控制流语句 ==========");
            
            // if-else 条件分支
            int score = 85;
            if (score >= 90)
            {
                Console.WriteLine("if-else: 优秀");
            }
            else if (score >= 60)
            {
                Console.WriteLine("if-else: 及格");
            }
            else
            {
                Console.WriteLine("if-else: 不及格");
            }
            
            // switch-case (支持模式匹配)
            string day = "Monday";
            string result = day switch
            {
                "Monday" => "周一",
                "Friday" => "周五",
                "Saturday" or "Sunday" => "周末",
                _ => "工作日"
            };
            Console.WriteLine($"switch表达式: {result}");
            
            // 传统switch
            switch (score / 10)
            {
                case 10:
                case 9:
                    Console.WriteLine("switch-case: A");
                    break;
                case 8:
                    Console.WriteLine("switch-case: B");
                    break;
                case 7:
                case 6:
                    Console.WriteLine("switch-case: C");
                    break;
                default:
                    Console.WriteLine("switch-case: D");
                    break;
            }
            
            // for 循环
            Console.Write("for循环: ");
            for (int i = 0; i < 5; i++)
            {
                Console.Write($"{i} ");
            }
            Console.WriteLine();
            
            // foreach 循环
            var fruits = new[] { "苹果", "香蕉", "橙子" };
            Console.Write("foreach循环: ");
            foreach (var fruit in fruits)
            {
                Console.Write($"{fruit} ");
            }
            Console.WriteLine();
            
            // while 循环
            int counter = 0;
            Console.Write("while循环: ");
            while (counter < 3)
            {
                Console.Write($"{counter} ");
                counter++;
            }
            Console.WriteLine();
            
            // do-while 循环(至少执行一次)
            counter = 0;
            Console.Write("do-while循环: ");
            do
            {
                Console.Write($"{counter} ");
                counter++;
            } while (counter < 3);
            Console.WriteLine();
            
            // break 和 continue
            Console.Write("break和continue: ");
            for (int i = 0; i < 5; i++)
            {
                if (i == 2) continue;  // 跳过2
                if (i == 4) break;     // 到达4时停止
                Console.Write($"{i} ");
            }
            Console.WriteLine("(跳过了2,在4停止)");
            
            // return 退出方法
            Console.WriteLine("return演示: 下面会提前返回");
            ReturnDemo();
        }
        
        private void ReturnDemo()
        {
            for (int i = 0; i < 5; i++)
            {
                if (i == 2)
                {
                    Console.WriteLine($"遇到{i},return退出方法");
                    return;  // 退出整个方法
                }
                Console.WriteLine($"  处理{i}");
            }
            Console.WriteLine("这行不会执行");
        }
    }
    #endregion
    
    #region 5. 异常处理演示
    /// <summary>
    /// 演示 try, catch, finally, throw
    /// </summary>
    class ExceptionHandlingDemo
    {
        public void DemonstrateExceptions()
        {
            Console.WriteLine("\n========== 5. 异常处理 ==========");
            
            try
            {
                Console.WriteLine("try: 执行可能出错的代码");
                int result = Divide(10, 0);
                Console.WriteLine($"结果: {result}");
            }
            catch (DivideByZeroException ex)
            {
                Console.WriteLine($"catch: 捕获特定异常 - {ex.Message}");
                throw;  // throw: 重新抛出(保留堆栈)
            }
            catch (Exception ex) when (ex.Message.Contains("特定条件"))
            {
                // when: 异常筛选器
                Console.WriteLine($"catch when: 条件满足时捕获 - {ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"catch: 捕获所有异常 - {ex.Message}");
            }
            finally
            {
                Console.WriteLine("finally: 无论是否异常都会执行(清理资源)");
            }
            
            // checked/unchecked 演示
            try
            {
                int max = int.MaxValue;
                // checked: 检查溢出
                int overflow = checked(max + 1);
            }
            catch (OverflowException ex)
            {
                Console.WriteLine($"checked: 检测到溢出 - {ex.Message}");
            }
            
            // unchecked: 忽略溢出
            int noCheck = unchecked(int.MaxValue + 1);
            Console.WriteLine($"unchecked: 忽略溢出,结果为 {noCheck}");
        }
        
        private int Divide(int a, int b)
        {
            if (b == 0)
            {
                throw new ArgumentException("除数不能为零", nameof(b));  // 主动抛出异常
            }
            return a / b;
        }
    }
    #endregion
    
    #region 6. LINQ 演示
    /// <summary>
    /// 演示所有 LINQ 关键字
    /// </summary>
    class LinqKeywordsDemo
    {
        public void DemonstrateLinq()
        {
            Console.WriteLine("\n========== 6. LINQ 关键字 ==========");
            
            var students = new[]
            {
                new { Name = "张三", Grade = 85, Class = "一班", Score = 450 },
                new { Name = "李四", Grade = 92, Class = "一班", Score = 480 },
                new { Name = "王五", Grade = 78, Class = "二班", Score = 420 },
                new { Name = "赵六", Grade = 88, Class = "二班", Score = 460 },
                new { Name = "钱七", Grade = 95, Class = "一班", Score = 490 }
            };
            
            // 完整 LINQ 查询语法
            var query = from student in students           // from: 数据源
                        where student.Grade >= 80          // where: 筛选
                        let isExcellent = student.Grade >= 90  // let: 引入临时变量
                        orderby student.Grade descending   // orderby: 排序
                        group student by student.Class into classGroup  // group...into: 分组
                        select new                         // select: 投影
                        {
                            ClassName = classGroup.Key,
                            Count = classGroup.Count(),
                            AverageGrade = classGroup.Average(s => s.Grade),
                            Students = classGroup
                        };
            
            foreach (var classInfo in query)
            {
                Console.WriteLine($"📚 {classInfo.ClassName}:");
                Console.WriteLine($"   人数: {classInfo.Count}, 平均分: {classInfo.AverageGrade:F1}");
                Console.WriteLine("   学生:");
                foreach (var student in classInfo.Students)
                {
                    Console.WriteLine($"     - {student.Name}: {student.Grade}分");
                }
            }
            
            // 连接查询 (join)
            var classes = new[]
            {
                new { ClassId = "一班", Teacher = "王老师" },
                new { ClassId = "二班", Teacher = "李老师" }
            };
            
            var joinQuery = from student in students
                            join cls in classes on student.Class equals cls.ClassId
                            select new
                            {
                                student.Name,
                                student.Grade,
                                cls.Teacher
                            };
            
            Console.WriteLine("\n班级和教师信息:");
            foreach (var item in joinQuery)
            {
                Console.WriteLine($"  {item.Name}: {item.Grade}分, 班主任: {item.Teacher}");
            }
        }
    }
    #endregion
    
    #region 7. 异步编程演示
    /// <summary>
    /// 演示 async, await
    /// </summary>
    class AsyncProgrammingDemo
    {
        public async Task DemonstrateAsync()
        {
            Console.WriteLine("\n========== 7. 异步编程 ==========");
            
            Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 开始异步操作 (主线程: {Environment.CurrentManagedThreadId})");
            
            // 异步下载多个文件
            var tasks = new List<Task<string>>
            {
                DownloadDataAsync("文件1", 2000),
                DownloadDataAsync("文件2", 1500),
                DownloadDataAsync("文件3", 2500)
            };
            
            Console.WriteLine("等待所有下载完成...");
            string[] results = await Task.WhenAll(tasks);
            
            foreach (var result in results)
            {
                Console.WriteLine($"✅ {result}");
            }
            
            Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 所有操作完成");
        }
        
        private async Task<string> DownloadDataAsync(string fileName, int delayMs)
        {
            Console.WriteLine($"  ⏳ 开始下载 {fileName} (线程: {Environment.CurrentManagedThreadId})");
            await Task.Delay(delayMs);  // await: 等待但不阻塞线程
            Console.WriteLine($"  ✅ 完成下载 {fileName}");
            return $"{fileName} 下载完成,耗时 {delayMs}ms";
        }
        
        // lock 关键字演示(线程同步)
        private readonly object _lockObj = new object();
        private int _counter = 0;
        
        public void IncrementCounter()
        {
            lock (_lockObj)  // 确保线程安全
            {
                _counter++;
                Console.WriteLine($"计数器: {_counter} (线程: {Environment.CurrentManagedThreadId})");
            }
        }
        
        // volatile 关键字:告诉编译器该字段可能被多线程修改
        private volatile bool _isRunning = true;
        
        public void StopRunning()
        {
            _isRunning = false;
        }
    }
    #endregion
    
    #region 8. 属性访问器演示
    /// <summary>
    /// 演示 get, set, init, value
    /// </summary>
    class PropertyAccessorsDemo
    {
        private string _name;
        
        // 传统属性:get 和 set
        public string Name
        {
            get { return _name; }
            set { _name = value; }  // value: 隐式参数
        }
        
        // 表达式体属性 (C# 7.0+)
        public string NameShort
        {
            get => _name;
            set => _name = value;
        }
        
        // 自动实现属性
        public int Age { get; set; }
        
        // 只读属性(只有get)
        public DateTime CreatedTime { get; } = DateTime.Now;
        
        // init 访问器 (C# 9.0+): 只能在初始化时设置
        public string Email { get; init; }
        
        // 只读字段
        private readonly string _id;
        
        public PropertyAccessorsDemo(string email, string id)
        {
            Email = email;      // ✅ init 可以在构造函数中赋值
            _id = id;           // readonly 字段只能在构造函数中赋值
        }
        
        public void Demonstrate()
        {
            Console.WriteLine("\n========== 8. 属性访问器 ==========");
            Console.WriteLine($"Name: {Name}");
            Console.WriteLine($"Age: {Age}");
            Console.WriteLine($"CreatedTime: {CreatedTime}");
            Console.WriteLine($"Email: {Email} (init-only)");
            
            // 以下代码会编译错误:
            // Email = "new@email.com";  // ❌ init 属性不能在初始化后修改
        }
    }
    #endregion
    
    #region 9. 泛型约束演示
    /// <summary>
    /// 演示 where 泛型约束
    /// </summary>
    class GenericConstraintsDemo
    {
        // 多种泛型约束组合
        public class Repository<T> where T : class, new()  // T必须是引用类型且有无参构造函数
        {
            public T CreateNew()
            {
                return new T();  // 因为有new()约束,可以创建实例
            }
        }
        
        public class NumberProcessor<T> where T : struct  // T必须是值类型
        {
            public T Add(T a, T b)
            {
                // 值类型约束确保安全操作
                dynamic da = a;
                dynamic db = b;
                return da + db;
            }
        }
        
        public class Sorter<T> where T : IComparable<T>  // 实现IComparable接口
        {
            public T Max(T a, T b)
            {
                return a.CompareTo(b) > 0 ? a : b;
            }
        }
        
        public class Container<T, U> 
            where T : class 
            where U : struct, IComparable
        {
            public void Demonstrate()
            {
                Console.WriteLine($"\n========== 9. 泛型约束 ==========");
                Console.WriteLine($"T: {typeof(T).Name} (引用类型)");
                Console.WriteLine($"U: {typeof(U).Name} (值类型 + IComparable)");
            }
        }
        
        public void Demonstrate()
        {
            var repo = new Repository<Person>();
            var person = repo.CreateNew();
            Console.WriteLine($"Repository<T> where T : class, new() - 创建了 {person.GetType().Name}");
            
            var processor = new NumberProcessor<int>();
            Console.WriteLine($"NumberProcessor<T> where T : struct - 加法: 10 + 20 = {processor.Add(10, 20)}");
            
            var sorter = new Sorter<int>();
            Console.WriteLine($"Sorter<T> where T : IComparable - 最大值: Max(5, 10) = {sorter.Max(5, 10)}");
            
            var container = new Container<string, int>();
            container.Demonstrate();
        }
        
        class Person { }
    }
    #endregion
    
    #region 10. 不安全代码演示
    /// <summary>
    /// 演示 unsafe, fixed, stackalloc
    /// </summary>
    unsafe class UnsafeCodeDemo  // unsafe: 允许不安全代码
    {
        public void DemonstrateUnsafe()
        {
            Console.WriteLine("\n========== 10. 不安全代码 ==========");
            Console.WriteLine("注意:不安全代码需要在项目属性中启用");
            
            // stackalloc: 在栈上分配内存(比堆分配更快)
            int* numbers = stackalloc int[5];
            
            for (int i = 0; i < 5; i++)
            {
                numbers[i] = i * 10;
            }
            
            Console.Write("stackalloc 数组: ");
            for (int i = 0; i < 5; i++)
            {
                Console.Write($"{numbers[i]} ");
            }
            Console.WriteLine();
            
            // 指针操作
            int value = 100;
            int* ptr = &value;
            Console.WriteLine($"指针操作: value = {value}, *ptr = {*ptr}");
            *ptr = 200;
            Console.WriteLine($"修改指针后: value = {value}");
            
            // fixed: 固定变量地址,防止垃圾回收移动
            string text = "Hello";
            fixed (char* p = text)
            {
                Console.WriteLine($"fixed: 字符串 '{text}' 的第一个字符: {*p}");
            }
            
            // sizeof: 获取类型大小(不安全上下文)
            Console.WriteLine($"sizeof(int): {sizeof(int)} 字节");
            Console.WriteLine($"sizeof(bool): {sizeof(bool)} 字节");
            Console.WriteLine($"sizeof(decimal): {sizeof(decimal)} 字节");
        }
    }
    #endregion
    
    #region 11. 上下文关键字演示
    /// <summary>
    /// 演示 var, dynamic, yield, partial, nameof
    /// </summary>
    class ContextualKeywordsDemo
    {
        // var: 隐式类型局部变量(编译时确定)
        public void DemonstrateVar()
        {
            Console.WriteLine("\n========== 11. 上下文关键字 ==========");
            
            var number = 42;           // 编译为 int
            var text = "Hello";        // 编译为 string
            var list = new List<int>(); // 编译为 List<int>
            
            Console.WriteLine($"var number: {number} ({number.GetType()})");
            Console.WriteLine($"var text: {text} ({text.GetType()})");
            Console.WriteLine($"var list: {list.GetType()}");
        }
        
        // dynamic: 动态类型(运行时解析)
        public void DemonstrateDynamic()
        {
            dynamic dyn = "Hello";
            Console.WriteLine($"dynamic as string: {dyn.Length}");  // 运行时解析
            
            dyn = 123;
            Console.WriteLine($"dynamic as int: {dyn + 100}");      // 运行时解析
            
            dyn = new { Name = "动态对象", Value = 999 };
            Console.WriteLine($"dynamic as anonymous: {dyn.Name}");
            
            // dynamic 可以调用不存在的方法(运行时才报错)
            try
            {
                dyn.NonExistentMethod();  // 编译通过,运行时抛出异常
            }
            catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
            {
                Console.WriteLine($"动态调用失败: {ex.Message}");
            }
        }
        
        // yield: 迭代器
        public void DemonstrateYield()
        {
            Console.WriteLine("\nyield 迭代器演示:");
            foreach (var num in GetEvenNumbers(10))
            {
                Console.Write($"{num} ");
            }
            Console.WriteLine();
        }
        
        private IEnumerable<int> GetEvenNumbers(int max)
        {
            for (int i = 0; i <= max; i++)
            {
                if (i % 2 == 0)
                {
                    yield return i;  // 返回一个元素并保持状态
                }
            }
            yield break;  // 终止迭代
        }
        
        // partial: 部分类
        partial class PartialClassDemo
        {
            public void Method1() => Console.WriteLine("Partial Method 1");
        }
        
        partial class PartialClassDemo
        {
            public void Method2() => Console.WriteLine("Partial Method 2");
        }
        
        // nameof: 获取名称字符串(编译时)
        public void DemonstrateNameof()
        {
            string varName = nameof(DemonstrateNameof);
            string typeName = nameof(PartialClassDemo);
            string methodName = nameof(Method1);
            
            Console.WriteLine($"nameof 演示:");
            Console.WriteLine($"  方法名: {varName}");
            Console.WriteLine($"  类型名: {typeName}");
            Console.WriteLine($"  成员名: {methodName}");
        }
        
        public void RunPartialDemo()
        {
            var demo = new PartialClassDemo();
            demo.Method1();
            demo.Method2();
        }
    }
    #endregion
    
    #region 12. 综合演示
    /// <summary>
    /// 主程序入口,演示所有特性
    /// </summary>
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("╔════════════════════════════════════════════════════════════╗");
            Console.WriteLine("║           C# 关键字完全指南 - 综合示例                     ║");
            Console.WriteLine("╚════════════════════════════════════════════════════════════╝");
            
            // 1. 类型关键字
            new TypeKeywordsDemo().DemonstrateTypes();
            
            // 2. 访问修饰符
            new AccessModifiersDemo().ShowAccessibleFields();
            new DerivedClass().ShowDerivedAccess();
            
            // 3. 类成员修饰符
            Animal dog = new Dog { Name = "旺财" };
            Animal cat = new Cat { Name = "咪咪" };
            dog.MakeSound();
            dog.Eat();
            cat.MakeSound();
            cat.Eat();
            
            var staticDemo = new StaticConstReadonlyDemo(100);
            staticDemo.Demonstrate();
            new StaticConstReadonlyDemo(200).Demonstrate();
            
            // 4. 控制流语句
            new ControlFlowDemo().DemonstrateAll();
            
            // 5. 异常处理
            new ExceptionHandlingDemo().DemonstrateExceptions();
            
            // 6. LINQ
            new LinqKeywordsDemo().DemonstrateLinq();
            
            // 7. 异步编程
            await new AsyncProgrammingDemo().DemonstrateAsync();
            
            // 8. 属性访问器
            var propertyDemo = new PropertyAccessorsDemo("user@example.com", "ID-001")
            {
                Name = "张三",
                Age = 30
            };
            propertyDemo.Demonstrate();
            
            // 9. 泛型约束
            new GenericConstraintsDemo().Demonstrate();
            
            // 10. 不安全代码(需要启用unsafe编译选项)
            try
            {
                new UnsafeCodeDemo().DemonstrateUnsafe();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"不安全代码演示需要编译选项 /unsafe: {ex.Message}");
            }
            
            // 11. 上下文关键字
            var contextDemo = new ContextualKeywordsDemo();
            contextDemo.DemonstrateVar();
            contextDemo.DemonstrateDynamic();
            contextDemo.DemonstrateYield();
            contextDemo.DemonstrateNameof();
            contextDemo.RunPartialDemo();
            
            Console.WriteLine("\n════════════════════════════════════════════════════════════");
            Console.WriteLine("所有演示完成!按任意键退出...");
            Console.ReadKey();
        }
    }
    #endregion
}

四、关键字速查表

按字母顺序快速索引

关键字 分类 简要说明
abstract 修饰符 抽象类/方法
as 运算符 安全类型转换
async 异步 异步方法标记
await 异步 等待异步操作
base 对象 访问基类成员
bool 类型 布尔值
break 跳转 跳出循环
byte 类型 8位无符号整数
case 分支 switch分支
catch 异常 捕获异常
char 类型 Unicode字符
checked 异常 检查溢出
class 类型 定义类
const 修饰符 编译时常量
continue 跳转 继续下次循环
decimal 类型 高精度小数
default 分支 switch默认分支/默认值
delegate 类型 定义委托
do 循环 do-while循环
double 类型 双精度浮点数
else 分支 if-else分支
enum 类型 枚举
event 修饰符 事件
explicit 运算符 显式转换
extern 引用 外部别名
false 字面量 布尔假
finally 异常 最终执行块
fixed 内存 固定变量地址
float 类型 单精度浮点数
for 循环 for循环
foreach 循环 遍历集合
goto 跳转 跳转语句
if 分支 条件判断
implicit 运算符 隐式转换
in 循环/LINQ 遍历/查询
int 类型 32位整数
interface 类型 定义接口
internal 修饰符 程序集内部可见
is 运算符 类型检查
lock 并发 线程锁
long 类型 64位整数
namespace 组织 定义命名空间
new 对象/修饰符 创建对象/隐藏成员
null 字面量 空引用
object 类型 所有类型的基类
operator 运算符 运算符重载
out 参数 输出参数
override 修饰符 重写基类成员
params 参数 可变参数
private 修饰符 私有访问
protected 修饰符 受保护访问
public 修饰符 公共访问
readonly 修饰符 运行时常量
ref 参数 引用参数
return 跳转 返回
sbyte 类型 8位有符号整数
sealed 修饰符 密封类/方法
short 类型 16位整数
sizeof 运算符 获取大小
stackalloc 内存 栈分配内存
static 修饰符 静态成员
string 类型 字符串
struct 类型 值类型结构
switch 分支 多路分支
this 对象 当前实例
throw 异常 抛出异常
true 字面量 布尔真
try 异常 尝试执行
typeof 运算符 获取类型
uint 类型 32位无符号整数
ulong 类型 64位无符号整数
unchecked 异常 忽略溢出
unsafe 内存 不安全代码块
ushort 类型 16位无符号整数
using 引用/资源 引入命名空间/自动释放
virtual 修饰符 虚方法
void 类型 无返回值
volatile 并发 易失字段
while 循环 while循环

五、学习建议

  1. 优先级顺序

    • 第一阶段:类型、访问修饰符、控制流、异常处理
    • 第二阶段:类成员修饰符、属性、泛型
    • 第三阶段:LINQ、异步、不安全代码
  2. 区分相似关键字

    • const vs readonly:编译时常量 vs 运行时常量
    • is vs as:类型检查 vs 安全转换
    • abstract vs virtual:必须重写 vs 可选重写
    • override vs new:重写 vs 隐藏
  3. 实践建议

    • 将示例代码复制到Visual Studio中运行
    • 修改代码观察错误和输出变化
    • 尝试创建自己的示例来巩固理解
相关推荐
菜菜小狗的学习笔记2 小时前
剑指Offer算法题(九)搜索
数据结构·算法·深度优先
无忧智库3 小时前
算力、算法、数据三位一体:构建城市级AI大模型算力池的全景式解构与未来展望(WORD)
大数据·人工智能·算法
蓝天守卫者联盟13 小时前
2026乙酸乙酯回收设备厂家选型与技术实践
java·jvm·python·算法
于先生吖3 小时前
教育数字化转型 JAVA 国际版答题练习系统完整开发教程
java·开发语言
DDzqss3 小时前
3.25打卡day45
c++·算法
爆更小小刘3 小时前
2.3.1_2 浮点数的表示 IEEE 754(例题训练)
算法
我是唐青枫3 小时前
C#.NET ConcurrentStack<T> 深入解析:无锁栈原理、LIFO 语义与使用边界
网络·c#·.net
Datacarts3 小时前
亚马逊爆款选品:数据采集与三方服务商对接
开发语言·人工智能·python·信息可视化
赫瑞3 小时前
Java中的 Dijkstra 算法
java·算法