Параметры передаются по значению в C #, если они не помечены модификаторами ref
или out
.Для ссылочных типов это означает, что ссылка передается по значению.Следовательно, в Fuss
, l
ссылается на тот же экземпляр List<int>
, что и его вызывающая сторона.Поэтому любые изменения этого экземпляра List<int>
будут видны вызывающей стороной.
Теперь, если вы пометите параметр l
с помощью ref
или out
, то параметр будет передан по ссылке,Это означает, что в Fuss
, l
- это псевдоним для места хранения, используемый в качестве параметра для вызова метода.Для ясности:
public void Fuss(ref List<int> l)
вызывается
List<int> list = new List<int> { 1, 2, 3 };
Fuss(list);
Теперь, в Fuss
, l
является псевдонимом для list
.В частности, если вы назначите новый экземпляр List<int>
на l
, вызывающая сторона увидит этот новый экземпляр, также назначенный переменной list
.В частности, если вы скажете
public void Fuss(ref List<int> l) {
l = new List<int> { 1 };
}
, то вызывающая сторона теперь увидит список с одним элементом.Но если вы скажете
public void Fuss(List<int> l) {
l = new List<int> { 1 };
}
и позвоните по
List<int> list = new List<int> { 1, 2, 3 };
Fuss(list);
, то вызывающий абонент все равно увидит list
как имеющий три элемента.
Очистить?