Ссылка на указатель C # - PullRequest
2 голосов
/ 26 мая 2011

Есть ли способ создать указатель в стиле c ++ в c #? Мне нужно это, чтобы установить int в нескольких местах, когда я не знаю, какой это int.
Как в C ++ я бы сделал:

int *i;
if(cond0) i = &someint;
if(cond1) i = &otherint;
if(cond2) i = &thirdint;

if(cond3) *i = someval;
if(cond4) *i = otherval;
if(cond5) *i = thirdval;

Если я сделаю это в стиле c #, мне понадобится 9 ifs, и у моей программы гораздо больше условий, так что это невозможно.
Я думал о том, чтобы сделать что-то вроде:

int val;
if(cond3) val = someval;
if(cond4) val = otherval;
if(cond5) val = thirdval;

if(cond0) someint = val;
if(cond1) otherint = val;
if(cond2) thirdint = val;

но это невозможно, потому что cond3, 4 и 5 разбросаны по программе.

Ответы [ 4 ]

2 голосов
/ 26 мая 2011

Да, но вы должны заключить любой код, который делает это, в небезопасный блок .

В качестве альтернативы, если это происходит в методе, вы можете использовать 'ref' ключевое слово для передачи параметра по ссылке.

Обе эти опции действительно ограничивают решение границ метода.Если вы имеете дело с чем-то более разбросанным, чем это, в C #, вероятно, лучше попытаться найти способы реорганизации вашего кода, чтобы вместо этого использовать менее глобальное состояние.

1 голос
/ 26 мая 2011

Вот пример указателей C # , который иллюстрирует как их объявление, так и способ их оборачивания в небезопасный блок

Также см. Руководство по программированию C # - Типы указателей

1 голос
/ 26 мая 2011

Да, есть тип IntPtr, который я использую для дескрипторов Windows.

0 голосов
/ 26 мая 2011

Я не уверен, что вы предоставили достаточно информации в своем вопросе, чтобы дать правильный ответ, но одно из возможных решений - установить значения в функции с использованием параметров ref.

class Program
{
    static void Main(string[] args)
    {
        var i = 1;
        var someint = 2;
        var otherint = 3;
        var thirdint = 4;

        Console.WriteLine("i: {0}\nsomeint: {1}\notherint: {2}\nthirdint: {3}", i, someint, otherint, thirdint);
        SetInts(true, false, false, false, false, false, ref i, ref someint, ref otherint, ref thirdint);
        Console.WriteLine("i: {0}\nsomeint: {1}\notherint: {2}\nthirdint: {3}", i, someint, otherint, thirdint);

        Console.ReadKey();
    }

    static void SetInts(bool cond0, bool cond1, bool cond2, bool cond3, bool cond4, bool cond5, ref int i, ref int someint, ref int otherint, ref int thirdint)
    {
        if (cond0) i = someint;
        if (cond1) i = otherint;
        if (cond2) i = thirdint;

        if (cond3) i = someint;
        if (cond4) i = otherint;
        if (cond5) i = thirdint;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...