Имеет ли значение «только для чтения» для свойства ref struct, предназначенного только для получения, в интерфейсе?

#c#

#c#

Вопрос:

Если у меня есть интерфейс, который указывает ref readonly на свойство, у которого есть только средство получения, имеет ли это readonly какой-либо смысл, т. Е. Является ли оно избыточным?

 struct Foo
{
}

interface IBar
{
    ref readonly Foo F { get; }
}
  

Комментарии:

1. Если вам просто нужно свойство только для чтения, удалите ref и readonly

Ответ №1:

Я думаю, что я понял это.

Средство получения возвращает ссылку на указанную переменную. Если ref не объявлено как readonly , вызывающий объект, получивший ссылку, все еще может изменять переменную. Итак, да, readonly имеет смысл.

Я думаю, что случай, когда readonly является избыточным только тогда, когда сама структура уже объявлена как readonly .

Ответ №2:

Там ref и интерфейс здесь излишни… В любом случае вы получаете ref независимо от вашего примера. Единственное существенное отличие, которое readonly имело бы значение для get свойства only в структуре, не доступной только для чтения, заключается в том, что с in параметром компилятор создаст защитную копию параметра для каждого вызова элемента экземпляра

Как показано здесь

Учитывая

 public struct Foo
{
   private readonly int[] _array ;
   public Foo(int[] array ) => _array = array;     
   public readonly ref int this[int i] => ref _array[i];
}

public  struct Foo2
{
   private readonly int[] _array ;
   public Foo2(int[] array ) => _array = array;     
   public ref int this[int i] => ref _array[i];
}

...

public float M(in Foo value) => value[0]   value[1];

public float M2(in Foo2 value) =>  value[0]   value[1];
  

Выданный IL будет приравниваться к

 public float M([In] [IsReadOnly] ref Foo value)
{
    return value[0]   value[1];
}

public float M2([In] [IsReadOnly] ref Foo2 value)
{
    Foo2 foo = value;
    int num = foo[0];
    foo = value;
    return num   foo[1];
}