#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];
}