2010-03-31 2 views
0

В C++, у меня есть функция:Изменение фактического параметра в C#

void MyFunction(int p) 
{ 
    p=5; 
} 

Предполагают, у меня есть:

int x = 10; 
MyFunction(x); // x = 10 
MyFunction(&x); // x = 5 

Как АРХИВ это в C# с условием: я создаю только один MyFunction ,

+1

Это не работает, как вы описываете на C++, либо ... –

ответ

3

Ваша функция C++ не работает так, как вы думаете. Фактически, ваш код не будет компилироваться.

В C#, вы бы использовать ref или out ключевые слова:

void MyFunction1(out int p) 
{ 
    p = 5; 
} 

void MyFunction2(ref int p) 
{ 
    p = p + 1; 
} 

int x; 
MyFunction1(out x); // x == 5 
MyFunction2(ref x); // x == 6 
1

C# не имеет эквивалентную функциональность. Если вы объявите метод иметь параметр ref, тогда вы также должны указать, что параметр является типом ref, когда вы вызываете метод.

2

В C# вы должны объявить метод с параметром ref, как это:

void MyFunction(ref int p) 
{ 
    p=5; 
} 

Если вы затем вызвать его как MyFunction(ref x) значение х в вызывающем будет изменен. Если вы не хотите, чтобы он был изменен, просто скопируйте его в фиктивную переменную. Вы можете создать перегрузку MyFunction, что делает это внутренне:

void MyFunction(int p) 
{ 
    MyFunction(ref p); 
} 

Было бы технически не быть «одна функция», как вы хотите, но код не будет дублироваться и любому человеку, читающему ваш код было бы отображаются как один, но для компилятора это два. Вы могли бы назвать их так:

int x = 10; 
MyFunction(x); // x = 10 
MyFunction(ref x); // x = 5 
0

Вам необходимо передать параметр в качестве ссылки. Если вы не указали его, он автоматически создает копию для работы внутри параметра вместо использования той же ссылки.

Как это сделать? Просто укажите с «реф» слово в объявлении метода:

void MyFunction(ref int p) 
{ 
    p=5; 
} 

int x = 10; 
MyFunction(ref x); // x = 5 
0

Дело в том, что многие люди думают, что Ссылочные типы передаются по ссылке и типы значений передаются по значению. Это имеет место с точки зрения пользователя, внутренние и ссылочные и значения типов передаются только по значению. Когда тип ссылки передается как параметр, его значение, которое является ссылкой на фактический объект, передается. В случае типов значений их значение является самим значением (например, 5).

StringBuilder sb = new StringBuilder(); 
SetNull(sb); 
SetNull(ref sb); 

если SetNull (...) устанавливает параметр в NULL, то второй вызов будет установлен переданным в параметре StringBuilder к нулю.

Смежные вопросы