C#负数检测事件异常:仅触发一次后程序终止问题排查
解决C#委托事件只触发一次的问题
嘿,作为C#初学者遇到这种问题太正常啦!咱们先聊聊最可能的原因,再给你一个能正常工作的示例代码~
最常见的问题:没有循环接收用户输入
很多刚接触的同学写完一次输入判断就结束程序了,自然只能触发一次负数检测。你需要给程序加个循环(比如while循环),让它一直等待用户输入,直到你主动选择退出。
少见但可能的坑:意外取消了事件订阅
如果你的代码里触发事件后不小心用了-=取消订阅,那后续输入负数就再也不会触发事件了。要确保事件订阅只做一次,放在循环外面就行。
修正后的示例代码
这是一个能每次输入负数都触发Invalid Value提示的完整程序:
using System; class NumberChecker { // 定义委托类型 public delegate void InvalidValueHandler(); // 声明事件 public event InvalidValueHandler InvalidValueDetected; public void CheckInput(int number) { if (number < 0) { // 触发事件前先检查是否有订阅者,避免空引用异常 InvalidValueDetected?.Invoke(); } else { Console.WriteLine($"Valid value: {number}"); } } } class Program { static void Main(string[] args) { NumberChecker checker = new NumberChecker(); // 订阅事件——只需要执行一次,放在循环外面 checker.InvalidValueDetected += ShowInvalidMessage; Console.WriteLine("请输入数字(输入'exit'退出程序):"); // 用循环持续接收用户输入 while (true) { string input = Console.ReadLine(); // 允许用户主动退出 if (input.Equals("exit", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("程序已退出~"); break; } // 尝试把输入转换成整数,处理非数字输入的情况 if (int.TryParse(input, out int number)) { checker.CheckInput(number); } else { Console.WriteLine("请输入有效的整数,或者输入'exit'退出!"); } } } // 事件处理方法 static void ShowInvalidMessage() { Console.WriteLine("Invalid Value"); } }
关键要点说明
- 循环逻辑:
while(true)让程序一直运行,直到用户输入exit才退出,这样就能持续接收输入啦。 - 事件订阅:把事件订阅代码放在循环外面,确保整个程序运行期间订阅关系一直存在。
- 安全触发事件:用
InvalidValueDetected?.Invoke()代替直接调用,避免没有订阅者时抛出空引用异常。 - 容错处理:用
int.TryParse处理用户输入非数字的情况,防止程序崩溃。
你可以对照自己的代码,看看是不是少了循环,或者不小心取消了事件订阅,按照上面的思路调整应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Jens Keller
相关产品推荐
相关产品推荐

