Существует ли способ вынудить это ключевое слово действовать как касательно аргумента? Я хотел бы передать в посетителе, который изменяет несколько свойств на объекте, но это только хочет действовать как параметр, передаваемый по значению.
Код в объекте:
public void Accept(Visitor<MyObject> visitor)
{
visitor.Visit(this);
}
Код в посетителе:
public void Visit(ref Visitor<MyObject> receiver)
{
receiver.Property = new PropertyValue();
receiver.Property2 = new PropertyValue();
}
Поскольку вы фактически не меняете получатель
ссылается на то, что ключевое слово ref
не требуется. Однако, если бы это было так, вы не смогли бы сделать this
ссылкой на другой экземпляр.
Чтобы передать этот
в качестве параметра ref
, вам нужно будет написать его так:
Visit(ref this);
Этот код не будет компилироваться: «Не удается передать»
Если ваш Visitor
является классом, вам не нужно ключевое слово ref
.
Вся информация внутри класса автоматически изменяется, если она изменяется в методе
Похоже, вы уже получили ответ на свой более крупный вопрос. Но давайте все равно рассмотрим это.
Есть ли способ заставить ключевое слово this действовать как аргумент ref?
Да. Продумайте это логически.
И на самом деле именно так «this» за кулисами реализуется в типе значения. Если у вас есть (худшая практика! На самом деле этого не делайте) изменяемый тип значения:
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);
Короче говоря, «this» в структуре уже передается как параметр ref, поэтому нет проблем с его повторной передачей. Это почти всегда ужасная идея , но это законно.
Вам действительно нужно ключевое слово ref?
ref будет полезно, если вы измените экземпляр получателя , например Receiver = null;
в противном случае
Receiver.Property доступен также без ключевого слова ref