You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:56:02