Tüm Func delegeleri bir değer döndürür. Boşluk döndüren yöntemlerle kullanılabilecek .NET delegeleri nelerdir?
Tüm Func delegeleri bir değer döndürür. Boşluk döndüren yöntemlerle kullanılabilecek .NET delegeleri nelerdir?
Yanıtlar:
Tüm Func delegeleri bir şey iade eder; tüm Eylem delegeleri geçersizdir.
Func<TResult>
argüman almaz ve TResult döndürür:
public delegate TResult Func<TResult>()
Action<T>
bir argüman alır ve bir değer döndürmez:
public delegate void Action<T>(T obj)
Action
en basit, 'çıplak' delege:
public delegate void Action()
Ayrıca Func<TArg1, TResult>
ve Action<TArg1, TArg2>
(ve 16'ya kadar argüman) var. Bunların (hariç Action<T>
) tümü .NET 3.5 (System.Core içinde tanımlanmıştır) için yenidir.
Func<,,, ... ,>
.NET 4.0'da 16 parametreye kadar (artı bir dönüş türü) gittiler , ancak her "serinin" son sekiz türü içinde System.Core.dll
değil tanımlanmış mscorlib.dll
, bu nedenle neden michielvoo onları görmedi. Ancak, .NET sürüm 4.5 ve 4.5.1'e artık İşlevler veya Eylemler eklenmedi. Bu sıra A170836 veya A170875 olacak mı? Bizi izlemeye devam edin.
... argüman almıyor ve geçersiz dönüş türü var mı?
Buna Action
bir çözüm olduğuna inanıyorum .
Tüm Func delegeleri en az bir parametre alır
Bu doğru değil. Hepsi en az bir tür argümanı alır, ancak bu argüman dönüş türünü belirler.
Yani Func<T>
hiçbir parametreyi kabul etmez ve bir değer döndürür. Kullanım Action
veya Action<T>
bir değer döndürmek için istemiyorum.
Deneyin System.Func<T>
veSystem.Action
Converter<TInput, TOutput>
, daha sonra olduğu gibi bir temsilci türüne de sahipti (veya sahipti) Func<T, TResult>
. List<>.ConvertAll
Her öğeyi List<>
başka bir nesneye yansıtan ve tüm "işlev değerlerini" yenisine yerleştiren yöntemde kullanıldı List<>
. (Daha sonra, bunun için çoğu zaman Linq kullanılır Select
.)
Bazen olay işleme için bir temsilci yazmak isteyeceksiniz, bu durumda , türetilmesi gereken ikinci parametreye ek olarak System.EvenHandler<T>
örtülü olarak bir tür bağımsız değişkenini kabul object
edenlerden yararlanabilirsiniz EventArgs
. EventHandlers geri dönecekvoid
Şahsen bunu bir işlev gövdesinde bir kerelik geri arama oluşturmak için test sırasında yararlı buldum.
... argüman almıyor ve geçersiz dönüş türü var mı?
İçin yazıyorsanız System.Windows.Forms
, şunları da kullanabilirsiniz:
public delegate void MethodInvoker()
Dönüş ve dönüş değeri olmayan alt programları çağırmanın çok kolay bir yolu. sırasıyla Func ve Action kullanıyor . (ayrıca bkz. https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx )
Bu örneği deneyin
using System;
public class Program
{
private Func<string,string> FunctionPTR = null;
private Func<string,string, string> FunctionPTR1 = null;
private Action<object> ProcedurePTR = null;
private string Display(string message)
{
Console.WriteLine(message);
return null;
}
private string Display(string message1,string message2)
{
Console.WriteLine(message1);
Console.WriteLine(message2);
return null;
}
public void ObjectProcess(object param)
{
if (param == null)
{
throw new ArgumentNullException("Parameter is null or missing");
}
else
{
Console.WriteLine("Object is valid");
}
}
public void Main(string[] args)
{
FunctionPTR = Display;
FunctionPTR1= Display;
ProcedurePTR = ObjectProcess;
FunctionPTR("Welcome to function pointer sample.");
FunctionPTR1("Welcome","This is function pointer sample");
ProcedurePTR(new object());
}
}