Непопулярность readonly.
От: SomeOne_TT  
Дата: 13.03.19 23:20
Оценка:
В С++ использование const везде, где только можно, является хорошим тоном.

Почему в C# нет подобного отношения к readonly? Не наблюдаю россыпей readonly на полях
типа List/Dictionary, хотя там они естественны.
Re: Непопулярность readonly.
От: #John Европа https://github.com/ichensky
Дата: 14.03.19 08:06
Оценка:
Здравствуйте, SomeOne_TT, Вы писали:

SO_>В С++ использование const везде, где только можно, является хорошим тоном.


SO_>Почему в C# нет подобного отношения к readonly? Не наблюдаю россыпей readonly на полях

SO_>типа List/Dictionary, хотя там они естественны.

Лень писать readonly, особенно, когда пишешь код для себя/сам. Да и собственно зачем его лишний раз писать, если и так почти моментально/интуитивно понимаешь когда можно менять глобальную переменную, а когда нет. В c++, намного больше времени понадобилось бы, что бы проанализировать каждую переменную, можно ли ее менять или нет, потому и пишут везде где только можно const, что бы создать себе допольнительные ограничения — что бы меньше думать в будущем когда будет менятся код.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: readonly struct
От: Qbit86 Кипр
Дата: 14.03.19 08:19
Оценка: +2
Здравствуйте, SomeOne_TT, Вы писали:

SO_>Почему в C# нет подобного отношения к readonly?


По-моему, есть. Rider заставляет писать readonly, Microsoft.CodeQuality.Analyzers тоже.

SO_>Не наблюдаю россыпей readonly на полях


Я наблюдаю, и сам рассыпаю :)

Есть редкие патологические случаи в структурах, когда readonly может неявно приводить к снижению производительности из-за defensive copy, но с введением readonly struct в язык эта проблема не так актуальна.
Глаза у меня добрые, но рубашка — смирительная!
Re: Непопулярность readonly.
От: hi_octane Беларусь  
Дата: 14.03.19 11:24
Оценка: 171 (9) +2
SO_>Почему в C# нет подобного отношения к readonly?
Потому что в С++ const даёт дофига гарантий и при этом вообще не напрягает вызывающую сторону. В C# readonly — чаще всего способ усложнить себе жизнь, без всяких гарантий что будет надёжнее или быстрее работать. Видимо, когда начинали C# вообще не понимали что такое иммутабельность и как ею пользуются (сейчас похоже понимают, но вкорячивание нужных вещей идёт со скрипом):
1) Самое главное нет понятия readonly метод. Все эти [Pure] ни о чём, потому что компилятором не проверяются. Из-за этого целый класс оптимизаций превращается в очень аккуратное отслеживание "правильно ли используется тут структура", либо неожиданные тормоза на ровном месте из-за defensive-copy. Причём у компилятора даже нету варнинга "defensive copy here" который можно было бы поставить как error и быть уверенным что случайно чего-то не испортишь.

2) Из-за того-же всякие объекты посложнее типа readonly List<T> — вообще какая-то химера. Ссылка на список иммутабельна, сам список нет. IReadonlyList<T> не предлагать.

3) Нет возможности например вызывающему методу использовать структуру или класс как мутабельные, но передавать на обработку (допустим в многопоточный алгоритм) как readonly и чтобы дальше компилятор следил что у объекта вызываются только readonly методы (которых нет).

4) Нету val/let/readonly var и readonly аргументов — компилятор не следит и не даёт по рукам за вызов мутабельных методов. И это при том что компилятор сам мог бы выводить мутабельность/иммутабельность методов и студия могла бы сама расставлять эти readonly.

5) В C++ ради скорости или чего-то ещё можно наделать перегрузок которые отличаются только константностью аргументов. В C# только-только появилось понятие in-аргумента, и см.1 почему оно далеко не всегда хорошо.

6) Наконец пользоваться in и readonly в C# просто неудобно. Вот это вот:
readonly struct S { } //ну очень иммутабельная структура

static void M1(in S s) => Console.WriteLine("in s");
static void M1(S s) => Console.WriteLine("mutable s");
        
static readonly S x = default;

static void Main(string[] args)
{
  S d = default;

  M1(d);
  M1(x);
}

Прям вопрос для собеседования — какую же перегрузку выберет компилятор. Подсказка — будет выбирать самую говенную из возможных (полная противоположность C++). Никакого автовыбора оптимальной перегрузки, когда C++ отлично выбирает const &arg — не будет. Хочется передать как const& вызываем метод так: M1(in d); и никак иначе. Readonly структура или нет, большая или маленькая, программист не желающий индусить должен страдать.

Представь как много людей пользовалось бы const в C++ если бы нужно было писать const не только в самом методе, но ещё и перед каждым параметром при вызове этого метода. Примерно так: auto c = max(const &a, const &b) // больше констов богу констов

В итоге readonly структуры — не решение а затычка. Лучше чем вообще ничего, но хуже чем нормальное отслеживание иммутабельности на уровне компилятора как сделано с const в C++.

Некоторые проблемы находит ErrorProne.NET.Structs от Сергея Тепляков, но надо больше для того чтобы в C# readonly стал стилем хорошего программиста также как в C++ const.
Re: Непопулярность readonly.
От: Kolesiki  
Дата: 14.03.19 12:49
Оценка: -3
Здравствуйте, SomeOne_TT, Вы писали:

SO_>В С++ использование const везде, где только можно, является хорошим тоном.


SO_>Почему в C# нет подобного отношения к readonly? Не наблюдаю россыпей readonly на полях

SO_>типа List/Dictionary, хотя там они естественны.

Это так же глупо, как писать на бетоне "не копать!". Да никто и не собирался копать, зачем ещё и надпись?? Так же и с алгоритмами — если у меня список и я тупо добавляю в него элементы, зачем мне ещё и защита от убивания списка? И если быть до конца параноиками, а что если у меня спиок не имеет права удалять элементы? Мне что, помечать список ещё и AddOnly?

Кроме того, и сам компилятор вполне может справиться с задачей "кто тут у нас самый ридонли" — зачем мне ещё и код засирать?
Re: Непопулярность readonly.
От: Ночной Смотрящий Россия  
Дата: 15.03.19 20:21
Оценка: 1 (1)
Здравствуйте, SomeOne_TT, Вы писали:

SO_>Почему в C# нет подобного отношения к readonly? Не наблюдаю россыпей readonly на полях

SO_>типа List/Dictionary, хотя там они естественны.

Задай вопрос авторам кода, в котором ты не наблюдаешь.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: readonly struct
От: igor-booch Россия  
Дата: 18.03.19 20:09
Оценка:
Q>Есть редкие патологические случаи в структурах, когда readonly может неявно приводить к снижению производительности из-за defensive copy

Можете поподробней про это рассказать?или порекомендую, что почитать
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[3]: Defensive copy
От: Qbit86 Кипр
Дата: 18.03.19 20:55
Оценка: 12 (2)
Здравствуйте, igor-booch, Вы писали:

Q>>Есть редкие патологические случаи в структурах, когда readonly может неявно приводить к снижению производительности из-за defensive copy

IB>Можете поподробней про это рассказать?или порекомендую, что почитать

Jon Skeet: Micro-optimization: the surprising inefficiency of readonly fields
@SergeyT.: Avoiding struct and readonly reference performance pitfalls with ErrorProne.NET
Bill Wagner et al.: Write safe and efficient C# code
Глаза у меня добрые, но рубашка — смирительная!
Re: Непопулярность readonly.
От: Vladek Россия Github
Дата: 19.03.19 15:15
Оценка:
Здравствуйте, SomeOne_TT, Вы писали:

SO_>В С++ использование const везде, где только можно, является хорошим тоном.


SO_>Почему в C# нет подобного отношения к readonly? Не наблюдаю россыпей readonly на полях

SO_>типа List/Dictionary, хотя там они естественны.

Я не пишу, за меня его студия сама пишет, когда я необъявленное поле начинаю использовать. Давно есть расширения вроде Roslynator, которые такие мелкие задачи автоматизируют.
Re[2]: Непопулярность readonly.
От: hardcase Пират http://nemerle.org
Дата: 31.03.19 15:23
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Я не пишу, за меня его студия сама пишет, когда я необъявленное поле начинаю использовать. Давно есть расширения вроде Roslynator, которые такие мелкие задачи автоматизируют.


Я однажды машинально написал readonly рядом со SpinLock — вот это было весело
/* иЗвиНите зА неРовнЫй поЧерК */
Отредактировано 31.03.2019 15:23 hardcase . Предыдущая версия .
Re: Непопулярность readonly.
От: varenikAA  
Дата: 15.04.19 03:16
Оценка:
Здравствуйте, SomeOne_TT, Вы писали:

SO_>В С++ использование const везде, где только можно, является хорошим тоном.


SO_>Почему в C# нет подобного отношения к readonly? Не наблюдаю россыпей readonly на полях

SO_>типа List/Dictionary, хотя там они естественны.

Дело в том, что readonly в C# действует только на верхнем уровне,
для ссылочных типов таким образом можно лишь защитить ссылку на список, но не значения.
Можете прочитать об этом у Андрей Александреску в книге язык программирования Ди.
Там есть такая фраза, что если ваш модификатор не защищает объект на всю глубину от изменений,
то он имеет силу комментария. К сожалению, архитектурно, C# не защищает поля любой вложенности от изменения.
Думаю, поэтому никто и не пользуется, т.к. защита очень слабая, хотя я стараюсь все же помечать этим модификатором,
т.к. это упрощает понимание кода.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Популярность readonly
От: Qbit86 Кипр
Дата: 15.04.19 07:11
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Думаю, поэтому никто и не пользуется


В смысле, никто не пользуется? Все пользуются. В этом легко убедиться на ГитХабе, полистав код широко используемых проектов.
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Популярность readonly
От: varenikAA  
Дата: 15.04.19 14:40
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, varenikAA, Вы писали:


AA>>Думаю, поэтому никто и не пользуется


Q>В смысле, никто не пользуется? Все пользуются. В этом легко убедиться на ГитХабе, полистав код широко используемых проектов.


Согласен, написал в контексте вопроса, смысл ограничения приходит с опытом.
Вообще, в C# 7 имеет 3 основных ограничения:
private readonly
(private) const
T P {get;}

Однако, как я уже заметил, эти модификаторы имеют смысл для простых типов и ссылок, даже поля структур если их тоже не пометить
будут изменяемыми, что конечно не хорошо, т.к. если требуется полную неизменяемость придется пометить все поля, но встроенные типы так не защищить(в отличии от D в котором
подобные модификаторы делаю весь граф по ссылке иммутабельным).
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Непопулярность readonly.
От: IID Россия  
Дата: 18.04.19 09:53
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Это так же глупо, как писать на бетоне "не копать!". Да никто и не собирался копать, зачем ещё и надпись??


Только не на бетоне, а на песке. Под которым куча говна.

И это ты сейчас не собирался, а потом сверху насыпешь резиновой крошки, забудешь про песок, и закажешь свой участок, вместе с земляным, строителям. Которые будут ставить забор.
kalsarikännit
Re[2]: Непопулярность readonly.
От: barn_czn  
Дата: 21.04.19 18:58
Оценка:
K>Кроме того, и сам компилятор вполне может справиться с задачей "кто тут у нас самый ридонли" — зачем мне ещё и код засирать?

мдаа.. наивный паренек )
Re: Непопулярность readonly.
От: barn_czn  
Дата: 21.04.19 19:01
Оценка:
Здравствуйте, SomeOne_TT, Вы писали:

SO_>В С++ использование const везде, где только можно, является хорошим тоном.


SO_>Почему в C# нет подобного отношения к readonly? Не наблюдаю россыпей readonly на полях

SO_>типа List/Dictionary, хотя там они естественны.

Очень даже пользуются. На код ревью пинаю если пропускают. Быдлокодерам ясно дело по барабану все это.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.