title: Saving a reference to a int
body: <p>Here is a much simplified version of what I am trying to do</p>
  
  <pre><code>static void Main(string[] args)
  {
      int test = 0;
      int test2 = 0;
      Test A = new Test(ref test);
      Test B = new Test(ref test);
      Test C = new Test(ref test2);
      A.write(); //Writes 1 should write 1
      B.write(); //Writes 1 should write 2
      C.write(); //Writes 1 should write 1
      Console.ReadLine();
  }
  class Test
  {
      int _a;
      public Test(ref int a)
      {
          _a = a; //I loose the reference here
      }
      public void write()
      {
          var b = System.Threading.Interlocked.Increment(ref _a);
          Console.WriteLine(b);
      }
  }
  </code></pre>
  
  <p>In my real code I have a int that will be incremented by many threads however where the threads a called it will not be easy to pass it the parameter that points it at the int(In the real code this is happening inside a <code>IEnumerator</code>). So a requirement is the reference must be made in the constructor. Also not all threads will be pointing at the same single base int so I can not use a global static int either. I know I can just box the int inside a class and pass the class around but I wanted to know if that is the correct way of doing something like this?</p>
  
  <p>What I think could be the correct way:</p>
  
  <pre><code>static void Main(string[] args)
  {
      Holder holder = new Holder(0);
      Holder holder2 = new Holder(0);
      Test A = new Test(holder);
      Test B = new Test(holder);
      Test C = new Test(holder2);
      A.write(); //Writes 1 should write 1
      B.write(); //Writes 2 should write 2
      C.write(); //Writes 1 should write 1
      Console.ReadLine();
  }
  class Holder
  {
      public Holder(int i)
      {
          num = i;
      }
      public int num;
  }
  class Test
  {
      Holder _holder;
      public Test(Holder holder)
      {
          _holder = holder;
      }
      public void write()
      {
          var b = System.Threading.Interlocked.Increment(ref _holder.num);
          Console.WriteLine(b);
      }
  }
  </code></pre>
  
  <p>Is there a better way than this?</p>