Здравствуйте, Jack128, Вы писали:
J>Правильно. По мне так дальше нужно идти, не только облегчить работу с out-параметрами, но еще и максимально усложнить работу с туплами. Чтоб даже мысли не возникало их использовать.
Они именно так и поступают.
На банальную декомпозицию кортежей у них еще 10 лет уйдет (прошлые ушли на оператор ?. и прочие приятные рюшечки). Хорошо что хоть что-то тырят из правильных идей правильных языков.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Аноним, Вы писали:
А>>//primary constructors — А>>public class Point(int x, int y) { }
А>Кто-нибудь может объяснить, что это? А то все читают с таким видом, будто это есть во всех языках и только c# наконец до этого докатился!
Это аналогично немерловой макре Record, но несколько более гибко, так как можно реализовать логику в кострукторе.
Фича взята из ML-семейсва. Есть в Scala, F#...
Параметры такого конструктора автоматически превращаются в поля класса. Такой конструктор может быть только один.
Если реализуют все грамотно, то тело класса при этом станет единым "скриптом" инициализации (заменой тела конструктора).
А>>using System.Math; А>Это как в Немерле — импорт класса и вызов в коде статических методов без указания класса?
Да.
А>>//monadic null checking — А>>if (points?.FirstOrDefault()?.X ?? -1) { }
А>Больше говнокода! Даёшь жабоскрипт! А>Мрак, если откровенно.
Не скажи. Мы это в Nemerle из Groovy уже дано передрали. Очень удобно когда нужно делать много проверок на null.
Код сокращается в разы. Так что говнокод скорее без этого оператора.
Его суть очень проста. Это точка с проверкой на нул. Если выражение перед ?. вычислится в null, то выражение идущее за ?. не будет вычисляться, а будет возвращен null.
Это повзоволяет создать аналог множественного доступа к членам, но если одни из членов будет null, вместо вылета по исключению будет возвращен null, который нужно будет проверить ровно один раз.
А>А что там народ заикался про множественный return? Разве это возможно? (без хаков) Мой эксперимент на MSIL показал, что возврат из функции с более чем одним элементом на стеке сразу разрывает на куски. Т.е. "напрямую" не получится, значит опять индусские дуроломы прикрутят на изоленте hidden class, который будет прятать в себе массив возвращаемых значений.
Для этого придуманы кортежи и записи. Но до них МС будет доходить следущие 10 лет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, nikov, Вы писали:
N>Пока что это список идей для гипотетических будущих версий C#. Некоторые из этих идей прототипировались, однако не нужно воспринимать пару слайдов на конференции как официальное объявление новых фич или как обязательство реализовать их в ближайшей следующей версии. Скорее, это приглашение к неформальной дискуссии, чтобы лучше понять, в чём нуждаются разработчики.
Что тут дискуритровать? Все эти "идеи" сто лет как реализованы в куче языков и используются на практике. Все они зарекомендовали себя очень хорошо.
Я вот только не понял, что за фигня этот ваш "=>" синтаксис при объявлении членов. Это чтобы блок с return-ом не писать?
Если да, то решение спорное. Люди для этого сто лет как используют "=".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
Z>>Это первый шаг в сторону "все есть выражение". Похоже, что вводить такое сразу по многим причинам (в том числе неприятие разработчиков) тяжело. Это легкий вариант.
AVK>Дело не в неприятии разработчиков, дело в том что C# не Немерле, и туда никто ничего не добавляет просто потому что кому то захотелось (если, конечно, захотелось не Андерсу ).
Я и не называл это главной причиной. На текущий синтаксис это ляжет плохо, слишком много изменений, в том числе и ломающих обратную совместимость, для одной версии придется внести. Все равно изменения должны ложиться на привычный базис.
AVK>Конкретно declaration expressions придумали, потому что не получается качественно добавить кортежи.
Они как-то связаны или просто остались свободные ресурсы?
AVK>Ну а фокусы типоа того, что я показал — просто побочные эффекты. Из той же оперы, кстати (оператор as is ): AVK>
AVK>if ((var y = x as SomeClass) != null)
AVK> Foo(y);
AVK>else
AVK> Bar();
AVK>
Это 6.0 или дальнейшие планы?
AVK>Но таки да, дальняя цель — как можно больше конструкций сделать выражениями. Некоторые, к примеру, жаловались что нет statement формы для оператора ?:, теперь вот она есть. Еще обсуждал с Мэдсом expression форму switch (он, сктати, сказал, что и сишную бредятину с break надо выкидывать, и что как в VB позволить условия сложные писать в кейсах) — вроде бы есть какие то эксперименты (просьба воспринимать это как мои домыслы, потому что NDA) с все тем же оператором ?:, у которого может быть несколько вариантов как в switch.
switch конечно самое вкусное, но сразу же захочется try/catch и using. Ну и иммутабельные переменные на закуску, ведь в нормальном коде большинство их станет именно такими.
Здравствуйте, _NN_, Вы писали:
_NN>Может просто добавить вывод типов из использования для out. _NN>Скажем, Nemerle: _NN>
_NN>mutable x, y;
_NN>def z = Foo(out x, out y);
_NN>
Вывод типов полезен сам по себе. Но для out-параметров, действительно удобно было бы объявлять переменные прямо в параметрах. Тогда можно было бы писать как-то так:
var x = !map.TryGetValue(42, out var value) ? value : -1;
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
_NN>>Может просто добавить вывод типов из использования для out. _NN>>Скажем, Nemerle: _NN>>
_NN>>mutable x, y;
_NN>>def z = Foo(out x, out y);
_NN>>
AVK>Зачем? Смысл этой конструкции как раз в том чтобы предварительно ничего не декларировать.
Не всегда переменная нужна для out-параметров. Часто она просто по разному инициализируется в разных подветках if-ов и т.п. В шарпе очень задалбывает, что в основном можно писать var, но иногда нужно по приседать (описать тип явно).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Вывода типов по имспользованию в C# все равно не будет.
Да, бдудет. Лет эдак через 15-20.
Я закладку на это твое сообщение поставил. Через 15 лет обсудим (если живы будем).
Вывод типов по использованию — это очень удобно. Единственная проблема — сложность алгоритмов. Но это проблема времени, а не идеологическая. А значит рано или поздно ее устранят.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>Это первый шаг в сторону "все есть выражение". Похоже, что вводить такое сразу по многим причинам (в том числе неприятие разработчиков) тяжело. Это легкий вариант.
Скорее это шаг в сторону. Если бы хотели сделать "все есть выражение", то не стали бы городить отдельный синтаксис для инициализации членов, а сделали бы универсальное решение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Не всегда переменная нужна для out-параметров. Часто она просто по разному инициализируется в разных подветках if-ов и т.п. В шарпе очень задалбывает, что в основном можно писать var, но иногда нужно по приседать (описать тип явно).
Это понятно, но тут предлагается это вместо declaration expression.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Здравствуйте, Ziaw, Вы писали:
AVK>>Конкретно declaration expressions придумали, потому что не получается качественно добавить кортежи. Z>Они как-то связаны или просто остались свободные ресурсы?
Связаны конечно. Туплы, применительно к шарпу, в основном, могут решить две проблемы:
1) Инлайн декларация сложного возвращаемого результата.
2) Хранение составных типов в нелокальных контейнерах.
DE решает только первую проблему, но решает ее лучше туплов, потому что у out параметров есть имена. Ну и собственно DE заменяет операцию распаковки тупла в локальные переменные.
Z>Это 6.0 или дальнейшие планы?
Я так думаю (ну ты понял, да?) что 6.0. Но пока, в отличие от первичных конструкторов и новых литералов, это все писями по воде виляно.
Z>switch конечно самое вкусное, но сразу же захочется try/catch и using.
Ну, цель то заявлена именно в разумно полном покрытии всех конструкций. Просто свитч больше всего напрягает лично меня.
Z> Ну и иммутабельные переменные на закуску, ведь в нормальном коде большинство их станет именно такими.
В локальном контексте не так критично. Я только обратил внимание, что неплохо бы добавить вывод типов для локальных констант. Можно заодно расширить их семантику до ro переменных, все равно наружу оно не смотрит и в сборке не фиксируется никак.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Здравствуйте, VladD2, Вы писали:
VD>И будет людям счастье. Не уж то в Розлине такое долго залудить?
Говорят, долго. Хорошо хоть прямо не посылают, как раньше. Хотя, казалось бы, при наличии первичного конструктора и определенных ограничениях на внутренности уже никаких discriminated unions добавлять в язык не нужно, связь между параметрами и свойствами и так формально определена. Но, пока, увы.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Здравствуйте, VladD2, Вы писали:
VD>Вопрос был не в том, что такое "x", а в том является ли это именем для поля содержащего значение свойства, или "x" — это произвольное инициализирующее значение. Думаю, второе.
Это испорченный телефон. Исходный пример такой:
public class Point(int x, int y)
{
public int X => x;
public int Y => y;
public int Dist { get; } = Math.Sqrt(x * x + y * y);
}
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>