русский

C# - pattern matching - many discards

10.03.24 18:38
Re: C# - pattern matching - many discards
 
alex445 коренной житель
in Antwort MrSanders 10.03.24 17:01, Zuletzt geändert 10.03.24 18:48 (alex445)
И я совсем не уверен, что в Яве возможно что то подобное
public delegate void MyDelegate();
MyDelegate delg = () =>  Console.WriteLine("Test");
delg();
Примерно так же, кроме последней строчки. В яве ссылка не метод превращается в объект. И пока что синтаксический сахар, чтобы вызвать deleg() не прикрутили. Runnable существующий тип, можно определить свой. Просто интерфейс с одним методом.




Runnable delg = () -> System.out.println("Print");
delg.run();
А как в шарпе можно присвоить delegate-у существующий метод класса? MyDelegate delg = <метод printX() объекта x1 типа X>;

Можно вывести тип делегата автоматически (начиная с 10 версии языка), если он совпадает с одним из Func или Action (до 16 параметров в каждом). Как раньше было сказано, в Дотнете определены Func или Action с числом обобщённых параметров до 16 (плюс возврат для Func), что позволяет покрыть практически все варианты функций. Тут в меню слева видно. Это позволяет работать фиче автоматического выведения типа делегата. Но если у вас свой тип, повторяющий один из уже готовых Func или Action - может не сработать, или приведёт к одному из Func-Action (тут я точно не знаю - не использовал). Посему лучше использовать уже готовый тип, если он совпадает с нужной вам сигнатурой по входящим параметрам и возврату, чтобы все выведения работали автоматически. Те, кто нарушают конвенции и изобретают велосипеды - да, должны страдать.


Так что объявлять свои типы делегатов для типичных методов - бесполезное занятие. Разве что кто-то хочет именно через имя типа делегата разъяснить, для чего он служит. Но это лишнее. В Дотнете существуют старые делегаты, которые ввели до появления пачек Action и Func - их оставили для совместимости. Но фактически Predicate это один из вариантов Func.


Ещё тут разъяснено, и как это делалось до версии 10.

 

Sprung zu