Все, что вы передаете методу в качестве аргументов, передается по значению, которое для ссылочных типов означает, что ссылка передается по значению. Таким образом, вы не можете изменить объект на другой, но вы, несомненно, можете изменить его содержимое (потому что это не меняет фактическую ссылку, просто немного памяти в другом месте).
Как показывает ваш пример с массивом, вы берете ссылку на массив (но не меняете ее) и меняете значение в массива. Это все равно что взять некоторый объект и изменить значение свойства. Вы можете сделать это просто изнутри метода тоже.
Если вы хотите изменить строку, которая является неизменным объектом в .NET, вам нужно прибегнуть к ref
параметрам:
public static void StrPassing(ref string someStr)
{
string otherStr="Changed!";
someStr=otherStr;
}
И назовите это так:
string foo = "foo";
StrPassing(ref foo);
Console.WriteLine(foo); // should print "Changed!"
Ключевое слово ref
гарантирует, что ваш метод получает фактическую ссылку на строку и может изменить ее, а не просто копию ссылки. Итак, вы можете заменить объект на совершенно новый.
Возвращаясь к вашему массиву: вам тоже будет непросто изменить переданный массив на совершенно другой массив:
public static void NumPassing(int[] a)
{
a = new int[15];
}
тоже не сработает, потому что , тогда вы бы попробовали точно так же, как заменить строку на совершенно другую строку.