C# 11 Preview Updates
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.22 08:04
Оценка:
C# 11 Preview Updates – Raw string literals, UTF-8 and more!
и солнце б утром не вставало, когда бы не было меня
Re: C# 11 Preview Updates
От: vaa  
Дата: 20.04.22 08:42
Оценка: +1 :)
Здравствуйте, Serginio1, Вы писали:

S>C# 11 Preview Updates – Raw string literals, UTF-8 and more!


в первой фиче баксов маловато!
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: C# 11 Preview Updates
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.22 10:01
Оценка:
Здравствуйте, vaa, Вы писали:

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


S>>C# 11 Preview Updates – Raw string literals, UTF-8 and more!


vaa>в первой фиче баксов маловато!

Но фича долгожданная!
и солнце б утром не вставало, когда бы не было меня
Re: C# 11 Preview Updates
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.04.22 10:54
Оценка: 1 (1)
Здравствуйте, Serginio1, Вы писали:

S>C# 11 Preview Updates – Raw string literals, UTF-8 and more!

Ну, того чего я жду, так и нет.
1. Расширения в Expression Trees (https://github.com/bartdesmet/ExpressionFutures)
2. Expression Types https://github.com/bartdesmet/roslyn/blob/ExpressionTreeLikeTypes/docs/features/expression-types.md
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: C# 11 Preview Updates
От: Kolesiki  
Дата: 20.04.22 11:19
Оценка: 2 (1) +2
Здравствуйте, Serginio1, Вы писали:

S>C# 11 Preview Updates – Raw string literals


Raw string literals start and end with at least three double quotes ("""...""")




Ну идиоты непуганые, что с них взять! Типичное индусятское мышление "решу эту узкую проблему своим узколобым способом, а дальше хоть трава не расти!".

Неужели людям, вращающимся в компиляторостроении, ещё неведомо, что ЛЮБОЙ символ, который будет использован как ограничитель, сразу же у кого-то окажется в данных?! И очевидно, что "ограничитель" — вещь, которая должна быть отдана на откуп ПРОГРАММИСТУ — это он должен решать, чем ограничивать данные. Пример:

var s = ~%some data "not including percentage sign" is safe%;


Здесь тильда (~) — знак начала строки. Следующий символ — динамически выбирается девом, потому что только он знает, какие именно данные он передаёт. В данном случае выбран %. Аналогично:

var s = ~|any <b>html</b> code can be here|;


Если бы у тупоголовых индусов было бы хоть на пол-кило больше мозгов, идиотию с """"""" они бы в жизни не запилили!
Re[2]: C# 11 Preview Updates
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.22 11:22
Оценка:
Здравствуйте, Sinclair, Вы писали:

Да как то они подзабросили Expression Trees. Хотя это мощнейшая штука
и солнце б утром не вставало, когда бы не было меня
Re[3]: C# 11 Preview Updates
От: Kolesiki  
Дата: 20.04.22 11:55
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


S>Да как то они подзабросили Expression Trees. Хотя это мощнейшая штука


Пару раз за жизнь их использовал (не помню зачем), но наверное полезно. А будет ли полноценной заменой (выражениям) создать на лету C# код и его сканпелять?
Re[4]: C# 11 Preview Updates
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.04.22 12:19
Оценка: +1
Здравствуйте, Kolesiki, Вы писали:

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


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


S>>Да как то они подзабросили Expression Trees. Хотя это мощнейшая штука


K>Пару раз за жизнь их использовал (не помню зачем), но наверное полезно. А будет ли полноценной заменой (выражениям) создать на лету C# код и его сканпелять?

Это значительно дольше и требует Roslyn
.Net Core, 1C, динамическая компиляция, Scripting API
и солнце б утром не вставало, когда бы не было меня
Re[4]: C# 11 Preview Updates
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.04.22 01:01
Оценка: 6 (1)
Здравствуйте, Kolesiki, Вы писали:
K>Пару раз за жизнь их использовал (не помню зачем), но наверное полезно. А будет ли полноценной заменой (выражениям) создать на лету C# код и его сканпелять?
Нет, не будет.
ET позволяют делать всякие прикольные штуки типа того же linq.
Весь смысл как раз в том, чтобы писать "обычный" C#-код, который превращается в AST, а не в MSIL. И потом это AST можно как-то анализировать и трансформировать.
Проблемы с нынешним состоянием этого раздела две:
1. Большинство фич, добавленных после C# 3.0, в Expression Tree недоступны. Понятно, что большинство из них там и не нужны, но, скажем, поддержки Tuple там сильно не хватает
2. Компилятор не знает, для чего может потребоваться Expression Tree, поэтому компилирует всё подряд. В том числе и код, который заведомо не удастся обработать выбранным провайдером.

Решения для обеих проблем есть. По первой есть Expression Futures, по второй есть идея использовать специальный провайдер.
Типа сейчас компилятор вызывает статические методы класса Expression; почему бы не дать возможность указать другой класс, методы которого вызывать.
Потенциально можно возвращать из них экземпляры произвольных типов, не обязательно из иерархии Expression. Но важно не это, а возможность проверить порождаемый код, не дожидаясь вызова провайдера.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: C# 11 Preview Updates
От: vaa  
Дата: 21.04.22 01:54
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

K>>Пару раз за жизнь их использовал (не помню зачем), но наверное полезно. А будет ли полноценной заменой (выражениям) создать на лету C# код и его сканпелять?
S>Нет, не будет.
S>ET позволяют делать всякие прикольные штуки типа того же linq.
S>Весь смысл как раз в том, чтобы писать "обычный" C#-код, который превращается в AST, а не в MSIL. И потом это AST можно как-то анализировать и трансформировать.

Как ни крути, а в конце концов получится LISP
Надо немерл юзать, там уже давно можно "анализировать и трансформировать".
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: C# 11 Preview Updates
От: Jack128  
Дата: 21.04.22 07:10
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Проблемы с нынешним состоянием этого раздела две:

S>1. Большинство фич, добавленных после C# 3.0, в Expression Tree недоступны. Понятно, что большинство из них там и не нужны, но, скажем, поддержки Tuple там сильно не хватает
S>2. Компилятор не знает, для чего может потребоваться Expression Tree, поэтому компилирует всё подряд. В том числе и код, который заведомо не удастся обработать выбранным провайдером.

S>Решения для обеих проблем есть. По первой есть Expression Futures, по второй есть идея использовать специальный провайдер.

S>Типа сейчас компилятор вызывает статические методы класса Expression; почему бы не дать возможность указать другой класс, методы которого вызывать.
S>Потенциально можно возвращать из них экземпляры произвольных типов, не обязательно из иерархии Expression. Но важно не это, а возможность проверить порождаемый код, не дожидаясь вызова провайдера.

Насколько я понимаю, такой подход позволит в компил-тайм отсечь только языковые фичи, которые не поддерживает конкретный провайдер. Но, ИМХО, в большинстве случает нужно не языковые фичи отсекать, а использование неизвествных провайдеру методов/свойств/классов. Как использование "Expression Types" из твоей ссылки поможет в этом случае?
Re[6]: C# 11 Preview Updates
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.04.22 09:36
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Насколько я понимаю, такой подход позволит в компил-тайм отсечь только языковые фичи, которые не поддерживает конкретный провайдер. Но, ИМХО, в большинстве случает нужно не языковые фичи отсекать, а использование неизвествных провайдеру методов/свойств/классов. Как использование "Expression Types" из твоей ссылки поможет в этом случае?

Напрямую — увы, никак. Но можно будет вызывать конструирование делегата прямо в IDE — статик методам не нужны экземпляры. Это даст возможность генерировать warnings.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: C# 11 Preview Updates
От: Jack128  
Дата: 21.04.22 09:46
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


J>>Насколько я понимаю, такой подход позволит в компил-тайм отсечь только языковые фичи, которые не поддерживает конкретный провайдер. Но, ИМХО, в большинстве случает нужно не языковые фичи отсекать, а использование неизвествных провайдеру методов/свойств/классов. Как использование "Expression Types" из твоей ссылки поможет в этом случае?

S>Напрямую — увы, никак. Но можно будет вызывать конструирование делегата прямо в IDE — статик методам не нужны экземпляры. Это даст возможность генерировать warnings.

Имеются в виду static методы этого класса Quote ??
Re[8]: C# 11 Preview Updates
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.04.22 09:48
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Имеются в виду static методы этого класса Quote ??

Ага. Вызывать методы Expression смысла нет — они прожуют всё, что угодно. А вот у Quote их можно и позвать.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: C# 11 Preview Updates
От: Jack128  
Дата: 21.04.22 10:08
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


J>>Имеются в виду static методы этого класса Quote ??

S>Ага. Вызывать методы Expression смысла нет — они прожуют всё, что угодно. А вот у Quote их можно и позвать.

Мне все равно понятно, как это в целом будет работать. Вот есть код:
// пусть есть формочка, на ней два Edit'а, в edId юзер пишет ID сущности, в edCaption программа выводит наименование этой сущности.
using var db = new MyDbContext();
edCaption.Text = db.MyTable.Where(x => CompareInt(x.Id, int.Parse(edId.Text)).Select(x => x.Caption).First();
static bool CompareInt(int a, int b) => a == b;


Провайдер не умеет CompareInt и хотелось бы в компил тайм получить warning на этот счет. Как это технически можно сделать имея наш Quote ? Ну можно вызывать его статические методы, но что на вход им подавать ?? Откуда в компил тайм мы получим доступ к edId
Re[10]: C# 11 Preview Updates
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.04.22 11:07
Оценка:
Здравствуйте, Jack128, Вы писали:
J>Провайдер не умеет CompareInt и хотелось бы в компил тайм получить warning на этот счет. Как это технически можно сделать имея наш Quote ? Ну можно вызывать его статические методы, но что на вход им подавать ?? Откуда в компил тайм мы получим доступ к edId
Давайте попробуем разобраться.
Компилятор порождает примерно такой код:
var xParam = Expression.Parameter("x", typeof(MyTableRow));

var predicate = Expression.Lambda<Func<MyTableRow, bool>>(
  Expression.Call(
    null, // статический метод
    typeof(MyClass).GetMethod("CompareInt"),  // тут на самом деле сразу стоит methodToken, но в C# нет аналогичной конструкции
    xParam,
    Expression.Call(
      null, 
      typeof(int).GetMethod("Parse"),
      Expression.Property(
        Expression.Constant(edId),
        "Text"
      )
    )
  ),
  new ParameterExpression[] { xParam  }
)

В перспективе — ровно то же самое, только вместо Expression будет Quote (подразумеваем, что у myTable.Where — подходящий тип аргумента).

Да, в рантайме нам потребуется ссылка на настоящий edId. А вот в компайл-тайме можно было бы попробовать все неконстантные аргументы заменять на default. Это никак не помешает нам в Quote.Call посмотреть на MethodInfo и принять решение, можно ли с ним работать. А константы в конце концов всё равно отрезолвятся в некую константу при свёртке дерева — причём это можно делать даже не внутри .Where или там .ToArray, а прямо в Quote.xxx.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: C# 11 Preview Updates
От: Jack128  
Дата: 21.04.22 11:14
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Да, в рантайме нам потребуется ссылка на настоящий edId. А вот в компайл-тайме можно было бы попробовать все неконстантные аргументы заменять на default. Это никак не помешает нам в Quote.Call посмотреть на MethodInfo и принять решение, можно ли с ним работать. А константы в конце концов всё равно отрезолвятся в некую константу при свёртке дерева — причём это можно делать даже не внутри .Where или там .ToArray, а прямо в Quote.xxx.


Всё тоже самое можно провернуть и с ExpressionTree и получившийся Extression<> отдать какому нить аналайзеру, специфичному для провайдера. И это не требует никаких изменений в языке.
Re[12]: C# 11 Preview Updates
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.04.22 11:17
Оценка:
Здравствуйте, Jack128, Вы писали:
J>Всё тоже самое можно провернуть и с ExpressionTree и получившийся Extression<> отдать какому нить аналайзеру, специфичному для провайдера. И это не требует никаких изменений в языке.
В теории — да; но как мы будем пришивать к провайдеру этот аналайзер?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: C# 11 Preview Updates
От: Jack128  
Дата: 21.04.22 11:36
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

J>>Всё тоже самое можно провернуть и с ExpressionTree и получившийся Extression<> отдать какому нить аналайзеру, специфичному для провайдера. И это не требует никаких изменений в языке.
S>В теории — да; но как мы будем пришивать к провайдеру этот аналайзер?

Не понял вопрос? Я сам аналайзеры не писал, может чего не понимаю, но в моем представлении всё должно работать примерно так:
Аналайзер берет AST аргумента нашего метода Where, строит Expression<> по алгоритму выше и анализирует этот Expression. Нет, в принципе он может и не строить Expression, а на прямую анализоровать рослиновское ast, только мне видится, что такие аналайзеры должны писать сами авторы провайдеров, а в коде провайдера анализ ExtressionTree уже есть и наверняка часть кода можно будет расшарить между провайдером и аналайзером.
Re[14]: C# 11 Preview Updates
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.04.22 11:55
Оценка: +2
Здравствуйте, Jack128, Вы писали:
J>Не понял вопрос? Я сам аналайзеры не писал, может чего не понимаю, но в моем представлении всё должно работать примерно так:
J>Аналайзер берет AST аргумента нашего метода Where, строит Expression<> по алгоритму выше и анализирует этот Expression.
Так он же должен быть специфичным для провайдера. Вот эта вот специфика — она откуда возьмётся?
У нас слева от .Where — абстрактный IQueryable<T>.

J>Нет, в принципе он может и не строить Expression, а на прямую анализоровать рослиновское ast, только мне видится, что такие аналайзеры должны писать сами авторы провайдеров, а в коде провайдера анализ ExtressionTree уже есть и наверняка часть кода можно будет расшарить между провайдером и аналайзером.

Это как раз понятно. Непонятно, как определить, какой из анализаторов вызывать для конкретной строчки исходника.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.