Как «сделать» ByVal в C # - PullRequest
22 голосов
/ 15 июня 2010

Насколько я понимаю, C # передает параметры в методы по ссылке. В VB.NET вы можете указать это с помощью ByVal и ByRef. По умолчанию установлено значение ByVal.

Это для совместимости с Visual Basic 6.0, или это просто случайно? Кроме того, как я могу указать, что использовать в C #? Мне нравится идея передачи параметров по значению.

Ответы [ 3 ]

53 голосов
/ 15 июня 2010

Параметры в C # по по умолчанию передаются по значению.Не существует модификатора, чтобы сделать это явным, но если вы добавите ref / out, то параметр будет по ссылке.

Обычная путаница здесь - это разница между:

  • передача типа значения по значению (изменения в типе значения не видны вызывающей стороне, но в любом случае типы значения в идеале должны быть неизменными)
  • передача значения по ссылке (изменения значения-type видимы для вызывающей стороны, но типы значений в любом случае в идеале должны быть неизменяемыми - так важно, что я скажу это дважды; p)
  • передача ссылки по значению (изменяется на fields / properties типа ref видимы для вызывающей стороны, но переназначает ref-тип для нового / другого объекта не видимый)
  • , передавая ссылкупо ссылке (изменения в полях / свойствах, и переназначение ссылки видимы для вызывающей стороны)
12 голосов
/ 15 июня 2010

Передача по значению является значением по умолчанию в C #. Однако, если передаваемая переменная имеет ссылочный тип, вы передаете reference по значению. Это, возможно, источник вашей путаницы.

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

7 голосов
/ 15 июня 2010

Параметры в C # передаются «ByVal» по умолчанию.Вы должны указать «ref» или «out», если хотите другое поведение.

...