是否可以为事件处理程序声明一个全局变量?

Is it possible to declare a global variable for an event handler?

如何以及在哪里可以将下面的变量i声明为全局变量?(我在MyClass下面的main上面声明它时出错)

    class MyClass
    {
     
        public static void Main()
        {
            
    
            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            
    
        }
     
        public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
          int i;
    
         //
         my_method();
        }
    
    private static void my_method(){
    
    //
    
        }

}

在我的代码中,出于某种原因,我希望将 i 存储为全局变量,以存储 i 的先前值。

class MyClass
{
    public static int i;
    
    public static void Main()
    {
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    }

    public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        i = 1;
        //
        my_method();
    }

    private static void my_method()
    {
        i = 2;
    }
}

变量是public还是protected,可以参考下面的内容。如果它仅在 MyClass class 中被引用,那么 protected 就足够了。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

将此放入您的 MyClass class:

private static int _i = 0;
private static List<int> _previousValuesOfI = new List<int>();

public static int I
{
    get => _i;
    set
    {
        if (_i != value)
        {
            _previousValuesOfI.Add(value);
        }

        _i = value;
    }
}

public static IEnumerable<int> PreviousIValues => _previousValuesOfI;

现在,任何人都可以通过 MyClass.I 获取全局 I 的当前值。他们也可以用同样的方式设置 I 的当前值。但是,当他们这样做时,您会跟踪以前的版本,这些版本可从 PreviousIValues 属性 获得(最旧的版本在前)。如果你想把最旧的版本放在最后,考虑使用 _previousValuesOfI.Insert(0, value); 而不是 _previousValuesOfI.Add(value);