2014-12-12 6 views
9

ich für C# durch Sams LINQ Unleashed Abschöpfen und auf Seite 7 aufgelistet:C# Methode Initialisierung in anonymen Typen

Anonyme Typen initialisiert werden können Methoden einschließen, aber diese könnten nur von Interesse für Linguisten sein.

Ich verstehe nicht wirklich, wenn die Linguisten Kommentar ist ein Witz. Unabhängig davon ist es möglich, so etwas wie dies in C#

var obj = new { 
    Name = "Joe", Weight = 200, 
    GetAge = new Func<int>(() => { return 43; }) 
}; 

Hat jemand eine reale Lebenssituation zu tun, wo es notwendig wäre, eine Funktion innerhalb eines anonymen Typs zu definieren? Oder ist das nur ein Ergebnis der Typ-Inferenz ohne praktische Anwendung?

+0

Vielleicht ist es eine Art schlechter Witz? Von [Anonyme Typen (C# -Programmierhandbuch)] (http://msdn.microsoft.com/en-us/library/bb397696.aspx): _ "Anonyme Typen enthalten eine oder mehrere öffentliche schreibgeschützte Eigenschaften. Keine anderen Arten von Klassenmitglieder, wie Methoden oder Ereignisse, sind gültig. "_ –

+0

@GrantWinney - Ich denke, dass eine schreibgeschützte Eigenschaft einen Ausdruck zurückgeben könnte. Dies ist anders als eine Methode oder ein Ereignis. – Hogan

+0

Der Kommentar der Linguisten ist eindeutig humorvoll, aber nicht unbedingt unwahr. Wie Sie selbst gezeigt haben, ist es möglich, anonyme Objekte mit Methoden zu erstellen, aber für eine Situation, in der es "notwendig" wäre, sie zu verwenden, ist das ziemlich unwahrscheinlich. Deshalb sagte der Autor, dass sie nur für Linguisten von Interesse sein könnten. – JLRishe

Antwort

2

Ich würde sagen, es ist eher eine Eigenschaft des Typs Func<T> eher als eine Methode. In der Standardtypdeklaration würde es diese Form hat:

private Func<decimal> myFunc; 

public Func<decimal> MyFunc 
{ 
    get 
    { 
     return myFunc; 
    } 
} 

Und die Nutzung als eine Funktion sein würde, wo Sie brauchen Ihr Ergebnis dynamisch mit den aktuellen Werten anzupassen. Nur bei anonymen Typen gruppieren Sie die Daten nur temporär und müssen dafür nicht unbedingt einen neuen Typ implementieren.

Wie zum Beispiel annehmen, ich bin durch einige servicePayments Sammlung durchschleifen und ich möchte etwas Zahlung und einen Wert für die gesamte Zahlung durch den Kunden bekommen. Hier zu berechnen TotalPayedByCustomer Ich kann Func verwenden. Ich konnte es in keiner anderen Art von Eigentum tun. Unterhalb eines Codes für diesen hypothetischen Typ.

var payment = 
    new 
    { 
     Gross = gross, 
     Tax = taxAmount, 
     Commission = commAmount, 
     TotalPayedByCustomer = new Func<decimal>(
      () => 
       { 
        var totalPayed = 0m; 
        foreach (var custPay in customerPayments) 
        { 
         if (custPay.Payed) 
         { 
          totalPayed += custPay.Amount; 
         } 
        } 

        return totalPayed; 
       }), 
    };