Почему тип параметра ref отличается от обычного типа? - PullRequest
6 голосов
/ 17 января 2012

Я понимаю, как переходить между двумя разными типами, но мой вопрос таков; почему эта разница на уровне типа ?

Я бы подумал, что это будет свойство объекта ParamterInfo, а не отдельный специальный тип.

Предполагая, что он представлен в виде отдельного типа в отражении, потому что именно так он и есть, какие преимущества в языке имеет его наличие в качестве отдельного типа (я предполагаю, что более простое разрешение перегрузки метода или что-то в этом роде)?

В аналогичной заметке, почему ref делает отдельный тип, а out - нет (я не могу думать о причинах, по которым ref является отдельным типом, которые не относятся к out )

Ответы [ 2 ]

6 голосов
/ 17 января 2012
Параметры

ref имеют различные типы, поскольку типы ref также разрешены и полезны в других контекстах, чем параметры. C # не позволяет этого, но другие языки (по крайней мере, C ++ / CLI) поддерживают, например, локальные переменные ссылочного типа. Такая вещь имеет смысл для ref, но не для out.

Притворство C # позволяет, вы можете написать (это поддерживается IL):

int x = 3;
ref int y = x;
y = 4;
if (x == 4)
    MessageBox.Show("x is 4");

Это не пример, когда он полезен , но в тех же ситуациях, когда параметры ref полезны, также может быть полезно использовать вспомогательный класс или структуру с ref поле.

5 голосов
/ 17 января 2012
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 # скрывает почти все это от нас в своем синтаксисе.Это всегда спорно, как полезно любое сокрытие деталей, но в этом случае существует не так много на пути ничего полезного прячась, так что тот, который один будет трудно нажатым критиковать.

...