一、goto语句不建议使用goto语句用于跳转到代码中指定的标记位置实现代码的重复执行但会破坏代码的结构化和可读性日常开发中不建议使用。1. 核心语法与规则先在需要重复执行的代码前定义一个标记标签名标记需遵循小驼峰命名法则标记的定义格式标记名:冒号不可遗漏需放在要重复执行代码的前一行使用goto语句goto 标记名;执行后会跳转到标记所在位置重复执行后续代码。2. 实战示例性别输入校验// inputSex: goto语句的标签名小驼峰命名定义在需重复执行代码的前一行 inputSex: Console.WriteLine(请输入一个性别); string str Console.ReadLine(); if (str 男) { Console.WriteLine(性别是男); } else if (str 女) { Console.WriteLine(性别是女); } else { Console.WriteLine(输入性别不合法 请重新输入); goto inputSex;// 跳转到inputSex标记处重复执行输入校验逻辑 }3.练习猜数字static void Main(string[] args) { Random rnd new Random(); int randomNum rnd.Next(1,101);//生成1-100之间的随机数 Console.WriteLine(randomNum); int guessCount 0; Guest: Console.WriteLine(请输入1-100之间的整数); string strConsole.ReadLine(); bool isSuccess int.TryParse(str, out int num); if (!isSuccess) { Console.WriteLine(输入的数字格式有误); goto Guest; } if (!(num1num100)) { Console.WriteLine(输入的数字必须在[1-100]之间); goto Guest; } if (guessCount5) { Console.WriteLine(次数用完了,请重新打开程序); return; //终止整个函数 } if (numrandomNum) { Console.WriteLine(猜大了); guessCount; goto Guest; } else if (num randomNum) { Console.WriteLine(猜小了); guessCount; goto Guest; } else { Console.WriteLine(猜对了); } }4. 关键说明上述示例中当用户输入的性别不是“男”或“女”时会通过goto inputSex跳转到标记处重新执行输入逻辑直到输入合法为止。⚠️ 注意goto语句容易导致代码逻辑混乱如无限跳转、跳转逻辑不清晰上述功能更推荐使用while/do...while循环实现代码可读性更强。二、可空类型一、可空类型核心定义C#中数据类型分为值类型如int、double、bool等和引用类型如string两者对null的支持不同值类型默认只能表示自身范围内的数据如int只能表示正数、负数、0不能表示nullnull表示“无值”引用类型可以表示null如string可赋值为null表示字符串无值。可空类型的作用扩大值类型的表示范围让值类型不仅能表示自身正常范围的数据还能表示null无值。二、可空类型语法重点1. 定义格式在值类型后面加?即可定义可空类型变量语法如下// 格式值类型? 变量名 null;可赋值为null也可赋值为该类型的正常数据 int? c null; // 定义int类型的可空变量c初始值为null c 19; // 后续可赋值为int类型的正常数据19是int类型符合要求常见可空类型示例int?可空int、double?可空double、bool?可空bool。2. 不可直接赋值的易错点可空类型变量如int?和普通值类型变量如int范围不匹配不能直接赋值否则会报错。int? c null; // int d c; // 错误等号左右范围不匹配c可表示nulld不能表示null3. 可空类型转普通值类型?? 空合并运算符使用??空合并运算符可将可空类型转换为普通值类型语法规则如下普通值类型 变量名 可空类型变量 ?? 默认值;核心逻辑如果可空类型变量不为null则取可空类型变量的值如果可空类型变量为null则取??后面的默认值。int? c null; int d c ?? 10; // c为null取默认值10d的值为10 c 19; int e c ?? 10; // c不为null取c的值19e的值为19三、完整实战案例对应代码namespace _03可空类型 { internal class Program { static void Main(string[] args) { string s ;// 空字符串不是null是有值的值为空字符串 // 值类型只能表示自身范围数据不能表示null // 引用类型可以表示null如string string s1 null; // 引用类型string可赋值为null // int b null; // 错误int是值类型不能直接赋值为null int a 10; // 普通int类型只能表示正数、负数、0不能表示null // 可空类型定义值类型? 变量名 null;扩大值类型表示范围可表示null int? c null;// 在int后加?定义可空int变量c初始值为null c 19; // 可赋值为int类型的正常数据19 // int d c; // 错误可空类型int?不能直接赋值给普通值类型int // 使用??空合并运算符将可空类型转为普通值类型 int d c ?? 10; // c不为null取c的值19若c为null取默认值10 Console.WriteLine(d); // 输出19 } } }代码说明string s 空字符串不是nullnull表示“无值”空字符串是“有值但值为空”string s1 null引用类型可直接赋值为null符合语法int? c null正确定义可空int类型可表示null和int范围内的所有数据int d c ?? 10通过空合并运算符安全将可空类型转为普通int类型避免报错。四、易错点提醒高频踩坑混淆“空字符串”和“null”string s 是空字符串有值string s1 null是无值两者不同直接给普通值类型赋值null如int b null语法错误必须使用可空类型int?可空类型直接赋值给普通值类型如int d cc是int?范围不匹配必须使用??运算符转换误以为所有类型都能直接表示null只有引用类型和可空值类型能表示null普通值类型不能。五、核心总结可空类型作用让值类型int、double等能表示null扩大其表示范围定义语法值类型? 变量名 null;关键是加?转换方法使用??空合并运算符将可空类型转为普通值类型避免报错核心区别普通值类型不能表示null可空值类型和引用类型可以表示null注意空字符串≠ null前者是有值后者是无值。
C#goto方法,可空类型
发布时间:2026/5/19 20:34:36
一、goto语句不建议使用goto语句用于跳转到代码中指定的标记位置实现代码的重复执行但会破坏代码的结构化和可读性日常开发中不建议使用。1. 核心语法与规则先在需要重复执行的代码前定义一个标记标签名标记需遵循小驼峰命名法则标记的定义格式标记名:冒号不可遗漏需放在要重复执行代码的前一行使用goto语句goto 标记名;执行后会跳转到标记所在位置重复执行后续代码。2. 实战示例性别输入校验// inputSex: goto语句的标签名小驼峰命名定义在需重复执行代码的前一行 inputSex: Console.WriteLine(请输入一个性别); string str Console.ReadLine(); if (str 男) { Console.WriteLine(性别是男); } else if (str 女) { Console.WriteLine(性别是女); } else { Console.WriteLine(输入性别不合法 请重新输入); goto inputSex;// 跳转到inputSex标记处重复执行输入校验逻辑 }3.练习猜数字static void Main(string[] args) { Random rnd new Random(); int randomNum rnd.Next(1,101);//生成1-100之间的随机数 Console.WriteLine(randomNum); int guessCount 0; Guest: Console.WriteLine(请输入1-100之间的整数); string strConsole.ReadLine(); bool isSuccess int.TryParse(str, out int num); if (!isSuccess) { Console.WriteLine(输入的数字格式有误); goto Guest; } if (!(num1num100)) { Console.WriteLine(输入的数字必须在[1-100]之间); goto Guest; } if (guessCount5) { Console.WriteLine(次数用完了,请重新打开程序); return; //终止整个函数 } if (numrandomNum) { Console.WriteLine(猜大了); guessCount; goto Guest; } else if (num randomNum) { Console.WriteLine(猜小了); guessCount; goto Guest; } else { Console.WriteLine(猜对了); } }4. 关键说明上述示例中当用户输入的性别不是“男”或“女”时会通过goto inputSex跳转到标记处重新执行输入逻辑直到输入合法为止。⚠️ 注意goto语句容易导致代码逻辑混乱如无限跳转、跳转逻辑不清晰上述功能更推荐使用while/do...while循环实现代码可读性更强。二、可空类型一、可空类型核心定义C#中数据类型分为值类型如int、double、bool等和引用类型如string两者对null的支持不同值类型默认只能表示自身范围内的数据如int只能表示正数、负数、0不能表示nullnull表示“无值”引用类型可以表示null如string可赋值为null表示字符串无值。可空类型的作用扩大值类型的表示范围让值类型不仅能表示自身正常范围的数据还能表示null无值。二、可空类型语法重点1. 定义格式在值类型后面加?即可定义可空类型变量语法如下// 格式值类型? 变量名 null;可赋值为null也可赋值为该类型的正常数据 int? c null; // 定义int类型的可空变量c初始值为null c 19; // 后续可赋值为int类型的正常数据19是int类型符合要求常见可空类型示例int?可空int、double?可空double、bool?可空bool。2. 不可直接赋值的易错点可空类型变量如int?和普通值类型变量如int范围不匹配不能直接赋值否则会报错。int? c null; // int d c; // 错误等号左右范围不匹配c可表示nulld不能表示null3. 可空类型转普通值类型?? 空合并运算符使用??空合并运算符可将可空类型转换为普通值类型语法规则如下普通值类型 变量名 可空类型变量 ?? 默认值;核心逻辑如果可空类型变量不为null则取可空类型变量的值如果可空类型变量为null则取??后面的默认值。int? c null; int d c ?? 10; // c为null取默认值10d的值为10 c 19; int e c ?? 10; // c不为null取c的值19e的值为19三、完整实战案例对应代码namespace _03可空类型 { internal class Program { static void Main(string[] args) { string s ;// 空字符串不是null是有值的值为空字符串 // 值类型只能表示自身范围数据不能表示null // 引用类型可以表示null如string string s1 null; // 引用类型string可赋值为null // int b null; // 错误int是值类型不能直接赋值为null int a 10; // 普通int类型只能表示正数、负数、0不能表示null // 可空类型定义值类型? 变量名 null;扩大值类型表示范围可表示null int? c null;// 在int后加?定义可空int变量c初始值为null c 19; // 可赋值为int类型的正常数据19 // int d c; // 错误可空类型int?不能直接赋值给普通值类型int // 使用??空合并运算符将可空类型转为普通值类型 int d c ?? 10; // c不为null取c的值19若c为null取默认值10 Console.WriteLine(d); // 输出19 } } }代码说明string s 空字符串不是nullnull表示“无值”空字符串是“有值但值为空”string s1 null引用类型可直接赋值为null符合语法int? c null正确定义可空int类型可表示null和int范围内的所有数据int d c ?? 10通过空合并运算符安全将可空类型转为普通int类型避免报错。四、易错点提醒高频踩坑混淆“空字符串”和“null”string s 是空字符串有值string s1 null是无值两者不同直接给普通值类型赋值null如int b null语法错误必须使用可空类型int?可空类型直接赋值给普通值类型如int d cc是int?范围不匹配必须使用??运算符转换误以为所有类型都能直接表示null只有引用类型和可空值类型能表示null普通值类型不能。五、核心总结可空类型作用让值类型int、double等能表示null扩大其表示范围定义语法值类型? 变量名 null;关键是加?转换方法使用??空合并运算符将可空类型转为普通值类型避免报错核心区别普通值类型不能表示null可空值类型和引用类型可以表示null注意空字符串≠ null前者是有值后者是无值。