Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 02:27
Оценка: -7 :)))
На днях осознал, что инициализация при создании объекта
var person = new Person
{
    Name = "Alice",
    Age = 12
};

ничем не лучше старого способа:
var person = new Person();
    person.Name = "Alice";
    person.Age = 12;

код даже короче.
Может пора провести ревизию и выкинуть ненужное из шарпов?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Кому нужны такие фичи?
От: Евгений Акиньшин grapholite.com
Дата: 04.05.22 03:08
Оценка:
Здравствуйте, vaa, Вы писали:


vaa>код даже короче.

vaa>Может пора провести ревизию и выкинуть ненужное из шарпов?

а такое на старом шарпе написать:

Person SomeMethod() => new() { Name = "Alice", Age = 12 };
Не шалю, никого не трогаю, починяю примус Diagrams Designer for iPad and Windows 10
Re[2]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 03:47
Оценка:
Здравствуйте, Евгений Акиньшин, Вы писали:

ЕА>а такое на старом шарпе написать:


ЕА>
ЕА>Person SomeMethod() => new() { Name = "Alice", Age = 12 };
ЕА>

не лучший вариант, на мой взгляд.
Я бы упростил:
 SomeMethod() : Person = { Name = "Alice", Age = 12 };
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Кому нужны такие фичи?
От: Евгений Акиньшин grapholite.com
Дата: 04.05.22 03:55
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, Евгений Акиньшин, Вы писали:


ЕА>>а такое на старом шарпе написать:


ЕА>>
ЕА>>Person SomeMethod() => new() { Name = "Alice", Age = 12 };
ЕА>>

vaa>не лучший вариант, на мой взгляд.

Ну да, но пришлось же обратную совместимость сохранять.
Вопрос же про сравнение со старым шарпом,а не с typescript.
Не шалю, никого не трогаю, починяю примус Diagrams Designer for iPad and Windows 10
Re: Кому нужны такие фичи?
От: sambl74 Россия  
Дата: 04.05.22 04:05
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>ничем не лучше старого способа:


Чёй-то не лучше то? person лишних 2 раза писать в этом примере. Ну фигурные скобки вместо круглых, подумаешь.

vaa>код даже короче.


Где короче-то?
Re[2]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 04:28
Оценка: -2 :))
Здравствуйте, sambl74, Вы писали:

S>Где короче-то?


LOC
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 04:31
Оценка:
Здравствуйте, Евгений Акиньшин, Вы писали:

ЕА>Здравствуйте, vaa, Вы писали:


vaa>>Здравствуйте, Евгений Акиньшин, Вы писали:


ЕА>>>а такое на старом шарпе написать:


ЕА>>>
ЕА>>>Person SomeMethod() => new() { Name = "Alice", Age = 12 };
ЕА>>>

vaa>>не лучший вариант, на мой взгляд.

ЕА>Ну да, но пришлось же обратную совместимость сохранять.

ЕА>Вопрос же про сравнение со старым шарпом,а не с typescript.
согласен.
Person SomeMethod() { var person = new Person(); person.Name = "Alice"; person.Age = 12; return person; }
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Кому нужны такие фичи?
От: jahr  
Дата: 04.05.22 05:54
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>На днях осознал, что инициализация при создании объекта

vaa>
vaa>var person = new Person
vaa>{
vaa>    Name = "Alice",
vaa>    Age = 12
vaa>};
vaa>

vaa>ничем не лучше старого способа:
vaa>
vaa>var person = new Person();
vaa>    person.Name = "Alice";
vaa>    person.Age = 12;
vaa>

vaa>код даже короче.
vaa>Может пора провести ревизию и выкинуть ненужное из шарпов?

Во втором случае можем получить частично инициализированный объект Person (например, из-за исключения во втором присваивании), в первом — нет: либо полностью инициализированный объект, либо никакого.
Re: Кому нужны такие фичи?
От: Ночной Смотрящий Россия  
Дата: 04.05.22 06:00
Оценка: 1 (1) +2
Здравствуйте, vaa, Вы писали:

vaa>На днях осознал, что инициализация при создании объекта

vaa>
vaa>var person = new Person
vaa>{
vaa>    Name = "Alice",
vaa>    Age = 12
vaa>};
vaa>

vaa>ничем не лучше старого способа:
vaa>
vaa>var person = new Person();
vaa>    person.Name = "Alice";
vaa>    person.Age = 12;
vaa>

vaa>код даже короче.

Первый вариант это statement, второй — expression, со всеми вытекающими типа возможности использования в expression tree или для инициализации анонимных типов.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 06:07
Оценка:
Здравствуйте, jahr, Вы писали:

J>Во втором случае можем получить частично инициализированный объект Person (например, из-за исключения во втором присваивании), в первом — нет: либо полностью инициализированный объект, либо никакого.

Тогда уж лучше явно указать, что персон не всегда создается:
var person = new Person(name: "Alice", age: 12);
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Кому нужны такие фичи?
От: elmal  
Дата: 04.05.22 06:16
Оценка: +2
Здравствуйте, vaa, Вы писали:

vaa>Может пора провести ревизию и выкинуть ненужное из шарпов?

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

В первом случае Person может быть иммутабельным, во втором случае он мутабелен. А если делать иммутабельно, то будут костыли с билдерами что не очень красиво, читаемо, громоздко да еще и медленнее.
Re: Кому нужны такие фичи?
От: kov_serg Россия  
Дата: 04.05.22 06:21
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>На днях осознал, что инициализация при создании объекта

vaa>ничем не лучше старого способа:
vaa>код даже короче.

fn( new Person(Name="Alice",Age=12) );
Re[2]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 06:36
Оценка: +1
Здравствуйте, elmal, Вы писали:

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


vaa>>Может пора провести ревизию и выкинуть ненужное из шарпов?

E>В первом случае ты гарантированно не забудешь поставить нужный параметр при создании объекта, ты должен не забыть все элементы конструктора
E>чтобы объект был проинициализирован, иначе все свалится при компиляции и даже до нее ошибка появится в IDE. Во втором случае забудешь и будет там какой нидь null или вообще левое значение по умолчанию.
в первом случае необязательно задавать значения всех полей. и вроде никогда такого не было. Это реализовано в record причем через конструктор.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 06:37
Оценка:
Здравствуйте, kov_serg, Вы писали:

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


vaa>>На днях осознал, что инициализация при создании объекта

vaa>>ничем не лучше старого способа:
vaa>>код даже короче.

_>
_>fn( new Person(Name="Alice",Age=12) );
_>


это на какой версии? именованные параметры вроде через двоеточие инициализируются.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Кому нужны такие фичи?
От: vsb Казахстан  
Дата: 04.05.22 06:55
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>На днях осознал, что инициализация при создании объекта

vaa>
vaa>var person = new Person
vaa>{
vaa>    Name = "Alice",
vaa>    Age = 12
vaa>};
vaa>

vaa>ничем не лучше старого способа:
vaa>
vaa>var person = new Person();
vaa>    person.Name = "Alice";
vaa>    person.Age = 12;
vaa>

vaa>код даже короче.
vaa>Может пора провести ревизию и выкинуть ненужное из шарпов?

Ну как минимум лучше тем, что не нарушается принцип DRY. Грубо говоря — ты не сможешь опечататься в коде вида

var person3 = new Person();
person3.Name = "Alice";
person2.Age = 12;
Re: Кому нужны такие фичи?
От: fmiracle  
Дата: 04.05.22 07:27
Оценка: +2
Здравствуйте, vaa, Вы писали:

vaa>На днях осознал, что инициализация при создании объекта

vaa>ничем не лучше старого способа:
vaa>код даже короче.
vaa>Может пора провести ревизию и выкинуть ненужное из шарпов?

Вопрос же не в короткости кода, а в том что это выражение. Можно например
var res = CallMethod( new Person{ Name = "Test" } );


а появились они, емнип, при внедрении linq, что позволило создавать выражения типа:
var q = from p in data.Persons
        where p.Age > 65
        select new PersonDto
        {
          Name = p.Name,
          Age = p.Age
        };

и как ты это будешь делать "старым" способом?
Re[2]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 07:30
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Ну как минимум лучше тем, что не нарушается принцип DRY. Грубо говоря — ты не сможешь опечататься в коде вида

Ну, если именовать так, то не мудрено.
vsb>
vsb>var person3 = new Person();
vsb>person3.Name = "Alice";
vsb>person2.Age = 12;
vsb>

С другой стороны, инициализатор невозможно отлаживать.
Т.е. в данном случае дублирование неизбежное зло.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 07:37
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>а появились они, емнип, при внедрении linq, что позволило создавать выражения типа:

F>
F>var q = from p in data.Persons
F>        where p.Age > 65
F>        select new PersonDto
F>        {
F>          Name = p.Name,
F>          Age = p.Age
F>        };
F>

F>и как ты это будешь делать "старым" способом?
так все еще работает:
var q = from x in persons
        where x.Age == 12
        select new Person(x.Name, x.Age);
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Кому нужны такие фичи?
От: fmiracle  
Дата: 04.05.22 07:40
Оценка:
Здравствуйте, vaa, Вы писали:


F>>и как ты это будешь делать "старым" способом?

vaa>так все еще работает:
vaa>
vaa>var q = from x in persons
vaa>        where x.Age == 12
vaa>        select new Person(x.Name, x.Age);
vaa>


1. это если есть такой конструктор, что для dto особо не нужно и просто лишний код.
2. А так если:
var q = from x in persons
        where x.Age >= 12
        select new 
        {
          Name = x.Name,
          Age = x.Age
        }

?
Re[4]: Кому нужны такие фичи?
От: vaa  
Дата: 04.05.22 07:45
Оценка:
Здравствуйте, fmiracle, Вы писали:


F>1. это если есть такой конструктор, что для dto особо не нужно и просто лишний код.

F>2. А так если:
F>
F>var q = from x in persons
F>        where x.Age >= 12
F>        select new 
F>        {
F>          Name = x.Name,
F>          Age = x.Age
F>        }
F>

F>?

Анонимные — зачет!
Но их из метода не вернуть же.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.