Как сохранить ссылку на целое число в C#? [дубликат]

11
задан Community 23 May 2017 в 12:00
поделиться

4 ответа

Вы не можете сохранить ссылку на такое целое число напрямую, но вы можете сохранить ссылку на объект 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);
            }
    }
    }
}
7
ответ дан 3 December 2019 в 10:43
поделиться

Вам не нужно иметь ссылку на целое число - просто поместите целое число в ссылочный тип - это почти то, что вы уже сделали. Просто измените эту строку:

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
3
ответ дан 3 December 2019 в 10:43
поделиться

Вы не указали, что выступаете против небезопасного кода, так что это должно сработать:

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#, но, похоже, это работает. Я просто не уверен, каковы возможные побочные эффекты.

-1
ответ дан 3 December 2019 в 10:43
поделиться

Это не дает прямого ответа на ваш вопрос, но можно ли просто использовать класс System.Collections.BitArray ?

Просто интересно, если вы «повторно- изобретая колесо »?

-1
ответ дан 3 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: