Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Как это работает?

Здравствуйте, хотел поинтересоваться как так создается переменная в if

if (message.Text is not { } messageText)
return;
var chatId = message.Chat.Id;
Console.WriteLine($"Received a '{messageText}' message in chat {chatId}.");

 

Приветствую👋. Что бы не переписывать пример, я сошлюсь на свой ответ  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. Мне лично нравится явно указывать тип.

admin, Удаленный пользователь и Удаленный пользователь отреагировали на эту запись.
adminУдаленный пользовательУдаленный пользователь

Приветствую 👋
Соглашусь с 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, т.к. операторы равенства можно перегрузить, а в первом случае, компилятор гарантирует, что пользовательские перегрузки не вызываются.

admin, Удаленный пользователь и Удаленный пользователь отреагировали на эту запись.
adminУдаленный пользовательУдаленный пользователь

Спасибо вам большое за наводку, надо будет изучить это дело.

admin отреагировал на эту запись.
admin