Используя касательно Параметра с этим Ключевым словом?

Существует ли способ вынудить это ключевое слово действовать как касательно аргумента? Я хотел бы передать в посетителе, который изменяет несколько свойств на объекте, но это только хочет действовать как параметр, передаваемый по значению.

Код в объекте:

public void Accept(Visitor<MyObject> visitor)
{
    visitor.Visit(this);
}

Код в посетителе:

public void Visit(ref Visitor<MyObject> receiver)
{
    receiver.Property = new PropertyValue();
    receiver.Property2 = new PropertyValue();
}
5
задан ChrisF 15 April 2010 в 16:14
поделиться

4 ответа

Поскольку вы фактически не меняете получатель ссылается на то, что ключевое слово ref не требуется. Однако, если бы это было так, вы не смогли бы сделать this ссылкой на другой экземпляр.

Чтобы передать этот в качестве параметра ref , вам нужно будет написать его так:

Visit(ref this);

Этот код не будет компилироваться: «Не удается передать» 'как аргумент ref или out, потому что он доступен только для чтения "

10
ответ дан 18 December 2019 в 08:27
поделиться

Если ваш Visitor является классом, вам не нужно ключевое слово ref .

Вся информация внутри класса автоматически изменяется, если она изменяется в методе

5
ответ дан 18 December 2019 в 08:27
поделиться

Похоже, вы уже получили ответ на свой более крупный вопрос. Но давайте все равно рассмотрим это.

Есть ли способ заставить ключевое слово this действовать как аргумент ref?

Да. Продумайте это логически.

  • Аргумент ref создает псевдоним для переменной .
  • «this» не является переменной в ссылочном типе
  • «this» - это переменная в типе значения
  • , поэтому единственный способ передать «ref this» - из метода экземпляра типа значения .

И на самом деле именно так «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, поэтому нет проблем с его повторной передачей. Это почти всегда ужасная идея , но это законно.

4
ответ дан 18 December 2019 в 08:27
поделиться

Вам действительно нужно ключевое слово ref?

ref будет полезно, если вы измените экземпляр получателя , например Receiver = null;

в противном случае

Receiver.Property доступен также без ключевого слова ref

0
ответ дан 18 December 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: