[eng] What’s New in C# 7.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.08.16 01:37
Оценка: 82 (7)
https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [eng] What’s New in C# 7.0
От: Sinix  
Дата: 25.08.16 05:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/


О, чувствуется, что дело к релизу. Всё, что ещё не довели до ума выброшено, включая кодогенерацию (на кой её вообще в timeline c#7 пихали — ).
out var сделали по-человечески, и, заодно расширили область видимости переменных для is expression. Вот это
    if (!(o is int i)) return; // type pattern "int i"
    WriteLine(new string('*', i));

в текущей выпущенной версии не работает. Это просто отлично, т.к. изначально фичи получались чисто декоративные. Починили

Единственное, я не совсем понял подход с static-методом Deconstruct. Его вроде бы хотели оператором сделать, по аналогии с operator is в PM. Чудеса

UPD. Угу, уже ответили (ссылка та же, в комментах)

Mads Torgersen — MSFT:
The `operator is` was an earlier proposed syntax for what eventually became the `Deconstruct` method. They serve the same purpose, which is to describe how an object is deconstructed, and both have potential to grow more expressive as C# evolves (to allow something like F#’s “active patterns”, for example).

Deconstruction does not yet work in patterns. We hope to get to that soon, but not in C# 7.0. In general, think of patterns as a new concept that has taken root in the language and can evolve over time.

В общем, всё больше новых фич делаются через duck typing (не то чтоб что-то новое, .GetEnumerator(), linq duck typing и .GetAwaiter() как бы намекают). Как всегда, Липперт про это писал
Отредактировано 25.08.2016 7:05 Sinix . Предыдущая версия .
Re[2]: [eng] What’s New in C# 7.0
От: HrorH  
Дата: 25.08.16 13:24
Оценка:
Здравствуйте, Sinix, Вы писали:

S>out var сделали по-человечески, и, заодно расширили область видимости переменных для is expression. Вот это

S>
S>    if (!(o is int i)) return; // type pattern "int i"
S>    WriteLine(new string('*', i));
S>

S>в текущей выпущенной версии не работает. Это просто отлично, т.к. изначально фичи получались чисто декоративные. Починили

Может я чего не понимаю, но по-хорошему во второй строчке переменная i должна быть не видна.
Потому что
1)такая запись сильно затрудняет чтение кода, т.к. введение новой локальной переменной в область видимости после return мягко говоря не сразу заметна
2)не очень понятно, что произойдет при добавлении условия в начало if, я так догадываюсь, что в таком виде код не будет компилиться и надо будет убирать объявление из if.
Re[3]: [eng] What’s New in C# 7.0
От: Sinix  
Дата: 25.08.16 14:04
Оценка:
Здравствуйте, HrorH, Вы писали:

HH>Может я чего не понимаю, но по-хорошему во второй строчке переменная i должна быть не видна.

Она и не была видна. Вот обсуждения — почему
https://github.com/dotnet/roslyn/issues/12939
https://github.com/dotnet/roslyn/issues/12597

и предыстория где-то вот отсюда.

Очень рад, что начальная позиция

The tentative plan is to use the same scoping rules as for pattern variables, which could be found here https://github.com/dotnet/roslyn/blob/features/outvar/docs/features/patterns.md

в итоге привела к "и овцы сыты, и с волками неплохо получилось" — правила стали более логичными и для pm и для out var.


HH>1)введение новой локальной переменной в область видимости после return мягко говоря не сразу заметна

Ну и кого новая переменная после return волновать будет? Если в коде простынка такого размера, что out var незаметен, то проблема не в самой out var как бы.

HH>2)не очень понятно, что произойдет при добавлении условия в начало if, я так догадываюсь, что в таком виде код не будет компилиться и надо будет убирать объявление из if.


В итоге была выбрана самая простая и очевидная модель. Сахар работает как 100% замена старому синтаксису:
int x;
if (dict.TryGetValue(someKey, out x)) ...
...

т.е. поведение будет то же самое.
Re[4]: [eng] What’s New in C# 7.0
От: HrorH  
Дата: 25.08.16 14:27
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Ну и кого новая переменная после return волновать будет? Если в коде простынка такого размера, что out var незаметен, то проблема не в самой out var как бы.

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

S>В итоге была выбрана самая простая и очевидная модель. Сахар работает как 100% замена старому синтаксису:

S>
S>int x;
S>if (dict.TryGetValue(someKey, out x)) ...
S>...
S>

S>т.е. поведение будет то же самое.

Как-то не очень очевидно
 if (true || dict.TryGetValue(someKey, out var x))
 {
// А чему будет равен x здесь? 
 }
Re[5]: [eng] What’s New in C# 7.0
От: Sinix  
Дата: 25.08.16 14:48
Оценка: 4 (1) +1
Здравствуйте, HrorH, Вы писали:

HH>Волновать будет например того, кто читает код метода, где эта переменная используется после if, и пытается найти, где она объявлена.

Шарп уже очень давно не заточен на чтение без IDE, это даже как аргумент уже не рассматривается. Раздражает конечно, но что поделать?
Ну а с студией курсор на переменной и все места подсвечиваются.

HH>Проблема в больших методах может и не в объявлении внутри if, но это еще один способ ухудшить читаемость.

Ну тут как всегда. Где-то ухудшает, где-то даёт возможность записать код в одну строчку, аля
// UPD, out _var_ в вызовах забыл. Fixed.
bool CheckSomething(int x) => TryGet1(x, out var y) && TryGet2(x, out var z) && Check(y, z);

Вот тут по читабельности прочие варианты, даже с нормальным PM, заметно многословней будут.



HH>Как-то не очень очевидно

В текущем варианте как раз абсолютно очевидно. 1-в-1, что и с этим примером.
int x;
if (true || dict.TryGetValue(someKey, out var x))
{
   // А чему будет равен x здесь? 
}
Отредактировано 27.08.2016 12:55 Sinix . Предыдущая версия .
Re[6]: [eng] What’s New in C# 7.0
От: LWhisper  
Дата: 27.08.16 12:48
Оценка: 44 (1) +1
Здравствуйте, Sinix, Вы писали:

S>Ну тут как всегда. Где-то ухудшает, где-то даёт возможность записать код в одну строчку, аля

S>
S>bool CheckSomething(int x) => TryGet1(x, out y) && TryGet2(x, out z) && Check(y, z);
S>

S>Вот тут по читабельности прочие варианты, даже с нормальным PM, заметно многословней будут.
Ты забыл var.
В целом, да. Без расширения области видимости, это использовалось бы в основном для TryRemove(key, out *);
Отредактировано 27.08.2016 12:50 LWhisper . Предыдущая версия .
Re[7]: [eng] What’s New in C# 7.0
От: Sinix  
Дата: 27.08.16 12:59
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Ты забыл var.

Ага. Отличная агитация за "да всё ок там с читаемостью" получилась

Fixed, сэнкью вери мач
Re: [eng] What’s New in C# 7.0
От: okon  
Дата: 28.08.16 15:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/


Если язык насыщать постоянно сахаром , не случится ли у него сахарный диабет ?

Зачем вот это новые сахарные конструкции, не лучше было бы вложить усилия в ту же кросплаформенность, чтобы приложения написанные под обычный Фреймворк можно было бы легко перенести на .net core, в том числе asp.net , winforms, wpf и другие типы приложений. Оптимизацию компилятора чтобы эффективно использовались вычислительные операции с матрицами/векторами и т.п.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Отредактировано 28.08.2016 15:30 okon . Предыдущая версия .
Re[2]: [eng] What’s New in C# 7.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.08.16 15:43
Оценка: +1
Здравствуйте, okon, Вы писали:

O>Если язык насыщать постоянно сахаром , не случится ли у него сахарный диабет ?


Я пользователь языка в котором все это есть уже 10 лет ответственно заявляю, что не случится.

O>Зачем вот это новые сахарные конструкции,


Чтобы было удобно писать. По факту даже C# 7.0 — это недоязык в котором многое приходится делать чрез задницу. Я бы сказал, что МС уж очень сильно тормозит с развитием Шарпа.

O>не лучше было бы вложить усилия в ту же кросплаформенность, чтобы приложения написанные под обычный Фреймворк можно было бы легко перенести на .net core, в том числе asp.net ,


Этим и так занимаются отдельные люди. Команда шарпа к этом никакого отношения неимеет.

O>winforms, wpf и другие типы приложений.


А вот это не делается по принципиальным соображениям. МС монополист десктопа. И по сему намеренно не развивает десктопные технологии на других платформах. Так что это удел энтузиастов или отдельных коммерческих контор.

O>Оптимизацию компилятора чтобы эффективно использовались вычислительные операции с матрицами/векторами и т.п.


Компилятор Шарпа вообще не занимается оптимизациями. Ими занимаются те кто работает над рантаймом дотнета. Согласен, что они тоже очень сильно тормозят и качество оптимизации исполняемого кода очень низкое (даже по сравнению с Явой).

Но опять таки это никак не связано с развитием языка. Это просто разные команды. Разные люди. И совершенно разные задачи.

Может это и плохо, что они не связаны, но это так. Не раз слышал отмазки компиляторщиков из МС, что они не могут сделать некоторую фичу потому, что ее не поддерживает CLR.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [eng] What’s New in C# 7.0
От: Jack128  
Дата: 29.08.16 06:39
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/


Хм. Походу локальные функции не могут иметь expression body. Зато файналайзеры могут.
Re[2]: [eng] What’s New in C# 7.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.08.16 06:46
Оценка:
Здравствуйте, Jack128, Вы писали:

VD>>https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/


J>Хм. Походу локальные функции не могут иметь expression body. Зато файналайзеры могут.


Всмысле "=>"? Думаю, что можно будет использовать. Конфликта синтаксического вроде нет, а оно напрашивается.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [eng] What’s New in C# 7.0
От: Sinix  
Дата: 29.08.16 11:57
Оценка:
Здравствуйте, okon, Вы писали:

O>Если язык насыщать постоянно сахаром , не случится ли у него сахарный диабет ?


Ага, был такой вопрос.

>My thoughts are a bit different. It looks like that C# is becoming polluted with all kinds of tricks. I’m afraid that this could lead to a big ball of mud ...

Mads Torgersen — MSFT
You hit on something very central to language evolution. We can add, but we can never take away. This weighs heavily on our minds as we evolve C#. Anders famously says that “every feature starts with minus a hundred points”. For every feature we try to think about whether people will appreciate it not only now, but ten years from now. We try to think about whether it’s worth not only the work involved today, but the space it will forever occupy in the language surface area.

We’re often right, but not always. As you know, the future is one of the hardest things to predict. 😉 And this brings us to another aspect of our design approach: we need to be bold. We need to not be stymied by our responsibility to a distant future. Because otherwise we won’t have that future. C# needs to be among the greatest programming languages today, or it won’t be among them tomorrow.

So we do add things pretty aggressively. We try to add the most valuable features to developers. Moreover we try to add them in a way the minimizes the “agin” of the language in terms of added complexity. Yes, pattern matching is a new feature, but it works in existing constructs such as “is” and “switch”, and over the existing kinds of types. It is (hopefully) well-integrated with our past. At the same time, it introduces patterns in a way that leaves lots of room for them to grow as a concept, without that generality introducing a tax today. It is well-integrated with our plausible future.

You won’t believe how much time we’ve spent speculatively designing the possible futures of patterns, just so that we could make sure to remain open to them. This is part of how we try to keep the language’s long term health and viability at heart as we add new features.

I hope that helps give a picture of how we think about the long term evolution of C#?


Выделенное и подчёркнутое — эт уже новое, при Хейлсберге такого акцента не было
(c) Всё там же в комментариях.
Re[2]: [eng] What’s New in C# 7.0
От: alexzzzz  
Дата: 05.09.16 19:39
Оценка: 6 (1)
Здравствуйте, Jack128, Вы писали:

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


VD>>https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

J>Хм. Походу локальные функции не могут иметь expression body. Зато файналайзеры могут.

У меня работает:
var someCoeff = 2;

int MultiplyByCoeff(int x) => someCoeff * x;

Console.WriteLine($"coeff = {someCoeff}, MultiplyByCoeff(10) = {MultiplyByCoeff(10)}");
Re: [eng] What’s New in C# 7.0
От: alexzzzz  
Дата: 14.09.16 22:32
Оценка:
А что случилось с фичей params IEnumerable? Ещё в 6.0 планировалась, но не успели. Сейчас вспомнил про неё, попробовал в VS Preview 4 — не работает.
Отредактировано 14.09.2016 22:32 alexzzzz . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.