Как это работает?
Цитата: Удаленный пользователь от 05.08.2022, 06:17Здравствуйте, хотел поинтересоваться как так создается переменная в if
if (message.Text is not { } messageText) return; var chatId = message.Chat.Id; Console.WriteLine($"Received a '{messageText}' message in chat {chatId}.");
Здравствуйте, хотел поинтересоваться как так создается переменная в if
if (message.Text is not { } messageText)
return;
var chatId = message.Chat.Id;
Console.WriteLine($"Received a '{messageText}' message in chat {chatId}.");
Цитата: Удаленный пользователь от 05.08.2022, 09:01Приветствую👋. Что бы не переписывать пример, я сошлюсь на свой ответ Discord. [spoiler title="Скрин исходного вопроса"]
[/spoiler]
Вообще в шаблонах можно объявлять переменные . По идее это шаблон свойств. В скобках можно писать шаблоны для свойств объекта. Если они ему соответствуют, поток переходит в if. Что касаемо пустых скобок, по идее работает как проверка типа объекта, советует ли он самому себе. Зачем в конкретном примере вообще объявлять message(можно его не объявлять, если не используется как переменная), не понятно без контекста. Ещё раз message будет просто не проинициализированным объектом.
Примеры:
[spoiler title="Пачка скриншотов"]
[/spoiler]Просто если update.Message может быть null , то выглядит как кто-то поленился указать тип переменной для message.
if (pathResurceImage is not { } message1) return; message1 = "..." //вместо if (pathResurceImage is not string message2) return; //cоотвествующий тип message2 = "..." // по идее должно быть эквивалентноP.S Проще говоря это такая проверка на NULL. Мне лично нравится явно указывать тип.
Приветствую👋. Что бы не переписывать пример, я сошлюсь на свой ответ Discord.

Вообще в шаблонах можно объявлять переменные . По идее это шаблон свойств. В скобках можно писать шаблоны для свойств объекта. Если они ему соответствуют, поток переходит в if. Что касаемо пустых скобок, по идее работает как проверка типа объекта, советует ли он самому себе. Зачем в конкретном примере вообще объявлять message(можно его не объявлять, если не используется как переменная), не понятно без контекста. Ещё раз message будет просто не проинициализированным объектом.
Примеры:



Просто если update.Message может быть null , то выглядит как кто-то поленился указать тип переменной для message.
if (pathResurceImage is not { } message1) return;
message1 = "..."
//вместо
if (pathResurceImage is not string message2) return; //cоотвествующий тип
message2 = "..."
// по идее должно быть эквивалентно
P.S Проще говоря это такая проверка на NULL. Мне лично нравится явно указывать тип.
Цитата: Удаленный пользователь от 05.08.2022, 11:42Приветствую 👋
Соглашусь с Viktor, формально, как уже сказали, это так называемый property pattern, в любом случае, сахар.
То есть пример, приведённый на MS Docsbool IsConferenceDay(DateTime date) => date is { Year: 2020, Month: 5, Day: 19 or 20 or 21 };можно закинуть в SharpLab и увидеть довольно прямолинейный код.
[spoiler title="Листинг"]private bool IsConferenceDay(DateTime date) { int year = date.Year; if (year == 2020) { int month = date.Month; if (month == 5) { int day = date.Day; if ((uint)(day - 19) <= 2u) { return true; } } } return false; }[/spoiler]
Только добавлю, что хоть это также является неявной проверкой на null, на практике, я бы предпочёл очевидный
obj is not nullилиobj != null*, т.к. мало кто захочет додумывать, читая PR, имел ли человек в виду как раз проверку на null или просто забыл дописать условия.* Включив душного программиста, лучше использовать
is (not) null, т.к. операторы равенства можно перегрузить, а в первом случае, компилятор гарантирует, что пользовательские перегрузки не вызываются.
Приветствую 👋
Соглашусь с Viktor, формально, как уже сказали, это так называемый property pattern, в любом случае, сахар.
То есть пример, приведённый на MS Docs
bool IsConferenceDay(DateTime date) => date is { Year: 2020, Month: 5, Day: 19 or 20 or 21 };
можно закинуть в SharpLab и увидеть довольно прямолинейный код.
private bool IsConferenceDay(DateTime date)
{
int year = date.Year;
if (year == 2020)
{
int month = date.Month;
if (month == 5)
{
int day = date.Day;
if ((uint)(day - 19) <= 2u)
{
return true;
}
}
}
return false;
}
Только добавлю, что хоть это также является неявной проверкой на null, на практике, я бы предпочёл очевидный Скопированоobj is not null или Скопированоobj != null*, т.к. мало кто захочет додумывать, читая PR, имел ли человек в виду как раз проверку на null или просто забыл дописать условия.
* Включив душного программиста, лучше использовать Скопированоis (not) null, т.к. операторы равенства можно перегрузить, а в первом случае, компилятор гарантирует, что пользовательские перегрузки не вызываются.
Цитата: Удаленный пользователь от 05.08.2022, 13:08Спасибо вам большое за наводку, надо будет изучить это дело.
Спасибо вам большое за наводку, надо будет изучить это дело.