Здравствуйте, _NN_, Вы писали:
_NN>Собственно в блок default можно писать любое выражение, которым можно инициализировать поле.
Отлично, только большая просьба, кроме тестов добавить к этой фиче описание в вики.
_NN>Вопрос, нужно ли поддерживать синтаксис без скобок для простых выражений ?
да
_NN>Может в таком случае и для get/set поддержать этот синтаксис ?
Здравствуйте, hardcase, Вы писали:
_NN>>Есть предложения по улучшению этого дела ? H>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов.
Разве Accessor не генерирует просто property на соответствующее поле?
И при чём тут инициализатор вообще?
Кстати это забавный баг или фича?
class MyClass
{
public virtual Field1 : int { get; } // ошибки нет
}
Здравствуйте, fddima, Вы писали:
F>Здравствуйте, hardcase, Вы писали:
_NN>>>Есть предложения по улучшению этого дела ? H>>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов. F> Разве Accessor не генерирует просто property на соответствующее поле? F> И при чём тут инициализатор вообще?
F> Кстати это забавный баг или фича? F>
F>class MyClass
F>{
F> public virtual Field1 : int { get; } // ошибки нет
F>}
F>
Здравствуйте, _NN_, Вы писали:
F>> Ну я так понимаю, что кроме макросов к такому полю не достучаться невозсожно (т.к. имя backstore field неизвестно)? _NN>А зачем это нужно ? _NN>Ведь только в конструкторе можно инициализировать readonly.
Ну в общем-то да. Я просто как-то случайно вместо абстрактного свойства сделал виртуальное в варианте и заметил уже потом (компилятор варнинг какой-то сыпал, сейчас не вспомню какой именно). В общем был немало удивлён, но раз это фича тогда окей.
Здравствуйте, fddima, Вы писали:
F> Ну в общем-то да. Я просто как-то случайно вместо абстрактного свойства сделал виртуальное в варианте и заметил уже потом (компилятор варнинг какой-то сыпал, сейчас не вспомню какой именно). В общем был немало удивлён, но раз это фича тогда окей.
Это позволяет более просто и правильней описывать иммутабельные структуры данных.
В отличии от private set , переменную нельзя будет изменить случайно потом.
[Record]
class My
{
public I : int { get; }
public S : string { set; }
}
Здравствуйте, fddima, Вы писали:
H>>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов. F> Разве Accessor не генерирует просто property на соответствующее поле? F> И при чём тут инициализатор вообще?
Код с Accessor-ами не слишком красив — писать свойства удобнее, так как мы ими описываем интерфейс типа, а не его реализацию (поля), к тому же код с автосвойствами короче . Единственный сценарий в котором Accessor удобнее автосвойств — это случай объявления поля с инициализацией. Теперь, когда есть автосвойства с инициализатором, Accessor становится совершенно ненужным.
Здравствуйте, Аноним, Вы писали:
_NN>> public Get : int { get; default { 1 } }
Баба-Яга категорически против default! Это сбивает с толку, подразумевая, что если не писать set, то будет возвращаться всегда 1.
А>А может так лучше ( типа как поля ):
А> public Get : int { get; } = 1;
Так намного лучше. Я бы даже сделал так:
public Name : string = "атас" { get; set; }
...и тогда при первом обращении к свойству вызовется set с value = "атас". Заодно, это вписывается в общий синтаксис инициализации.
Здравствуйте, fddima, Вы писали:
F> Разве Accessor не генерирует просто property на соответствующее поле?
Добавлю к словам Хардкейса, что Accessor еще неудобен при рефакторинге. Можно было бы рефекторинг переименования обучить наличию этой макры, но это хардкод.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, matumba, Вы писали:
M>Баба-Яга категорически против default! Это сбивает с толку, подразумевая, что если не писать set, то будет возвращаться всегда 1.
Скажу Бабе Яге по секрету, что если свойство сделать статическим, то и поля то не будет. Оно автоматом в константу превратится в константу. И это замечательно! Что хотели то и получили.
Кроме того, если будут конструкторы, то значение будет задано.
А>>А может так лучше ( типа как поля ):
А>> public Get : int { get; } = 1;
От изменения синтаксиса сути не меняется. Но появляются проблемы с многострочными инициализаторами.
По уму оптимальным вариантом было бы просто отказаться от полей. Тогда можно было бы выразить это дело так:
public Get : int = 1;
M>Так намного лучше. Я бы даже сделал так:
M>
M>public Name : string = "атас" { get; set; }
M>
Это вообще конфликты будет вызывать. Мелка опечатки и фейерверк непонятных сообщений об ошибках.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Добавлю к словам Хардкейса, что Accessor еще неудобен при рефакторинге. Можно было бы рефекторинг переименования обучить наличию этой макры, но это хардкод.
Можно делать в общем виде. Но это уже в Н2.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, _NN_, Вы писали:
_NN>>Есть предложения по улучшению этого дела ?
Z>А можно озвучить причины ограничения только на автосвойства?
Буду рад выслушать как это сделать для обычных свойств.
У ручных свойств не обязано быть переменной вообще, скажем:
Здравствуйте, _NN_, Вы писали:
_NN>Буду рад выслушать как это сделать для обычных свойств.
Точно так же как и для любых других. Вызвать сеттер в конструкторе. Других способов сделать это я не вижу.
_NN>У ручных свойств не обязано быть переменной вообще, скажем: _NN>
_NN>public X : int { get { 1 } set { } }
_NN>
_NN>Что здесь будет означать default ?
Да ничего Что, без default можно мало бессмысленных конструкций написать?
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, _NN_, Вы писали:
_NN>>Буду рад выслушать как это сделать для обычных свойств.
Z>Точно так же как и для любых других. Вызвать сеттер в конструкторе. Других способов сделать это я не вижу.
Интересно, можно подумать над этим.
Кто еще поддерживает эту фичу ?
Добавление этого поведения усложнит код, готов помочь это реализовать ?
Здравствуйте, _NN_, Вы писали:
_NN>А вот слово "default" всех устраивает ? _NN>Может обозвать как-то покороче типа "init" ?
Мне лично default по душе. В дельфях он тоже default.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _NN_, Вы писали:
_NN>>А вот слово "default" всех устраивает ?
VD>default нормально. Ты бы лучше в мастер это дело смерджил.
Да я вот смотрю как замутить поддержку выражения без скобок.
Если не получится , то замерджу как есть
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, _NN_, Вы писали:
_NN>>Есть предложения по улучшению этого дела ?
H>Есть предложение заобсолетить макру Accessor в пользу использования инициализаторов.
А как же код компилятора ? Его кто переделывать будет ?
Здравствуйте, hardcase, Вы писали:
H>Конечно. Гадим в аутпут из макры: Message.Warning("Accessor macro is obsolete, please use auto-properties instead")
Не спорделаротивно
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.