Это звучит, как вы получили ответ на ваш вопрос уже большего. Но давайте рассмотрим этот вариант.
Есть ли способ заставить это ключевое слово действовать как аргумент ref?
Да. Работайте это логически.
- реф аргумент делает псевдоним для переменной.
- «этот» не является переменной в ссылочного типа
- «это» является переменной в типе значения
- поэтому единственный способ передать «реф это» от метода экземпляра типа значения ,
И на самом деле это то, как «это» реализовано в виде значений за кулисами. Когда у вас есть (худшая практика!на самом деле не делать этого) изменяемый тип значения:
struct S
{
private int x;
public void M()
{
this.x = 123;
}
}
...
S s = new S();
s.M();
Поскольку случаи S являются передается по значению как получается, что M мутирует s? s должны быть переданы по ссылке! На самом деле код мы создаем так же, как если бы вы написали что-то вроде:
struct S
{
private int x;
public static void M(ref S THIS)
{
THIS.x = 123;
}
}
...
S s = new S();
S.M(ref s);
Короче говоря, «это» в структуры уже передается в качестве параметра реф, так что нет никаких проблем, проходя его вдоль еще раз. Это почти всегда ужасная идея, но это законно.
Да, вы совершенно правы. Но я хочу, чтобы первоначальный класс сохранял изменения, внесенные посетителем. Если я не передаю как ref, то не могу ли я изменить свойства * копии *? –
grefly
@grefly: Нет, если «это» - класс. Если вы не «посещаете» настраиваемую структуру (типы значений), ref не требуется. –
Спасибо, ты в порядке! – grefly