C # Указатели в аргументах метода? - PullRequest
6 голосов
/ 06 сентября 2010

Я хочу напрямую изменить значение переменной вне метода изнутри.
Указатели - правильный путь?

Как?

Ответы [ 5 ]

13 голосов
/ 06 сентября 2010

Нет. В c # вы можете применить семантику передачи по ссылке, используя модификаторы ref или out:

void Foo( ref string s, ref int x )
{
    s = "Hello World"; // caller sees the change to s
    x = 100;           // caller sees the change to x
}

// or, alternatively...

void Bar( out string s )
{
    s = "Hello World"; 
}

Разница между этими двумя заключается в том, что при out вызывающему не требуется указывать значение при вызове метода, поскольку требуется, чтобы вызываемый метод присвоил значение до выхода.

В C # «указатели» - это то, что вы можете использовать только в небезопасном коде . Как и в C или C ++, указатели в C # позволяют ссылаться на расположение переменной или объекта. Ссылки в C # отличаются - вы не должны думать о них как о указателях - они предназначены для того, чтобы быть более непрозрачными и предоставлять способ «ссылаться» на переменную или объект, не обязательно подразумевая, что они указывают на его местоположение в памяти. *

Со ссылками вы можете использовать специальные ключевые слова (out, ref) для передачи псевдонима переменной. Они доступны только в контексте вызовов методов - где компилятор может использовать информацию о времени жизни ссылок, чтобы убедиться, что ссылка не переживает исходную переменную с псевдонимом.

8 голосов
/ 06 сентября 2010

Вы можете использовать ключевое слово параметра метода ref :

void modifyFoo(ref int foo)
{
    foo = 42;
}

Звоните так:

int myFoo = 0;
modifyFoo(ref myFoo);
Console.WriteLine(myFoo);

Результат:

42

Из документации:

Ключевое слово параметра метода ref для параметра метода заставляет метод ссылаться на ту же переменную, которая была передана в метод. Любые изменения, внесенные в параметр в методе, будут отражены в этой переменной, когда управление вернется к вызывающему методу.

Чтобы использовать параметр ref, аргумент должен быть явно передан методу в качестве аргумента ref. Значение аргумента ref будет передано параметру ref.

1 голос
/ 06 сентября 2010

Указатели - это путь, верно?

Не в C # они не такие.Используйте параметры ref:

 void Times2(ref int a) { a = a * 2; }

 void Foo()
 {
      int x = 1;
      Times2(ref x);
      // x is now 2 
 }
1 голос
/ 06 сентября 2010

Используйте ref.Например, Foo(ref int i) позволит Foo изменить значение i через ссылку на значение вызывающего абонента.

0 голосов
/ 06 сентября 2010

Если значение является классом, то оно уже передано по ссылке, и больше ничего не требуется, если только вам не нужно присвоить объект чему-либо, val = anotherobject, тогда вам нужно использовать ключевые слова ref или out.

Если это структура (int, float, long, double и т. Д.), То вы должны использовать ref (если объект может или не может быть изменен) или out (если объект будет изменен). В методе может быть несколько аргументов, помеченных ref или val.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...