Wszyscy delegaci Func zwracają wartość. Jakich delegatów .NET można używać z metodami, które zwracają wartość void?
561
Wszyscy delegaci Func zwracają coś; wszyscy delegaci akcji zwracają nieważność.
Func<TResult>
nie przyjmuje argumentów i zwraca TResult:
public delegate TResult Func<TResult>()
Action<T>
pobiera jeden argument i nie zwraca wartości:
public delegate void Action<T>(T obj)
Action
jest najprostszym „nagim” delegatem:
public delegate void Action()
Są też Func<TArg1, TResult>
i Action<TArg1, TArg2>
(i inne do 16 argumentów). Wszystkie te (z wyjątkiem Action<T>
) są nowe w .NET 3.5 (zdefiniowane w System.Core).
Func<,,, ... ,>
) w .NET 4.0, ale ostatnie osiem typów każdej „serii” jest zdefiniowane wSystem.Core.dll
, a nie wmscorlib.dll
, więc to byłby powód dlaczego Michielvoo ich nie widział. Jednak w wersjach .NET 4.5 i 4.5.1 nie dodano żadnych funcs ani akcji. Czy ta sekwencja stanie się A170836 lub A170875 ? Bądźcie czujni.Uważam, że
Action
jest to rozwiązanie.źródło
To nieprawda. Wszystkie pobierają co najmniej jeden argument typu, ale ten argument określa typ zwracany.
Dlatego
Func<T>
nie przyjmuje żadnych parametrów i zwraca wartość. UżyjAction
lub,Action<T>
gdy nie chcesz zwracać wartości.źródło
Spróbuj
System.Func<T>
iSystem.Action
źródło
Converter<TInput, TOutput>
który był podobny do późniejszegoFunc<T, TResult>
. Został użyty wList<>.ConvertAll
metodzie, która rzutowała każdy elementList<>
na inny obiekt i umieściła wszystkie „wartości funkcji” w nowymList<>
. (Później często używa sięSelect
do tego Linq .)Czasami będziesz chciał napisać delegata do obsługi zdarzeń, w którym to przypadku możesz skorzystać,
System.EvenHandler<T>
który domyślnie akceptuje argument typuobject
oprócz drugiego parametru, który powinien pochodzićEventArgs
. EventHandlers powrócąvoid
Osobiście uznałem to za przydatne podczas testowania do utworzenia jednorazowego wywołania zwrotnego w ciele funkcji.
źródło
Jeśli piszesz
System.Windows.Forms
, możesz również użyć:źródło
Bardzo łatwy sposób na wywołanie podprogramów wartości zwracanej i wartości nie zwracającej. używa odpowiednio Func i Action . (patrz także https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )
Wypróbuj ten przykład
źródło