powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DateTime
25 сообщений из 68, страница 2 из 3
DateTime
    #38686318
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PallarisБлин о чем тема - что структура это не ссылочный тип, или что структура не может отнаследоваться от структуры? Или что?

Тема о том, зачем изменяемые структуры делать неизменяемыми.
Например, зачем делать неизменяемым класс - понятно.
...
Рейтинг: 0 / 0
DateTime
    #38686319
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007,
это говорит, что структуры передаются по значению
как объявлен лист
Код: c#
1.
  public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable


как реализован индексатор IList<T>
Код: c#
1.
2.
3.
4.
5.
6.
  public T this[int index]
    {
   
       get{ return this._items[index];}
  
    }


вот и выплюнул нам он значение, на наш запрос..
...
Рейтинг: 0 / 0
DateTime
    #38686323
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи, я знаю, что они передаются по значению, по этому и не понял, зачем
random.Next() = 3
делать

я спросил, как это к теме топика относится?

В c# есть структуры изменяемые.
Можно (некоторые уже) сделать структуру неизменяемой (int, decimal, DateTime).

Есть классы изменяемые, можно сделать класс неизменяемым (string), неизменяемый класс понятно зачем.

Зачем структуру делать неизменяемой?
...
Рейтинг: 0 / 0
DateTime
    #38686328
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,
кстати, индексатор IList<T> вполне возвращает структуры изменяемого типа, другое дело, что их изменить нельзя.

вопрос не про неизменяемые экземпляры, а про неизменяемые типы
...
Рейтинг: 0 / 0
DateTime
    #38686329
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
DateTime
    #38686335
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи, совсем не о том вопрос
вопрос не про структурные поля 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;
...
Рейтинг: 0 / 0
DateTime
    #38686339
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или по проще пример, почему бы не сделать типа:

var d = new DateTime(2004, 12, 1);
d.AddYear(1);

нет, DateTime неизменяемый тип
...
Рейтинг: 0 / 0
DateTime
    #38686365
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007Или по проще пример, почему бы не сделать типа:

var d = new DateTime(2004, 12, 1);
d.AddYear(1);

нет, DateTime неизменяемый тип

изменяемый DateTime = много лишних и ненужных проблем, связанных в том числе с многопоточностью.
для неизменяемых типов компилятор может генерировать более оптимальный код.
...
Рейтинг: 0 / 0
DateTime
    #38686368
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007,

есть такая замечательная штука под названием "гугл". Поиск по "C# why structs immutable", по самой первой ссылке выдачи - ответ Липперта: http://stackoverflow.com/questions/3751911/why-are-c-sharp-structs-immutable/3753640#3753640
...
Рейтинг: 0 / 0
DateTime
    #38686373
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНу это маразм. Обычный маразм. Так же они, например, сделали структурой Guid. Поэтому вы не можете, например, обнулить его. Вместо этого вам предлагается использовать default(Guid), который есть 000...000. Бред несусветный. Ну да ладно, таких перлов в .Net полно, не обращайте внимания.

Код: c#
1.
2.
3.
// обнуление GUID для чайников

guid = new Guid();
...
Рейтинг: 0 / 0
DateTime
    #38686600
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кjohn2007И кто такой свеном? ))Это страшный человек. Лучше вообще не знать, что такие люди на земле есть.
Я уже нескольких подобных пережил тут.
Помнится, Ресерч Студия навел шухера в нашем садоводстве......
:-)
...
Рейтинг: 0 / 0
DateTime
    #38686606
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
struct a {
public int x;
}

a - структура изменяемого типа


struct b {

private int x;

public int X {get {return x; } }

public b(int _x) {
x = _x;
}

}



b - структура неизменяемого типа

Для b более оптимальный код сгенерируется?
...
Рейтинг: 0 / 0
DateTime
    #38686627
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007,
вот у меня есть тип наружу торчит свойство только чтение, ( ДатеTime, Guid)
когда объект этого типа будет таскаться по коду, я хочу быть уверенным, что та ничего не изменилось.
...
Рейтинг: 0 / 0
DateTime
    #38686700
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007А какие проблемы у изменяемых структур с многопоточностью?

с тем, что один поток изменяет состояние структуры в то время, как другой поток считывает структуру, вы же помните, что структура передаётся по значению?

что по-вашему здесь должно произойти:

экземпляр нашей структуры:

DateTime dt;

поток 1 делает

Код: c#
1.
CallSomeFunction(dt);



в это же самое время поток 2 делает

Код: c#
1.
dt.Day += 1;
...
Рейтинг: 0 / 0
DateTime
    #38686718
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны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.
var a = 5;
var b = 0;

b = a;

a = 3;

b == 3 ?



я забыл, что при b = a; в b создается копия a, поэтому рассчитывал, что b будет синхронно меняться с a
что-то тут не то!
...
Рейтинг: 0 / 0
DateTime
    #38686729
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttс тем, что один поток изменяет состояние структуры в то время, как другой поток считывает структуру, вы же помните, что структура передаётся по значению?


Я совсем не понял примера.
Какая проблема возникает, аналогичная моему посту выше, ту, что Eric Lippert описал?
...
Рейтинг: 0 / 0
DateTime
    #38686734
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то я одну причину придумал, зачем структуры делать неизменяемыми.

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

Но зачем маленькие структуры типа DateTime делать неизменяемыми? не понятно
...
Рейтинг: 0 / 0
DateTime
    #38686746
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007,
вообще то в поток стараются затолкнуть структуру по значению, что бы она там сдохла без кучи.
DateTime описывает дату.
В вашем типе вполне возможно - это дата вашего рождения, бракосочетания ( уж не буду финал трогать)
И было бы не комфильно, таскаясь по жизни, если какой то м...к ее вот так просто возьмет и изменит.
Хотя это делается композицией
...
Рейтинг: 0 / 0
DateTime
    #38686757
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,
Так а как он ее изменить, если она по значению и передается, или я не правильно понял что-то?

А про твой пример readonly выше, мне нужно осмыслить сие.
...
Рейтинг: 0 / 0
DateTime
    #38686760
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007Но зачем маленькие структуры типа DateTime делать неизменяемыми? не понятно

ок, давайте подойдём с другой стороны.

вы знаете как устроена структура DateTime? хранятся ли там число, месяц, год, часы, минуты, секунды отдельно? или там хранится большое число в виде миллисекунд от начала эпохи, а свойства типа Year возвращают извлечённый результат? не знаете. потому что вас это не должно волновать. точна также разрабочиков не должно волновать то, что вы хотите менять параметры у времени. для этого вы создаёте новую структуру, если хотите что-то изменить, эта операция очень быстрая.

а теперь скажите пожалуйста, зачем вам потребовалось изменяемый DateTime? можете привести свою задачу, где это действительно нужно. а я в свою очередь постараюсь убедить вас, что это вам не нужно
...
Рейтинг: 0 / 0
DateTime
    #38686794
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007Но зачем маленькие структуры типа DateTime делать неизменяемыми? не понятно

А где критерий ее "маленькости" или "великости" - это субьективно.

По смыслу - у даты есть только одно значение. Временная точка.
В этом отношении дата ничем не отличается от целого числа.

А функционал привязанный к структуре - для удобства отображения и простых операций,
которые не могут быть сделаны простой арифметикой.
...
Рейтинг: 0 / 0
DateTime
    #38686856
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Алексей Кпропущено...
Это страшный человек. Лучше вообще не знать, что такие люди на земле есть.
Я уже нескольких подобных пережил тут.
Помнится, Ресерч Студия навел шухера в нашем садоводстве......
:-)
а где он сейчас? Стебелек не он пишет?
...
Рейтинг: 0 / 0
DateTime
    #38686884
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt, я не обязательно хочу менять параметры напрямую, ведь в изменяемом варианте может быть специальный регламентированный метод по типу AddYear или вообще Set(y,m,d)

Создавать новую структуру при изменении все таки стоит времени, да и реализации тоже порой. Да и вообще в реальном коде это даже глупова-то будет выглядеть.

Например у меня есть какой-то объект типа List, содержащий N элементов, кто-то хочет добавить элемент Add(Item) а я давай реализацию - new List, скопировал в него N элементов, добавил в него Item и вернул его как новый объект. Клева? ))

Да, когда речь идет о классах (объектах), то о вреде изменяемых типов прежде всего говорят о потокобезопасности и вообще безопасности информации в потоках, т.е. 2 потока одновременно меняют один объект или один поток хакает другой, с задержкой меняя что-то в передаваемой объекте.

Но структуры типа int, decimal, DateTime передаются как правило по значению (можно обеспечить прием по значению), по этому мультипоточных проблем у них не возникает.

О всех остальных плюсах неизменяемости говорят как-то очень туманно, что сводится примерно к good practice
Вот я и думаю, то что выделил жирным это разве good practice ? ))
...
Рейтинг: 0 / 0
DateTime
    #38686897
john2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129, я имел ввиду, что одно дело передать по значению десяток байт, другое дело сотни байт или килобайт, для скорости лучше передавать по ссылке.
Думаю, именно в связи с этим строки сделаны классом, а не структурой, чтобы быстро передавать и не ставить каждый раз ref
...
Рейтинг: 0 / 0
DateTime
    #38686967
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
john2007 Например у меня есть какой-то объект типа List, содержащий N элементов, кто-то хочет добавить элемент Add(Item) а я давай реализацию - new List, скопировал в него N элементов, добавил в него Item и вернул его как новый объект. Клева? ))

см. ниже.

john2007Создавать новую структуру при изменении все таки стоит времени, да и реализации тоже порой. Да и вообще в реальном коде это даже глупова-то будет выглядеть.

нет, это очень-очень быстро. вряд ли прямое изменение свойств DateTime было бы быстрей. а на счёт глупо не глупо, я не вижу в чём глупо, это всего лишь синтаксис.

john2007Но структуры типа int, decimal, DateTime передаются как правило по значению (можно обеспечить прием по значению), по этому мультипоточных проблем у них не возникает.

вот именно, что по значению. структура хранит несколько полей. один поток копирует всё значение в то время, как другой поток меняет часть всего значения. т.е. проблемная ситуация. а проблебные ситуации лучше устранять.

john2007Вот я и думаю, то что выделил жирным это разве good practice ? ))

где-то иначе и быть не может. но сравнение не очень адекватное. List это класс, а про экземпляры классов (доступные по ссылке) мы сейчас вообще не говорим.
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DateTime
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]