|
DateTime
|
|||
---|---|---|---|
#18+
PallarisБлин о чем тема - что структура это не ссылочный тип, или что структура не может отнаследоваться от структуры? Или что? Тема о том, зачем изменяемые структуры делать неизменяемыми. Например, зачем делать неизменяемым класс - понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 01:02 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007, это говорит, что структуры передаются по значению как объявлен лист Код: c# 1.
как реализован индексатор IList<T> Код: c# 1. 2. 3. 4. 5. 6.
вот и выплюнул нам он значение, на наш запрос.. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 01:06 |
|
DateTime
|
|||
---|---|---|---|
#18+
Где-то в степи, я знаю, что они передаются по значению, по этому и не понял, зачем random.Next() = 3 делать я спросил, как это к теме топика относится? В c# есть структуры изменяемые. Можно (некоторые уже) сделать структуру неизменяемой (int, decimal, DateTime). Есть классы изменяемые, можно сделать класс неизменяемым (string), неизменяемый класс понятно зачем. Зачем структуру делать неизменяемой? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 01:13 |
|
DateTime
|
|||
---|---|---|---|
#18+
Где-то в степи, кстати, индексатор IList<T> вполне возвращает структуры изменяемого типа, другое дело, что их изменить нельзя. вопрос не про неизменяемые экземпляры, а про неизменяемые типы ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 01:23 |
|
DateTime
|
|||
---|---|---|---|
#18+
Где-то в степи, совсем не о том вопрос вопрос не про структурные поля readonly и не про то, что при a = b (обе структуры) создастся копия структуры b и a станет копией структуры b Я извиняюсь, если вопрос не понятно задаю. вот смотрите: struct a { public int x; } a - структура изменяемого типа struct b { private int x; public int X {get {return x; } } public b(int _x) { x = _x; } } b - структура неизменяемого типа Зачем нужны структуры неизменяемого типа? В частности, почему int32, decimal, DateTime сделаны неизменяемыми? Почему бы не сделать, например var i = 0; i.Value = 7; ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 01:42 |
|
DateTime
|
|||
---|---|---|---|
#18+
Или по проще пример, почему бы не сделать типа: var d = new DateTime(2004, 12, 1); d.AddYear(1); нет, DateTime неизменяемый тип ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 01:59 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007Или по проще пример, почему бы не сделать типа: var d = new DateTime(2004, 12, 1); d.AddYear(1); нет, DateTime неизменяемый тип изменяемый DateTime = много лишних и ненужных проблем, связанных в том числе с многопоточностью. для неизменяемых типов компилятор может генерировать более оптимальный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 06:00 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007, есть такая замечательная штука под названием "гугл". Поиск по "C# why structs immutable", по самой первой ссылке выдачи - ответ Липперта: http://stackoverflow.com/questions/3751911/why-are-c-sharp-structs-immutable/3753640#3753640 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 06:17 |
|
DateTime
|
|||
---|---|---|---|
#18+
cdtyjvНу это маразм. Обычный маразм. Так же они, например, сделали структурой Guid. Поэтому вы не можете, например, обнулить его. Вместо этого вам предлагается использовать default(Guid), который есть 000...000. Бред несусветный. Ну да ладно, таких перлов в .Net полно, не обращайте внимания. Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 07:12 |
|
DateTime
|
|||
---|---|---|---|
#18+
Алексей Кjohn2007И кто такой свеном? ))Это страшный человек. Лучше вообще не знать, что такие люди на земле есть. Я уже нескольких подобных пережил тут. Помнится, Ресерч Студия навел шухера в нашем садоводстве...... :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 11:31 |
|
DateTime
|
|||
---|---|---|---|
#18+
hVosttjohn2007Или по проще пример, почему бы не сделать типа: var d = new DateTime(2004, 12, 1); d.AddYear(1); нет, DateTime неизменяемый тип изменяемый DateTime = много лишних и ненужных проблем, связанных в том числе с многопоточностью. для неизменяемых типов компилятор может генерировать более оптимальный код. А какие проблемы у изменяемых структур с многопоточностью? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
b - структура неизменяемого типа Для b более оптимальный код сгенерируется? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 11:37 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007, вот у меня есть тип наружу торчит свойство только чтение, ( ДатеTime, Guid) когда объект этого типа будет таскаться по коду, я хочу быть уверенным, что та ничего не изменилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 11:47 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007А какие проблемы у изменяемых структур с многопоточностью? с тем, что один поток изменяет состояние структуры в то время, как другой поток считывает структуру, вы же помните, что структура передаётся по значению? что по-вашему здесь должно произойти: экземпляр нашей структуры: DateTime dt; поток 1 делает Код: c# 1.
в это же самое время поток 2 делает Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 12:27 |
|
DateTime
|
|||
---|---|---|---|
#18+
Сон Веры Павловныjohn2007, есть такая замечательная штука под названием "гугл". Поиск по "C# why structs immutable", по самой первой ссылке выдачи - ответ Липперта: http://stackoverflow.com/questions/3751911/why-are-c-sharp-structs-immutable/3753640#3753640 Ну, я почитал, конечно, только особо ничего существенного не нашел, вот и пришел за помощью - разобраться. В частности по приведенной ссылке для структур одна причина приведена, и то, какая-то сомнительная на мой взгляд, типа я забыл, что структуры передаются по значению, поэтому моя попытка изменения исходной структуры не получилась с таким же успехом можно сказать, что Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
я забыл, что при b = a; в b создается копия a, поэтому рассчитывал, что b будет синхронно меняться с a что-то тут не то! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 12:38 |
|
DateTime
|
|||
---|---|---|---|
#18+
hVosttс тем, что один поток изменяет состояние структуры в то время, как другой поток считывает структуру, вы же помните, что структура передаётся по значению? Я совсем не понял примера. Какая проблема возникает, аналогичная моему посту выше, ту, что Eric Lippert описал? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 12:46 |
|
DateTime
|
|||
---|---|---|---|
#18+
Вообще-то я одну причину придумал, зачем структуры делать неизменяемыми. Например, у нас есть огроменная структура, которую мы решили ради ускорения передать по ссылке в другой поток, и в целях защиты принимающий поток хочет чтобы структура была неизменяемая. Но зачем маленькие структуры типа DateTime делать неизменяемыми? не понятно ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 12:51 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007, вообще то в поток стараются затолкнуть структуру по значению, что бы она там сдохла без кучи. DateTime описывает дату. В вашем типе вполне возможно - это дата вашего рождения, бракосочетания ( уж не буду финал трогать) И было бы не комфильно, таскаясь по жизни, если какой то м...к ее вот так просто возьмет и изменит. Хотя это делается композицией ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 13:01 |
|
DateTime
|
|||
---|---|---|---|
#18+
Где-то в степи, Так а как он ее изменить, если она по значению и передается, или я не правильно понял что-то? А про твой пример readonly выше, мне нужно осмыслить сие. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 13:09 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007Но зачем маленькие структуры типа DateTime делать неизменяемыми? не понятно ок, давайте подойдём с другой стороны. вы знаете как устроена структура DateTime? хранятся ли там число, месяц, год, часы, минуты, секунды отдельно? или там хранится большое число в виде миллисекунд от начала эпохи, а свойства типа Year возвращают извлечённый результат? не знаете. потому что вас это не должно волновать. точна также разрабочиков не должно волновать то, что вы хотите менять параметры у времени. для этого вы создаёте новую структуру, если хотите что-то изменить, эта операция очень быстрая. а теперь скажите пожалуйста, зачем вам потребовалось изменяемый DateTime? можете привести свою задачу, где это действительно нужно. а я в свою очередь постараюсь убедить вас, что это вам не нужно ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 13:12 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007Но зачем маленькие структуры типа DateTime делать неизменяемыми? не понятно А где критерий ее "маленькости" или "великости" - это субьективно. По смыслу - у даты есть только одно значение. Временная точка. В этом отношении дата ничем не отличается от целого числа. А функционал привязанный к структуре - для удобства отображения и простых операций, которые не могут быть сделаны простой арифметикой. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 13:43 |
|
DateTime
|
|||
---|---|---|---|
#18+
D129Алексей Кпропущено... Это страшный человек. Лучше вообще не знать, что такие люди на земле есть. Я уже нескольких подобных пережил тут. Помнится, Ресерч Студия навел шухера в нашем садоводстве...... :-) а где он сейчас? Стебелек не он пишет? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 14:35 |
|
DateTime
|
|||
---|---|---|---|
#18+
hVostt, я не обязательно хочу менять параметры напрямую, ведь в изменяемом варианте может быть специальный регламентированный метод по типу AddYear или вообще Set(y,m,d) Создавать новую структуру при изменении все таки стоит времени, да и реализации тоже порой. Да и вообще в реальном коде это даже глупова-то будет выглядеть. Например у меня есть какой-то объект типа List, содержащий N элементов, кто-то хочет добавить элемент Add(Item) а я давай реализацию - new List, скопировал в него N элементов, добавил в него Item и вернул его как новый объект. Клева? )) Да, когда речь идет о классах (объектах), то о вреде изменяемых типов прежде всего говорят о потокобезопасности и вообще безопасности информации в потоках, т.е. 2 потока одновременно меняют один объект или один поток хакает другой, с задержкой меняя что-то в передаваемой объекте. Но структуры типа int, decimal, DateTime передаются как правило по значению (можно обеспечить прием по значению), по этому мультипоточных проблем у них не возникает. О всех остальных плюсах неизменяемости говорят как-то очень туманно, что сводится примерно к good practice Вот я и думаю, то что выделил жирным это разве good practice ? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 14:56 |
|
DateTime
|
|||
---|---|---|---|
#18+
D129, я имел ввиду, что одно дело передать по значению десяток байт, другое дело сотни байт или килобайт, для скорости лучше передавать по ссылке. Думаю, именно в связи с этим строки сделаны классом, а не структурой, чтобы быстро передавать и не ставить каждый раз ref ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 15:04 |
|
DateTime
|
|||
---|---|---|---|
#18+
john2007 Например у меня есть какой-то объект типа List, содержащий N элементов, кто-то хочет добавить элемент Add(Item) а я давай реализацию - new List, скопировал в него N элементов, добавил в него Item и вернул его как новый объект. Клева? )) см. ниже. john2007Создавать новую структуру при изменении все таки стоит времени, да и реализации тоже порой. Да и вообще в реальном коде это даже глупова-то будет выглядеть. нет, это очень-очень быстро. вряд ли прямое изменение свойств DateTime было бы быстрей. а на счёт глупо не глупо, я не вижу в чём глупо, это всего лишь синтаксис. john2007Но структуры типа int, decimal, DateTime передаются как правило по значению (можно обеспечить прием по значению), по этому мультипоточных проблем у них не возникает. вот именно, что по значению. структура хранит несколько полей. один поток копирует всё значение в то время, как другой поток меняет часть всего значения. т.е. проблемная ситуация. а проблебные ситуации лучше устранять. john2007Вот я и думаю, то что выделил жирным это разве good practice ? )) где-то иначе и быть не может. но сравнение не очень адекватное. List это класс, а про экземпляры классов (доступные по ссылке) мы сейчас вообще не говорим. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2014, 15:41 |
|
|
start [/forum/topic.php?fid=20&msg=38686760&tid=1402726]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 327ms |
total: | 459ms |
0 / 0 |