Здравствуйте, Shmj, Вы писали:
S>В С++ new имеет смысл, т.к. без него выделяется память на объект в стеке, а new создает в куче и возвращает указатель.
S>В C# этот new никакой смысловой нагрузки не несет. Так зачем же он?
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Shmj, Вы писали:
S>>В C# этот new никакой смысловой нагрузки не несет. Так зачем же он?
IT>И конструктор уровнять в правах с обычным методом.
функцией, и void заменить на Option<T>(Some(T)|None) https://github.com/readme/featured/functional-programming
Можно прямо сейчас, только добавить статик класс с методами-конструкторами
using static Some.Constructors;
var person = Person();
Здравствуйте, Shmj, Вы писали:
S>В С++ new имеет смысл, т.к. без него выделяется память на объект в стеке, а new создает в куче и возвращает указатель.
S>В C# этот new никакой смысловой нагрузки не несет. Так зачем же он?
Кхм, в Nemerle нет и конструктор просто называется this.
Здравствуйте, Shmj, Вы писали:
S>В С++ new имеет смысл, т.к. без него выделяется память на объект в стеке, а new создает в куче и возвращает указатель. S>В C# этот new никакой смысловой нагрузки не несет. Так зачем же он?
Ну так со всеми DI контейнерами его и так уже не сыщешь.
Здравствуйте, Разраб, Вы писали:
IT>>И конструктор уровнять в правах с обычным методом. Р>функцией, и void заменить на Option<T>(Some(T)|None) Р>https://github.com/readme/featured/functional-programming Р>Можно прямо сейчас, только добавить статик класс с методами-конструкторами
Это типа как выкривлять кривизну зеркалом с обратной кривизной?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>В текущей грамматике он конфликты разрешает. А если более обще, то сделали чтобы по сравнению с С++ не сильно резало глаз.
Но C++ -ников вводит в заблуждение, т.к. возвращает ссылку а не указатель.
НС>>В текущей грамматике он конфликты разрешает. А если более обще, то сделали чтобы по сравнению с С++ не сильно резало глаз.
S>Но C++ -ников вводит в заблуждение, т.к. возвращает ссылку а не указатель.
S>В C# этот new никакой смысловой нагрузки не несет. Так зачем же он?
Ну как бы привычно что new это то что выделяет память в куче и возвращают ссылку (или указатель в С++) на это место в памяти. Я к этому привык в C++ и поэтому new в C# мне показалось логичным.
А вот new для структур в C# мне всегда казалось какой-то странной конструкцией. Ссылку не возвращает. Объект в куче не создает.
Да еще и без new можно создавать структуры и использовать. Могли бы для структур в C# использовать с++ный синтаксис вызова конструктора.
Здравствуйте, CRT, Вы писали:
CRT>А вот new для структур в C# мне всегда казалось какой-то странной конструкцией. Ссылку не возвращает. Объект в куче не создает. CRT>Да еще и без new можно создавать структуры и использовать. Могли бы для структур в C# использовать с++ный синтаксис вызова конструктора.
туц это просто конструктор. В том же Delphi это статическтй метод Constructor Create, который кстати может быть и виртуальным!
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>туц это просто конструктор. В том же Delphi это статическтй метод Constructor Create, который кстати может быть и виртуальным!
Еще раз, new это оператор выделения памяти, создания объекта в куче, возвращающий ссылку но созданный объект. В Java, в С++, в C# том же. А для структур в C# они приспособили его только для вызова конструктора и всё — никакой объект в куче не создается, ссылка не возвращается. В этом противоречие. В разном смысле вызова new для структур и классов.
Так понятно о чем я говорю?
А дельфи тут при чем? Как оно к моему комментарию относится? Что, разве в дельфи у record (аналог структур) есть конструктор Create?
S>>туц это просто конструктор. В том же Delphi это статическтй метод Constructor Create, который кстати может быть и виртуальным!
CRT>Еще раз, new это оператор выделения памяти, создания объекта в куче, возвращающий ссылку но созданный объект. В Java, в С++, в C# том же. А для структур в C# они приспособили его только для вызова конструктора и всё — никакой объект в куче не создается, ссылка не возвращается. В этом противоречие. В разном смысле вызова new для структур и классов. CRT>Так понятно о чем я говорю?
CRT>А дельфи тут при чем? Как оно к моему комментарию относится? Что, разве в дельфи у record (аналог структур) есть конструктор Create?
а, ну значит я отстал. Давно дельфи не занимался. Раньше не было.
Изначально (и очень долгое время) в дельфи все классы создавались только динамически (в куче). У структур конструкторов не было.
Create именно создавал объект в куче и возвращал ссылку.
поэтому вызов
v:=TMyClass.Create;
выглядел логически. Ты создаешь объект, попутно его инициализируя, и возвращаешь ссылку, которую присваиваешь переменной которая будет хранить эту ссылку. Поэтому и назвали конструктор словом Create (хотя насколько помню имя может быть любое)
Потом они решили присобачить к структурам конструктор и решили оставить синтаксис вызова конструктора для структур таким же как и при создание объектов в динамической памяти (в куче) — то есть та же самая шляпа что и в C#.
Кстати раньше в Turbo Pascal был другой синтаксис, без оператора присваивания, и конструкторы было принято называть Init а деструкторы Done
выглядело это так при создании на стеке
var
s: TMyClass;
begin
s.Init;
s.Done;
end.
То есть ты только инициализируешь уже существующий на стеке класс
а при динамическом создании объекта выглядело по другому (через new)
Здравствуйте, Shmj, Вы писали:
S>В С++ new имеет смысл, т.к. без него выделяется память на объект в стеке, а new создает в куче и возвращает указатель.
S>В C# этот new никакой смысловой нагрузки не несет. Так зачем же он?
Иначе будет мымрыц при нахождении в области видимости переменной совпадающей с названием класса.
Либо потом блох ловить, либо вообще запретить имена совпадающие с типами. Что при наличии using — боль дырка заднее основание.
Нет уж — пусть будет ясно видно где обьект создаеться — нафиг всех экономистов-оптимизаторов, пусть на питоне с яваскртиптом пришут и там оптимизируют- хуже уже не будет.
Здравствуйте, Shmj, Вы писали:
S>В C# этот new никакой смысловой нагрузки не несет. Так зачем же он?
Target-typed new?
Или ты все еще живешь в 2010 году?
Здравствуйте, rameel, Вы писали:
T>>Иначе будет мымрыц при нахождении в области видимости переменной совпадающей с названием класса. R>Переменные совпадающие с названием класса — это чтобы жизнь медом не казалось?
Здравствуйте, gandjustas, Вы писали:
G>Target-typed new? G>Или ты все еще живешь в 2010 году?
ну вопрос наверное подразумевает почему изначально внесли такое требование. Да и тот же target-typed new. В C++ например обходятся без new (хотел написать прекрасно обходятся, но признаться честно не так всё прекрасно).
Здравствуйте, sergii.p, Вы писали:
S>>Увы, у меня регулярно. SP>пора переставать есть кактус. Название класса — UpperCamelCase, название переменной — lowerCamelCase и никаких коллизий не возникает.
А пропертя? Собственно, только с ними такие проблемы.
Здравствуйте, sergii.p, Вы писали:
SP>Здравствуйте, gandjustas, Вы писали:
G>>Target-typed new? G>>Или ты все еще живешь в 2010 году?
SP>ну вопрос наверное подразумевает почему изначально внесли такое требование. Да и тот же target-typed new. В C++ например обходятся без new (хотел написать прекрасно обходятся, но признаться честно не так всё прекрасно).
Конечно же в 2001 году, когда придумывал C# такое требование внесли потому что надо было походить на Java (в первую очередь) и C++ (во вторую). 20 лет назад на плюсах нельзя было так написать и вообще о выводе типов мало кто думал.
Почему не убрали new из C# на этом пути — очевидно чтобы не сломать совместимость. Худшее что можно придумать в языке, что подавляющее большинство программ перестанет компилироваться в версии N+1.
Почему не сделали new опциональным, наверное потому что с момента появления Roslyn target-typed new был в планах, да и не сильно сложно этот new писать, он помогает чтению кода
Здравствуйте, Teolog, Вы писали:
R>>Переменные совпадающие с названием класса — это чтобы жизнь медом не казалось?
T>Многие ли вместо Network напишут NetworkImplementationRefObject — потому как нафига такое извращение которое еще поди вспомни?
Вот именно, извращение, ибо никто в здравом уме так не пишет как и не пишет var Network = Network. Переменные и аргументы метода должны начинаться со строчной буквы!
Здравствуйте, Sharov, Вы писали:
R>>Переменные совпадающие с названием класса — это чтобы жизнь медом не казалось?
S>Увы, у меня регулярно.
Мда, такое я видел либо в говноблогах, либо у тех, кто только учится программировать /(на C#)?/g. Вторым простительно, но в любом случае, зачем на них оглядываться? Если же такой бардак в компании, то увы и ах, но опять же — это не повод теперь принимать его за эталон.
R>Вот именно, извращение, ибо никто в здравом уме так не пишет как и не пишет var Network = Network. Переменные и аргументы метода должны начинаться со строчной буквы!
А публичные поля и пропертя — с большой. Вот и будет заботы чтобы ни в одном классе не завести поле с таким именем.
Здравствуйте, Teolog, Вы писали:
T>А публичные поля и пропертя — с большой. Вот и будет заботы чтобы ни в одном классе не завести поле с таким именем.
И?! Поля и свойства не могут пересекаться с названием класса, в котором они объявлены, о чем вообще речь? А если в других классах, то в чем собственно проблема?
Напомню с чего речь пошла
Иначе будет мымрыц при нахождении в области видимости переменной совпадающей с названием класса.
Если что, ничто не мешает и сейчас переменную так же как и аргументы с названием типа объявлять в одной области видимости, и наличие new или его отсутствие на это никак не влияет.
Здравствуйте, Shmj, Вы писали:
S>В C# этот new никакой смысловой нагрузки не несет. Так зачем же он?
Для наглядности. А вот чего в шарпе не нужно, так это дебильный break. Вот он вообще ниачом.
Ну и switch для паттерн матчинга я бы переименовал в match, чтобы не "перегружать смыслами" ключевые слова.