Ни один из ответов, приведенных до настоящего момента, не является фактическим объяснением.
Ряд ответов, приведенных до сих пор, указывает, что это происходит потому, что int является типом значения. Попробуйте заменить все int
s на object
s в этой программе. Он начинает работать так, как ожидает первоначальный плакат? Нет. Тогда это не имеет никакого отношения к типам значений против ссылочных типов.
Скорее, это связано со значением переменной , независимо от его типа.
Махди, ваше ожидание, что формальный параметр j
обретает значение псевдоним для формального параметра i
, который в свою очередь является псевдонимом для локальной переменной g
, и поэтому любое изменение j
также вызывает изменения в g
, потому что они той же переменной. Это не так. j
, i
и g
являются копий того же значения, но имеют разные места хранения, поэтому мутирующий один не мутирует другой.
Как вы говорите, «этот формальный параметр является псевдонимом для этой переменной» в C#, используя ключевые слова ref
или out
.Так эта программа будет делать то, что вы ожидаете:
delegate void RefAction<T>(ref T t);
...
public static int Dx(ref int i, RefAction<int> act, Func<int, bool> con)
{
if (con(i))
act(ref i);
return i;
}
...
int g = 22;
int false_con = Dx(ref g, (ref int j) => { j = 11; }, z => z != 22);
int true_con = Dx(ref g, (ref int j) => { j = 11; }, z => z == 22);
В «реф» ключевые слова означают, что g
, i
и j
все разные названия одной и той же переменной.
Как отмечает Дэнли, это, вероятно, плохой стиль. Вместо того, чтобы мутировать переменную в методе, вместо этого возвращайте значение, которое вы хотите, чтобы оно было изменено, и позвольте вызывающему абоненту решить, какую переменную нужно мутировать, если таковая имеется.
Похоже, что простой тип ссылочного типа/значения недопонимания. –
@AdrianGodong: Нет, это не имеет никакого отношения к ссылочным типам и типам значений. Это связано с тем, что переменные передаются по значению независимо от того, ограничена ли переменная ссылочным типом или типом значения. –
@ EricLippert Справа, меня путают между (by-) ref и ref-type. –