C# 9.0 begins to take shape
От: yenik  
Дата: 20.12.19 18:24
Оценка: 6 (2)
Горшочек продолжает варить, если кому интересно.

https://www.infoworld.com/article/3505939/microsofts-c-90-begins-to-take-shape.html

* Primary constructors, to reduce programming overhead by putting constructor arguments directly in scope throughout a class, obviating the need to explicitly declare a backing field.
* Top level statements and member declarations, embracing a scripting dialect within C#.
* To avoid capturing any local state when supplying lambda functions for method arguments, the lambda declaration would be prefixed with the static keyword.

Re: C# 9.0 begins to take shape
От: Somescout  
Дата: 20.12.19 19:26
Оценка: +1
Здравствуйте, yenik, Вы писали:

Y>Горшочек продолжает варить, если кому интересно.


Y>https://www.infoworld.com/article/3505939/microsofts-c-90-begins-to-take-shape.html

Y>

Y>* Primary constructors, to reduce programming overhead by putting constructor arguments directly in scope throughout a class, obviating the need to explicitly declare a backing field.
Y>* Top level statements and member declarations, embracing a scripting dialect within C#.
Y>* To avoid capturing any local state when supplying lambda functions for method arguments, the lambda declaration would be prefixed with the static keyword.


Неплохо. Но некоторые пункты мне не понравились, например
ARI ARI ARI... Arrivederci!
Re[2]: C# 9.0 begins to take shape
От: yenik  
Дата: 22.12.19 02:37
Оценка:
S>Simplified parameter null validation code, allowing for standard null validation on parameters to be simplified using a small annotation on parameters.
S>Лучше бы какое-нибудь легковесное AOP запланировали для этих целей, которое позволит все такие аннотации делать самому.

Наверно да, конструкция проверки на null для ненуллабельных типов — это нечто странное.

S>Records, a simplified declaration form for C# class and struct types combining benefits of similar features. Records provide a mechanism for declaring a datatype by describing members of the aggregate as well as additional code or deviations from the usual boilerplate, if any.

S>Зачем нужны records если есть primary constructor для меня загадка. Да и в целом зачем нужны records.

Они, похоже, сами не решили, чего хотят.

S>Scripting dialect тоже довольно странная идея.


Решили погубить ScriptCS и CS-Script и править единолично.
Re: C# 9.0 begins to take shape
От: σ  
Дата: 22.12.19 05:00
Оценка: +1
Y>Горшочек продолжает варить, если кому интересно.

Y>https://www.infoworld.com/article/3505939/microsofts-c-90-begins-to-take-shape.html

Y>

* Primary constructors, to reduce programming overhead by putting constructor arguments directly in scope throughout a class, obviating the need to explicitly declare a backing field.
* Top level statements and member declarations, embracing a scripting dialect within C#.
* To avoid capturing any local state when supplying lambda functions for method arguments, the lambda declaration would be prefixed with the static keyword.


Всем смузи за счёт заведения!
Re: C# 9.0 begins to take shape
От: Kolesiki  
Дата: 24.12.19 13:52
Оценка: +1 -3
Здравствуйте, yenik, Вы писали:

Y>Горшочек продолжает варить, если кому интересно.


Судя по тенденциям, горшочек — "ночной"?

Y>* Primary constructors


Маразм ленивой индусни. Они даже в собственных документах не могут толком объяснить, зачем это нужно — пишут какую-то ахинею, от которой обычному коду ни тепло, ни холодно. Устали макаки писать конструкторы, давайте теперь весь язык изуродуем, чтобы паре макак раз в год пригодилась эта... гм... "фича".

Y>* Top level statements and member declarations, embracing a scripting dialect within C#.


Скриптинг... в языке, который специально делали нормальным. Неужели макакам перестало хватать JS? Зачем лезть в нишу интыпрайза??

Y>* To avoid capturing any local state when supplying lambda functions for method arguments...


чуток сахарка, невелика фича.

PS
Я когда услышал про pattern matching в C#, даже удивился — ну надо же, думаю, мелкомягкие за ум взялись — Немерлю подминают, развиваются! Ан-нет, всё по-старому — банда индусов прыгает по клавишам, менеджер рапортует о количестве фич в пятилетку, ежегодные бонусы, компания продолжает катиться в тарары. Таким "верным путём" команда C# похоронит язык раньше венды! Поражает, насколько бестолковые менеджеры там сидят. Тут Владу с Немерле вообще бояться нечего — она будет в топе ещё лет 10 безо всяких конкурентов! Эх...
Re[2]: C# 9.0 begins to take shape
От: Mr.Delphist  
Дата: 24.12.19 15:24
Оценка:
Здравствуйте, Kolesiki, Вы писали:

Y>>* Primary constructors


K>Маразм ленивой индусни. Они даже в собственных документах не могут толком объяснить, зачем это нужно — пишут какую-то ахинею, от которой обычному коду ни тепло, ни холодно. Устали макаки писать конструкторы, давайте теперь весь язык изуродуем, чтобы паре макак раз в год пригодилась эта... гм... "фича".


Это ж в Котлине так, не?

Ну и попутно, должно упростить кодогенераторы для вспомогательных классов.
Отредактировано 27.12.2019 11:37 Mr.Delphist . Предыдущая версия .
Re[2]: C# 9.0 begins to take shape
От: Somescout  
Дата: 24.12.19 16:24
Оценка: +4
Здравствуйте, Kolesiki, Вы писали:

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


Y>>Горшочек продолжает варить, если кому интересно.


K>Судя по тенденциям, горшочек — "ночной"?


Y>>* Primary constructors


K>Маразм ленивой индусни. Они даже в собственных документах не могут толком объяснить, зачем это нужно — пишут какую-то ахинею, от которой обычному коду ни тепло, ни холодно. Устали макаки писать конструкторы, давайте теперь весь язык изуродуем, чтобы паре макак раз в год пригодилась эта... гм... "фича".


Это "гм... "фича"" нужна для Dependency Injection, и используется постоянно. Каждый раз писать код:
class UserService {
  private readonly IDbContext dbContext;

  public UserService(IDbContext dbContext) {
    this.dbContext=dbContext;
  }
}


Надоедает очень быстро, плюс функционально тут других конструкторов и не предусмотрено. Вся эта портянка заменяется простым:

class UserService(IDbContext dbContext) {
}


Хотя синтаксис мне не нравится, имхо в TypeScript лучше:
class Test {
    constructor(private dbContext:IDbContext) {
    }
}


ЗЫ. Хотя, пожалуй, не такой уж плохой синтаксис: сразу видны зависимости класса.
ARI ARI ARI... Arrivederci!
Отредактировано 24.12.2019 16:51 Somescout . Предыдущая версия .
Re[3]: C# 9.0 begins to take shape
От: alexzzzz  
Дата: 25.12.19 20:54
Оценка:
Здравствуйте, Somescout, Вы писали:

S>Хотя синтаксис мне не нравится, имхо в TypeScript лучше:

S>
class Test {
S>    constructor(private dbContext:IDbContext) {
S>    }
S>}


Мне такой ява/паскалеподобный стиль объявления переменных наоборот не нравится: и что тип указывается после имён переменных; и что нужно ненужное двоеточие, для которого ещё и шифт нажимать.

--

C# 9.0 begins to take shape


Мне кажется, из потенциальных нововведений самое большое и интересное — это shapes.
Отредактировано 25.12.2019 22:05 alexzzzz . Предыдущая версия . Еще …
Отредактировано 25.12.2019 21:14 alexzzzz . Предыдущая версия .
Re[4]: Двоеточие
От: Qbit86 Кипр
Дата: 25.12.19 21:08
Оценка: +1
Здравствуйте, alexzzzz, Вы писали:

A>Мне такой ява/паскалеподобный стиль объявления переменных наоборот не нравится: и что тип указывается после имён переменных; и что нужно ненужное двоеточие, для которого ещё и шифт нажимать.


Такая нотация принята везде (кроме нескольких Си-подобных языков), включая теоретическую информатику. Она вполне естественная. Это не «из Паскаля».
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: Двоеточие
От: alexzzzz  
Дата: 25.12.19 22:04
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Такая нотация принята везде (кроме нескольких Си-подобных языков), включая теоретическую информатику. Она вполне естественная. Это не «из Паскаля».


Этот стиль мне кажется противоестественным.

Вот в этом
var someVariable, someOtherVariable, oneMoreVariable: SomeType;

против
SomeType someVariable, someOtherVariable, oneMoreVariable;

1) Var лишнее, не сообщает дополнительной информации. Не припомню, чтобы в Си-подобных объявления переменных приходилось путать с чем-то другим.
2) Переменных потенциально может быть много, а что они из себя представляют, указывается в самом в конце перечисления.
3) Двоеточие — а) визуальный мусор; б) лишний символ, который надо набирать с шифтом; в) непонятно, зачем отделять переменную (или несколько) от их неотъемлемого свойства — типа. Ощущение, будто переменные через запятую сами по себе, а тип сам по себе, друг к другу не имеют отношения. Двоеточие — "более разделительный" символ, чем запятая.

Если в языке так объявляются переменные, то объявления функций тоже обычно стрёмные (условный пример):
function GetLength(x: float, y: float, z: float): float

1) Не несущее полезной нагрузки слово function (или его аналог) ставят на самом видном месте и оно обязательно.
2) А возвращаемый тип, который как раз полезен, задвинут куда-то подальше от имени функции, а то и вовсе опционален — иди сам ищи, что она возвращает.

Я не вижу логики, зачем так делают.

Предполагаю, что только лишь затем, чтобы типы можно было не писать вообще. В результате, без типов оно выглядит нормально, а с типами страшненько и неудобно. Для слаботипизированных языков сойдёт, но например Расту подобный синтаксис нафига?
Отредактировано 25.12.2019 22:15 alexzzzz . Предыдущая версия .
Re[2]: C# 9.0 begins to take shape
От: SomeOne_TT  
Дата: 25.12.19 22:38
Оценка:
Здравствуйте, Somescout, Вы писали:


S>
  • Records, a simplified declaration form for C# class and struct types combining benefits of similar features. Records provide a mechanism for declaring a datatype by describing members of the aggregate as well as additional code or deviations from the usual boilerplate, if any.
    S>Зачем нужны records если есть primary constructor для меня загадка. Да и в целом зачем нужны records.

    Собственно, тут и указано: для ликвидации boilerplate кода. Мало радости писать Equals/GetHashCode./==/!= для каждой структуры.
  • Re[6]: Двоеточие
    От: Qbit86 Кипр
    Дата: 25.12.19 22:54
    Оценка:
    Здравствуйте, alexzzzz, Вы писали:

    A>1) Var лишнее, не сообщает дополнительной информации. Не припомню, чтобы в Си-подобных объявления переменных приходилось путать с чем-то другим.


    a * b;

    Пример контекстной зависимости в Си. Требует обращения к таблице символов, чтобы понять, объявляется ли здесь указатель или вызывается оператор умножения.

    A>2) Переменных потенциально может быть много, а что они из себя представляют, указывается в самом в конце перечисления.


    Никогда не объявляю несколько переменных (да ещё и неиницализированных) в одной декларации, это выглядит не очень.

    A>в) непонятно, зачем отделять переменную (или несколько) от их неотъемлемого свойства — типа.


    Потому что это разные вещи — значение и тип. В функциональных языках, как и чистом в лямбда исчислении, «через пробел» обозначается аппликация. В типизированном лямбда-исчислении тип отделяется двоеточием. (В Хаскеле двумя, но это его проблемы.)

    A>Если в языке так объявляются переменные, то объявления функций тоже обычно стрёмные (условный пример):

    A>2) А возвращаемый тип, который как раз полезен, задвинут куда-то подальше от имени функции

    В математике так уже триста лет.
    Глаза у меня добрые, но рубашка — смирительная!
    Re[4]: C# 9.0 begins to take shape
    От: varenikAA  
    Дата: 26.12.19 01:48
    Оценка:
    Здравствуйте, alexzzzz, Вы писали:

    A>Мне такой ява/паскалеподобный стиль объявления переменных наоборот не нравится: и что тип указывается после имён переменных; и что нужно ненужное двоеточие, для которого ещё и шифт нажимать.


    В нормальных языках это называется уточнение типа, т.к. чаще вообще не нужно(см. F#).
    Это еще в scala стало мэйнстримом. Мне важнее имя, т.к. оно несет больше смысла, чем тип.
    Тип это упрощенная модель данных, может меняться полиморфно в общем случае.
    ☭ ✊ В мире нет ничего, кроме движущейся материи.
    Re[6]: Двоеточие
    От: AlexRK  
    Дата: 26.12.19 06:27
    Оценка: +1
    Здравствуйте, alexzzzz, Вы писали:

    A>1) Var лишнее, не сообщает дополнительной информации. Не припомню, чтобы в Си-подобных объявления переменных приходилось путать с чем-то другим.


    Не лишнее, это позволяет иногда не указывать тип.

    A>2) Переменных потенциально может быть много, а что они из себя представляют, указывается в самом в конце перечисления.


    Много переменных в одном объявлении не нужно.

    A>3) Двоеточие — а) визуальный мусор;


    Ну, это спорный вопрос. Это один из "якорей", позволяющих глазу зацепляться за код. Подобного "визуального мусора" в современных ЯП предостаточно, но он помогает быстро ориентироваться в коде.

    A>в) непонятно, зачем отделять переменную (или несколько) от их неотъемлемого свойства — типа. Ощущение, будто переменные через запятую сами по себе, а тип сам по себе, друг к другу не имеют отношения. Двоеточие — "более разделительный" символ, чем запятая.


    Это обычная математическая нотация, поэтому, если возникает такое "ощущение", то это скорее плохо, чем хорошо.

    A>1) Не несущее полезной нагрузки слово function (или его аналог) ставят на самом видном месте и оно обязательно.


    Это слово несет полезную нагрузку — облегчает разбор кода и людьми, и компьютерами (https://stackoverflow.com/questions/15990084/why-does-rust-parser-need-the-fn-keyword).

    A>2) А возвращаемый тип, который как раз полезен, задвинут куда-то подальше от имени функции, а то и вовсе опционален — иди сам ищи, что она возвращает.


    Опять — типичная математическая нотация. Ну и не всегда возвращаемый тип полезен. Скажем, здесь "function (x: int) => x + 1" он не полезен, а вреден.
    Re[3]: C# 9.0 begins to take shape
    От: Kolesiki  
    Дата: 26.12.19 09:47
    Оценка: -1
    Здравствуйте, Somescout, Вы писали:

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

    Y>>>* Primary constructors
    K>>Маразм ленивой индусни.

    S>Это "гм... "фича"" нужна для Dependency Injection


    ШТА??? Я не ослышался — из-за того, что где-то в мире бродит узкоприменимая идея DI, теперь В ЯЗЫК(!) нужно вносить всякую бредятину? ОМГ!! Мир сошёл с ума.

    Примерно тем же занимался PL/1, конец которого известен. Да и в целом... братья-инжерены, вы что, серьёзно? Корёжить язык ради сиюминутных идей из "шаблонов проектирования"? А может уже успокоимся и перестанем дрочить на эти паттерны? Или вы так решаете задачи — берёте список шаблонов и начинаете их прикладывать к проблеме?
    В языке НЕ МЕСТО таким вещам. Хотите — делайте библиотеку, макросы, snippets, но превращать стройный синтаксис в кашу — зачем? Сами же потом проклянёте чужой код, когда начнёте разбираться, кто-где-что.

    Кстати, про DI вообще не было ни слова при объяснении Primary constructors — ещё один аргумент к тому, что процесс проектирования идёт безалаберным методом: берут левую идею, пытаются внедрить в язык, а потом объяснить её же, но избегая "левого" источника. Капут... хана языку!
    Re[4]: C# 9.0 begins to take shape
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 26.12.19 10:15
    Оценка: +1
    Здравствуйте, alexzzzz, Вы писали:

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


    S>>Хотя синтаксис мне не нравится, имхо в TypeScript лучше:

    S>>
    class Test {
    S>>    constructor(private dbContext:IDbContext) {
    S>>    }
    S>>}


    A>Мне такой ява/паскалеподобный стиль объявления переменных наоборот не нравится: и что тип указывается после имён переменных; и что нужно ненужное двоеточие, для которого ещё и шифт нажимать.


    A>--

    A>

    C# 9.0 begins to take shape


    A>Мне кажется, из потенциальных нововведений самое большое и интересное — это shapes.


    Здесь не про синтаксис а об объявлении

    public class Test {
      public Test(private IDbContext dbContext,public IDbContext dbContext2) {
        }
    и солнце б утром не вставало, когда бы не было меня
    Отредактировано 26.12.2019 14:55 Serginio1 . Предыдущая версия .
    Re[4]: C# 9.0 begins to take shape
    От: Somescout  
    Дата: 26.12.19 13:24
    Оценка: +5
    Здравствуйте, Kolesiki, Вы писали:

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


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

    Y>>>>* Primary constructors
    K>>>Маразм ленивой индусни.

    S>>Это "гм... "фича"" нужна для Dependency Injection


    K>ШТА??? Я не ослышался — из-за того, что где-то в мире бродит узкоприменимая идея DI, теперь В ЯЗЫК(!) нужно вносить всякую бредятину? ОМГ!! Мир сошёл с ума.


    Настолько узкоприменимая, что уже стандарт дефакто.

    K>Примерно тем же занимался PL/1, конец которого известен. Да и в целом... братья-инжерены, вы что, серьёзно? Корёжить язык ради сиюминутных идей из "шаблонов проектирования"? А может уже успокоимся и перестанем дрочить на эти паттерны? Или вы так решаете задачи — берёте список шаблонов и начинаете их прикладывать к проблеме?


    Я вас не понимаю, вы предлагаете не использовать удобный метод управления зависимостями классов потому что... потому что что?

    K>В языке НЕ МЕСТО таким вещам.


    Потому что вы так сказали. Под таким предлогом можно вырезать большую часть языка, оставив что-то на уроне Виртовского Паскаля.
    А я лично ещё с C# 6 жду эту фичу — уж очень удобная и полезная.

    K>Кстати, про DI вообще не было ни слова при объяснении Primary constructors


    И, предлагаете не пользоваться?

    K>Кстати, про DI вообще не было ни слова при объяснении Primary constructors — ещё один аргумент к тому, что процесс проектирования идёт безалаберным методом: берут левую идею, пытаются внедрить в язык, а потом объяснить её же, но избегая "левого" источника. Капут... хана языку!


    Белки_истерички.jpg
    ARI ARI ARI... Arrivederci!
    Re[4]: C# 9.0 begins to take shape
    От: rudzuk  
    Дата: 27.12.19 09:50
    Оценка:
    Здравствуйте, Kolesiki, Вы писали:

    K>Да и в целом... братья-инжерены, вы что, серьёзно? Корёжить язык ради сиюминутных идей из "шаблонов проектирования"?


    А впендюренный в язык SQL тебя устраивает? Он ведь тоже ради сиюминутных идей.
    avalon/2.0.6
    Re[5]: C# 9.0 begins to take shape
    От: Passerby  
    Дата: 27.12.19 12:38
    Оценка:
    Здравствуйте, rudzuk, Вы писали:

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


    K>>Да и в целом... братья-инжерены, вы что, серьёзно? Корёжить язык ради сиюминутных идей из "шаблонов проектирования"?


    R>А впендюренный в язык SQL тебя устраивает? Он ведь тоже ради сиюминутных идей.


    А не могли бы подсказать, в NET Core3 есть много полезного, к примеру,поддержка HTTP/2 в HttpClient, вместо class Http2CustomHandler : WinHttpHandler; быстрая встроенная поддержка JSON, т.е. не нужен пакет расширения; новый API System.Math и т.д.. Когда все это добавят в фреймворк, чтобы использовать в приложениях?
    Re[5]: C# 9.0 begins to take shape
    От: Kolesiki  
    Дата: 27.12.19 13:48
    Оценка:
    Здравствуйте, Somescout, Вы писали:

    S>>>Это "гм... "фича"" нужна для Dependency Injection


    K>>ШТА??? Я не ослышался — из-за того, что где-то в мире бродит узкоприменимая идея DI, теперь В ЯЗЫК(!) нужно вносить всякую бредятину? ОМГ!! Мир сошёл с ума.


    S>Настолько узкоприменимая, что уже стандарт дефакто.


    "Стандарт" у вас с Толяном? Да ради бога! Этих леммингов, носящихся со своими "паттернами" наблюдаю ежедневно.

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


    Полное непонимание проблемы. Можете проектировать хоть козла на табуретке, это ваши личные задачи. В ЯЗЫКЕ этот бред не нужен.
    Есть простой, понятный, легко объяснимый синтаксис класса. В классе — члены, точно так же легко понимаемы и читаемы. И теперь вылазит апологет DI (ну или ещё какой укушеный) и началось — "а давайте мы туда вкорячим....". НЕ НАДО туда ничего засовывать. class ABC {} — этого достаточно. Тем более, что после класса уже есть "папа", интерфейсы, дженерик параметр, where и т.п. Куда там ещё вашим несуразным переменным??

    K>>В языке НЕ МЕСТО таким вещам.


    S>Потому что вы так сказали. Под таким предлогом можно вырезать большую часть языка, оставив что-то на уроне Виртовского Паскаля.


    Остальные вещи — это syntactic sugar, ничего не имеющие общего с временными парадигмами. Причём сахар вплетён в язык вполне органично.

    S>Белки_истерички.jpg


    Скорее, blind_lemmings_jump_in_toilet.avi
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.