Вы не можете сохранить ссылку на такое целое число напрямую, но вы можете сохранить ссылку на объект 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);
}
}
}
}
Вам не нужно иметь ссылку на целое число - просто поместите целое число в ссылочный тип - это почти то, что вы уже сделали. Просто измените эту строку:
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
Вы не указали, что выступаете против небезопасного кода, так что это должно сработать:
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#, но, похоже, это работает. Я просто не уверен, каковы возможные побочные эффекты.
Это не дает прямого ответа на ваш вопрос, но можно ли просто использовать класс System.Collections.BitArray ?
Просто интересно, если вы «повторно- изобретая колесо »?