如何在C#中存储对整数的引用?

时间:2010-06-06 19:44:40

标签: c# reference value-type

  

可能重复:
  How do I assign by “reference” to a class field in c#?

大家好 - 请告诉我如何使这项工作?基本上,我需要一个整数引用类型(int *可以在C ++中工作)

class Bar
{
   private ref int m_ref;     // This doesn't exist

   public A(ref int val)
   {
      m_ref = val;
   }

   public void AddOne()
   {
      m_ref++;
   }
}

class Program
{
   static void main()
   {
      int foo = 7;
      Bar b = new Bar(ref foo);
      b.AddOne();
      Console.WriteLine(foo);    // This should print '8'
   }
 }

我必须使用拳击吗?

修改 也许我应该更具体一点。我正在编写一个BitAccessor类,它只允许访问各个位。这是我想要的用法:

class MyGlorifiedInt
{
   private int m_val;
   ...
   public BitAccessor Bits {
      return new BitAccessor(m_val);
   }
}

用法:

MyGlorifiedInt val = new MyGlorifiedInt(7);
val.Bits[0] = false;     // Bits gets a new BitAccessor
Console.WriteLine(val);  // outputs 6

要使BitAccessor能够修改m_val,它需要对它进行引用。但是我想在很多地方使用这个BitAccessor,只需要引用所需的整数。

4 个答案:

答案 0 :(得分:7)

您不能直接存储对这样的整数的引用,但可以存储对包含它的GlorifiedInt对象的引用。在你的情况下,我可能做的是使BitAccessor类嵌套在GlorifiedInt内(以便它可以访问私有字段),然后在this时传递给m_val的引用。它已创建,然后可用于访问class Program { static void Main(string[] args) { var g = new GlorifiedInt(7); g.Bits[0] = false; Console.WriteLine(g.Value); // prints "6" } } class GlorifiedInt { private int m_val; public GlorifiedInt(int value) { m_val = value; } public int Value { get { return m_val; } } public BitAccessor Bits { get { return new BitAccessor(this); } } public class BitAccessor { private GlorifiedInt gi; public BitAccessor(GlorifiedInt glorified) { gi = glorified; } public bool this[int index] { get { if (index < 0 || index > 31) throw new IndexOutOfRangeException("BitAcessor"); return (1 & (gi.m_val >> index)) == 1; } set { if (index < 0 || index > 31) throw new IndexOutOfRangeException("BitAcessor"); if (value) gi.m_val |= 1 << index; else gi.m_val &= ~(1 << index); } } } } 字段。以下是一个可以满足您需求的示例:

{{1}}

答案 1 :(得分:3)

您不需要引用整数 - 只需将整数放在引用类型中 - 这几乎就是您已经完成的操作。只需更改此行:

Console.WriteLine(foo);

为:

Console.WriteLine(bar.Value);

然后为类Bar添加适当的访问者,并删除编译错误(删除ref个关键字)。

另一种方法是通过引用将整数传递给函数:

static void AddOne(ref int i)
{
    i++;
}

static void Main()
{
    int foo = 7;
    AddOne(ref foo);
    Console.WriteLine(foo);
}

输出:

8

答案 2 :(得分:-1)

您没有指明您反对不安全的代码,因此这应该有效:

unsafe class Bar {
    private int* m_ref;

    public Bar(int* val) {
        m_ref = val;
    }

    public void AddOne() {
        *m_ref += 1;
    }
}

unsafe class Program {
    static void Main() {
        int foo = 7;
        Bar b = new Bar(&foo);
        b.AddOne();
        Console.WriteLine(foo);    // prints 8
        Console.ReadLine();
    }
}

我从来没有在C#中使用指针,但似乎有用。我只是不确定可能的副作用是什么。

答案 3 :(得分:-1)

这不会直接回答您的问题,但您不能只使用System.Collections.BitArray类吗?

只是想知道你是否“重新发明轮子”?