Здравствуйте, VladD2, Вы писали:
НС>>data struct вроде уже есть. Но доживут ли они до релиза — ХЗ, там есть некоторое количество логических проблем. VD>Это что за логические проблемы такие?
Я уже не помню. Там были какие то нестыковки с вспомогательными методами типа equals или copy-конструктора.
VD> И почему они не мешают F# и Nemerle?
Здравствуйте, Serginio1, Вы писали:
V>>Про функциональные языки не скажу, но что будет если поменять порядок объявлений в классе? Всё же поедет. А если типы данных поменянных членов совпадут, то ошибка ещё и не сразу вылезет.
S>Ну то же самое, что в конструкторе параметры поменять.
Конструктор — это всё-таки метод.
То, что порядок параметров в вызове метода имеет значение, все понимают интуитивно. Плюс, есть всякие решарперы, чтобы поменять везде порядок аргументов.
А вот то, что изменение порядка объявлений членов класса может поломать программу — интуитивно непонятно (про С++ сейчас не говорим ).
Здравствуйте, vmpire, Вы писали:
V>Здравствуйте, Serginio1, Вы писали:
V>>>Про функциональные языки не скажу, но что будет если поменять порядок объявлений в классе? Всё же поедет. А если типы данных поменянных членов совпадут, то ошибка ещё и не сразу вылезет.
S>>Ну то же самое, что в конструкторе параметры поменять. V>Конструктор — это всё-таки метод. V>То, что порядок параметров в вызове метода имеет значение, все понимают интуитивно. Плюс, есть всякие решарперы, чтобы поменять везде порядок аргументов. V>А вот то, что изменение порядка объявлений членов класса может поломать программу — интуитивно непонятно (про С++ сейчас не говорим ).
Ну будут и для рекордов в студии . Там так или иначе есть конструктор.
Ты его можешь сам и написать. Но большинство будут использовать краткую запись. Для этого они и придумывались
Positional records
Sometimes it’s useful to have a more positional approach to a record, where its contents are given via constructor arguments, and can be extracted with positional deconstruction.
It’s perfectly possible to specify your own constructor and deconstructor in a record:
public data class Person
{
string FirstName;
string LastName;
public Person(string firstName, string lastName)
=> (FirstName, LastName) = (firstName, lastName);
public void Deconstruct(out string firstName, out string lastName)
=> (firstName, lastName) = (FirstName, LastName);
}
But there’s a much shorter syntax for expressing exactly the same thing (modulo casing of parameter names):
public data class Person(string FirstName, string LastName);
This declares the public init-only auto-properties and the constructor and the deconstructor, so that you can write:
var person = new Person("Scott", "Hunter"); // positional constructionvar (f, l) = person; // positional deconstruction
If you don’t like the generated auto-property you can define your own property of the same name instead, and the generated constructor and deconstructor will just use that one.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>А вместо data struct?
Вместо "data". Оно, конечно, с научной точки зрения будет не верно, так как record относится только к не SUM-типам (к кортежам и типам без наследования), но этих тонкостей один хрен никто не знает кроме человек 100 на земле. Так что было бы нормально.
А так, действительно, в рассуждениях record, а в синтаксисе data. В прочем может это Мэдс не очень компетентен в вопросе или рассчитывает на некомпетентную аудиторию, вот и использует не верную терминологию. В принципе нужно было это АлгТД называть. Термин "запись" применим только к классам без наследования и к структурам. А с наследованием получается эдакое расширение SUM-тиов. То что в Nemrle variant-ами называется, а в F# union-ами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, vmpire, Вы писали: S>Ну будут и для рекордов в студии. Там так или иначе есть конструктор.
Конструктор тут ни при чём, я же про positional deconstruction
Но я, кажется, понял смысл: деконструктор объявляется явно, а синтаксис records повторяет синтаксис метода, а не класса, этого я поначалу не уловил.
Если так, то проблем быть не должно
Здравствуйте, vmpire, Вы писали:
V>Про функциональные языки не скажу, но что будет если поменять порядок объявлений в классе? Всё же поедет. А если типы данных поменянных членов совпадут, то ошибка ещё и не сразу вылезет.
Будет тоже самое, что при изменении порядка параметров в методе. С методами тебя это не смущает? Ну, на фигачат рефакторинов по их изменению.
V>Вот это и напрягает, когда вместо базового класса появляется производный.
Это у тебя предрассудки. Тут нет никакой разницы с вызовом метода. Ты точно так же можешь вызвать метод на базовом тип, а он преобразуется в вызов наследника, так как виртуальный. По сути тут и есть завуалированный вызов виртуального метода копирования.
V>Нет, если LSP в порядке, то проблем не будет. Но вот если не в порядке...
Если в голове что-то не в порядке, проблемы будут по любому. Тут ничего не поделаешь.
Ну, а то что они реализовали растет из науки и 100 проверенно на практике. Я этим уже 14 лет пользуюсь и доволен.
V>Хотя тут, скорее всего, дело привычки. Нужно просто запомнить, как это работает.
Тут дело в боязни нового и парадоксе блаба (погугли). Просто ты смотришь на изменения которые тебе новы и не понятны и резонно опасаешься "как бы чего не вышло". Но эти фичи не новые. Они только для Шарпа новые. Так то они появились в 1970-м году в ML-е. Под ними лежит не хилый научный базис.
Поверь тем кто это уже использовал. На практике это очень упрощает жизнь.
V>Эта "куча" — 2 строки кода.
А ты посчитай. 3 на класс. 3 на метод. А тебе нужно вывести одну строку на консоль.
Согласен, что особой пользы от этого нет. Но как приятное бесплатное дополнение вполне потянет.
V>Единественно когда это может быть полезно, так это если делать интерпретатор, как в скриптовых языках.
Отнюдь. Компилируемым языкам это тоже полезно, хотя и без этого прожить легко.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Потому что C# это не F# и Nemerle.
И в чем разница, особенно в плане equals и копированя?
Не выдумывай.
А Шарп продолжает движение к Немерлу. И это правльно. Вот только не ясно зачем было тратить на это 20 лет и делать столько ошибок. Рано или поздно Шарп станет Немерлом с уговняконным, не консистентным синтаксисом, косяками дизайна, но идеальной реализацией компилятора и ИДЕ. О чем я и говорил 13 лет назад.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Судя по описанию это пруф оф концепт. В ИДЕ поддержки нет. Как к проекту цеплять не ясно. Ты это пробовал использовать?
<ItemGroup>
<!-- Note that this is not a "normal" ProjectReference.
It needs the additional 'OutputItemType' and 'ReferenceOutputAssmbly' attributes. -->
<ProjectReference Include="path-to-sourcegenerator-project.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
</ItemGroup>
Пробовал пару примеров, работает, но поддержки со стороны студии никакой, только командная строка.
Здравствуйте, σ, Вы писали:
>> Версия 9.0 >> Добавили covariant return types
σ>Вот что значит доверить проектирование языка дельфисту.
Дельфист сейчас разрабатывает TypeScript https://ru.wikipedia.org/wiki/TypeScript
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, VladD2, Вы писали:
V>>Про функциональные языки не скажу, но что будет если поменять порядок объявлений в классе? Всё же поедет. А если типы данных поменянных членов совпадут, то ошибка ещё и не сразу вылезет. VD>Будет тоже самое, что при изменении порядка параметров в методе. С методами тебя это не смущает? Ну, на фигачат рефакторинов по их изменению.
Я уже посмотрел повнимательнее, в данном случае синтаксис остаётся как у метода, поэтому проблем не будет.
VD>Ну, а то что они реализовали растет из науки и 100 проверенно на практике. Я этим уже 14 лет пользуюсь и доволен.
Ну я и С++ пользовался лет 10, где порядок объявления членов в классе влиял на логику программы. Но это не значит, что я считаю, что это хорошо.
Но, ещё раз: в данном случае используется синтаксис вызова метода, поэтому проблем не будет.
VD>Тут дело в боязни нового и парадоксе блаба (погугли). Просто ты смотришь на изменения которые тебе новы и не понятны и резонно опасаешься "как бы чего не вышло". Но эти фичи не новые. Они только для Шарпа новые. Так то они появились в 1970-м году в ML-е. Под ними лежит не хилый научный базис.
Вот уж тут Вы точно не угадали Чего чего, а боязни нового у меня нет. Наоборот, я постоянно смотрю, где что появилось и как это может мне пригодится.
Но вместе с тем, некоторые (именно некоторые) вещи вызывают во мне опасение, так я наловился за свою жизнь ошибок в программах, как своих так и не своих, и примерно понимаю, где могут быть слабые места.
В качестве контрпримера: под реляционными базами тоже лежит нехилый научный базис, даже поболее, чем то, что мы обсуждаем.
Что совершенно не мешает поколениям программистов ходить строем по одним и тем же граблям.
VD>Поверь тем кто это уже использовал. На практике это очень упрощает жизнь.
Верить не буду. Ни плюсам, ни минусам. Дойдут руки — проверю сам.
Верить не буду потому, что неоднократно видел, как мыши годами ели кактус и считали, что всё замечательно.
Здравствуйте, rameel, Вы писали:
R>Пробовал пару примеров, работает, но поддержки со стороны студии никакой, только командная строка.
И как оно видно в студии? Отсутствующие типы? Так то по идее если насрать текст в файл и подсунуть это студии через проектную систему должно кое-как работать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, _FRED_, Вы писали:
_FR>Нормальная поддержка в студии: _FR>Note: you will currently need to restart Visual Studio to see IntelliSense and get rid of errors with the early tooling experience
Да, мега технология.
Ну, ладно. Лиха беда начало. Тут главное, чтобы они свои свои животные страхи и парадокс блаба преодолели. Дальше пойдет легче.
_FR>Наше всё :о))
Я имел в виду, как подключить это чудо к своему проекту, а не как дебажит. Но, спасибо rameel, в его сообщении есть ответ
.
_FR>Я пробую. Пока не понятно, как удобнее код генерить: через `StringBuilder.Append(…)` или вручную дерево собирать.
Да там главное как к проекту подключиться и как это обратно окмпилятору подсунуть.
Что-то больно через жопу они все это подключают. Надо было через ключ компилятора. Тогда можно было бы пользоваться его символами и новый код было бы не проблема подсунут. В Росзлине все это предусмотрено (ну хоть как-то). А они через расширения к студии пошли. Это тупик, я думаю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.