public static int SomeMethod(string local, ref string strParam)
{
local = SomeStaticlyHeldString;
strParam = SomeStaticlyHeldString;
int localInt = local.Length;
return strParam.Length;
}
Присвоение local
означает, что место в памяти, которое помечает local
, теперь указывает на тот же объект, на который указывал SomeStaticlyHeldString
.
Присвоение strParam
означаетчто место в памяти, которое аргумент передал методу с использованием меток ref
, теперь указывает на тот же объект, на который указывал SomeStaticlyHeldString
.
Получение local.Length
запрашивает объект, на который указывает local
к.Получение strParam.Length
запрашивает объект, на который указывает переменная, на которую указывает strParam
.
Они действительно ведут себя очень по-разному, не только в точке, где определен параметр или local, но при каждом использованиииз них.То, что разница в значительной степени скрыта, делает их еще более разными, поскольку каждая операция над ними отличается по своему действию.
Если бы у нас был язык более низкого уровня, в котором не было ничего, кроме локальных переменных, объекты были бы некой локальнойкуча и указатели на оба из них, тогда local
будет иметь тип string*
и strParam
типа string**
.Это было бы так, как мы выполняли бы операции подобного рода в C, и как мы могли бы делать это в C ++, хотя он также имеет ссылочные типы (хотя в C ++ тип - это ссылочный тип, более четко является частью определения его типа, иони имеют дальнейшее использование и уточнения).C # скрывает почти все это от нас в своем синтаксисе.Это всегда спорно, как полезно любое сокрытие деталей, но в этом случае существует не так много на пути ничего полезного прячась, так что тот, который один будет трудно нажатым критиковать.