Автосвойства

Нет, ошибаетесь. Доступ только на чтение закрывает возможность менять поле отовсюду:

type A = class
  fa: integer;
  property a: integer read fa;
end;

begin
  var a1 := new A;
  a1.a := 2;
end.
1 лайк

Это касается обычных свойств. Но авто свойство - это обёртка для поля, которая выглядит как свойство, но работает как поле.

Не всегда у свойства должен быть дополнительный функционал. Часто может быть нужна лишь сама обёртка - свойство, причем создание поля явно было бы излишним, так как вызывает загромождение кода. В данной ситуации автосвойства являются полезными. Тем более, они позволят проще следовать стандартам .Net Framework.

2 лайка

Не закрывает:

type
  A = class
    fa: integer;
    property a: integer read fa;
  end;

begin
  var a1 := new A;
  a1.fa := 2; // Неправильно, но: private и protected члены видны отовсюду в пределах модуля, в котором определен класс. (Из справки)
end.

Требуется разграничение на секции с разным уровнем доступа. Поле - в секцию с уровнем доступа private/protected/internal (в крайнем случае, так как он предоставляет самый высокий уровень доступа из данных трех), свойство - с уровнем доступа public, то есть, к примеру, так:

type
  A = class
  private
    fa: integer;
  
  public
    property a: integer read fa;
  end;

begin
  var a1 := new A;
end.

Новые ключевые слова в контексте введения автосвойств никогда не предлагались. read и write для этих целей предостаточно.

1 лайк

К слову, почему они до сих пор никак не выделяются в среде?

Думаю, что это ограничение должен указывать сам программист в геттере или сеттере автосвойства. Не вижу смысла в том, чтобы данное ограничение было по умолчанию и его никак нельзя было бы снять. Тем более, в C# автосвойства данным ограничением не обладают. Следует заметить, что именно из C# пришла идея сделать их и здесь.

Сделаем автосвойства сразу на чтение и запись. Ограничивать их использование и делать что то типа private set не будем

@Admin:

type
  TName<T> = class
    auto property X: T read; // readonly автосвойство
    auto property Y: T write; // writeonly автосвойство
    auto property Z: T read write; // автосвойство с доступом на чтение и запись
  end;

begin
end.

, думаю этого будет предостаточно. Заранее спасибо.

2 лайка

Есть одна проблема. Автосвойство со способом доступа read Вы потом не инициализируете

Я не зря создавал эту Issue:

1 лайк

Инициализировать можно и сразу при объявлении. А вообще, зачем нужны автосвойства с доступом только на чтение? В этом случае, writeonly имеет гораздо больше смысла.

Чисто write-/readonly автосвойства не имеют особого смысла. Readonly можно инициализировать только при объявлении, а writeonly невозможно будет прочитать, т.е. вообще бред.

Ну у нас и обычные свойства не инициализируются. Это тянет за собой знаете ли - многое…

Так ведь default есть?

Да, согласен.

1 лайк

А зачем read автосвойства? Ума не приложу.

1 лайк

Моё предложение. Автосвойства - только readwrite. Иное запретить.

1 лайк

Да, @Gleb, думаю, Вы правы. В C# автосвойства не могут быть read-/writeonly.

Я вот ума не приложу, зачем тут больше половины предложенного за последние месяцы. А Вы только первый раз… )))