Dönüş türü olmayan işlevli temsilci


561

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:


759

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.


11
Temel sınıf kitaplığının bir sonraki sürümü olan FYI, dörtten fazla resmi parametreyi destekleyen Func ve Action türlerini içerecektir. Ne kadar büyük olduklarını tam olarak hatırlamıyorum.
Eric Lippert

88
.NET 4.0'da şimdi 8 parametreye kadar gidiyorlar. Bunu devam ettirirlerse, bir sonraki versiyonda on bire gidecek !! 11 !!!
Michiel van Oosterhout

9
Aslında, 4.0'da 16'ya kadar çıkıyorlar gibi görünüyor.
Tustin2121

7
1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, ... bu derleyicinin bir fonksiyon için gelecekte bir noktada olduğundan daha fazla argümanla başa çıkabilmesi gerektiğini açıkça göstermektedir. !
Chris Morgan

6
Aslında, Tustin2121 haklı, 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.dlldeğ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.
Jeppe Stig Nielsen

83

... argüman almıyor ve geçersiz dönüş türü var mı?

Buna Actionbir çözüm olduğuna inanıyorum .


47

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 Actionveya Action<T>bir değer döndürmek için istemiyorum.


27

Deneyin System.Func<T>veSystem.Action


1
Yine de .Net 2.0'da 0 arg ve neyin var olduğunu düşünmüyorum.
Brian

1
Tuhaf: Func, .Net 2.0'da hiç yok, ancak Predicate ve Action da var.
Joel Coehoorn

2
.NET 2.0 için MethodInvoker temsilcisini kullanın.
Trevor Elliott

.NET 2 Converter<TInput, TOutput>, daha sonra olduğu gibi bir temsilci türüne de sahipti (veya sahipti) Func<T, TResult>. List<>.ConvertAllHer öğ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.)
Jeppe Stig Nielsen

0

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 objectedenlerden 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.


0

... 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()

0

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());
    }  
}

1
Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Bir Doğru bir açıklama ölçüde uzun vadeli değer artıracak göstererek neden bu soruna iyi bir çözüm olduğunu ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Lütfen düzenleyinYaptığınız varsayımlar dahil bazı açıklamalar eklemek için yanıtınızı .
iBug
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.