Does C# support the use of static local variables?

后端 未结 12 932
眼角桃花
眼角桃花 2020-12-14 17:28

Related: How do I create a static local variable in Java?


Pardon if this is a duplicate; I was pretty sure this would have been

12条回答
  •  既然无缘
    2020-12-14 17:59

    I haven't seen a good generic solution to this yet so I thought I'd come up with my own. I should note however that for the most part(not always) needing static local variables is probably a sign that you should refactor your code for the reasons that have been stated by many people; state is something for the object not a method. I do however like the idea of limiting the scope of variables.

    Without further ado:

    public class StaticLocalVariable
    {
        private static Dictionary s_GlobalStates = new Dictionary();
    
        private int m_StateKey;
    
        public StaticLocalVariable()
        {
            Initialize(default(T));
        }
    
        public StaticLocalVariable( T value )
        {
            Initialize(value);
        }        
    
        private void Initialize( T value )
        {
            m_StateKey = new StackTrace(false).GetFrame(2).GetNativeOffset();
    
            if (!s_GlobalStates.ContainsKey(m_StateKey))
            {                
                s_GlobalStates.Add(m_StateKey, value);
            }
        }
    
        public T Value
        {
            set { s_GlobalStates[m_StateKey] = value; }
            get { return s_GlobalStates[m_StateKey]; }
        }
    }
    

    This isn't thread safe of course but it wouldn't take too much work to make it so. It can be used like so:

    static void Main( string[] args )
    {
        Console.WriteLine("First Call:");
        Test();
        Console.WriteLine("");
        Console.WriteLine("Second Call:");
        Test();
        Console.ReadLine();
    }
    
    public static void Test()
    {
        StaticLocalVariable intTest1 = new StaticLocalVariable(0);
        StaticLocalVariable intTest2 = new StaticLocalVariable(1);
        StaticLocalVariable doubleTest1 = new StaticLocalVariable(2.1);
        StaticLocalVariable doubleTest2 = new StaticLocalVariable();
    
        Console.WriteLine("Values upon entering Method: ");
        Console.WriteLine("    intTest1 Value: " + intTest1.Value);
        Console.WriteLine("    intTest2 Value: " + intTest2.Value);
        Console.WriteLine("    doubleTest1 Value: " + doubleTest1.Value);
        Console.WriteLine("    doubleTest2 Value: " + doubleTest2.Value);
    
        ++intTest1.Value;
        intTest2.Value *= 3;
        doubleTest1.Value += 3.14;
        doubleTest2.Value += 4.5;
    
        Console.WriteLine("After messing with values: ");
        Console.WriteLine("    intTest1 Value: " + intTest1.Value);
        Console.WriteLine("    intTest1 Value: " + intTest2.Value);
        Console.WriteLine("    doubleTest1 Value: " + doubleTest1.Value);
        Console.WriteLine("    doubleTest2 Value: " + doubleTest2.Value);            
    }
    
    
    // Output:
    // First Call:
    // Values upon entering Method:
    //     intTest1 Value: 0
    //     intTest2 Value: 1
    //     doubleTest1 Value: 2.1
    //     doubleTest2 Value: 0
    // After messing with values:
    //     intTest1 Value: 1
    //     intTest1 Value: 3
    //     doubleTest1 Value: 5.24
    //     doubleTest2 Value: 4.5
    
    // Second Call:
    // Values upon entering Method:
    //     intTest1 Value: 1
    //     intTest2 Value: 3
    //     doubleTest1 Value: 5.24
    //     doubleTest2 Value: 4.5
    // After messing with values:
    //     intTest1 Value: 2
    //     intTest1 Value: 9
    //     doubleTest1 Value: 8.38
    //     doubleTest2 Value: 9
    

提交回复
热议问题