C # i generyczne sposoby anonimowe


Original: http://www.svendtofte.com/csharp/c-generics-and-anonymous-methods/

Nigdy nie byłem dużo C # maven lub cokolwiek, ale ja naprawdę zakochał się w tej konstrukcji w języku. Jedną z rzeczy, które myślę, że prawie każdy ma dużo buduje ciąg, z listy obiektów biznesowych. Powiedzmy, że masz listę identyfikatorów GUID, a ty albo chcesz je wyświetlić, lub zbudować ciąg SQL z nich do użycia w zapytaniu.

Lista gs;
string s;

foreach (Guid g w gs) {
s + = “Id = ‘” + g.ToString () + “” OR “;
}

if (result.Length> 0) {
y s.Substring = (0, s.Length-3);
}

To jest jakiś dobry ole fashioned kurwa łańcuch, i odkąd przyszedł z HTML / JavaScript / (Classic) ASP / PHP, to bussiness jak zwykle przez wszystkie normy. Ale ja nigdy nie lubiłem wiele jego aspektów.

  • Skoro dodanie do łańcucha zawsze, trzeba wziąć ostatnio trochę off, lub łańcuch obraca zniekształcone. To co, jeśli konstrukcja ma. Czasem może to być trudne do połączenia dużej foreach / dla bloku z succedding jeśli bloku.
  • Zawiera liczb magicznych, w tym przypadku 3. Można uniknąć, oczywiście, jeśli nieco, że jesteś dołączanie jest zapisany jako zmienna, a następnie podjąć długość to. Ale to tylko więcej pracy.
  • Inną metodą, za pomocą leków generycznych i anonimowe metody jest następujący

    s = string.Join (“OR”,
    gs.ConvertAll (
    Nowy Converter (
    Delegat (Guid g) {
    powrót string.Format (“id =” {0} “”, g.ToString ());
    }
    )
    ). ToArray ()
    );

    lub, jeśli używasz C # 3.0 (moja praca jest wciąż przy 2,0), można pozbyć się większość składni do budowy delegata.

    s = string.Join (“OR”,
    gs.ConvertAll (
    Nowy Converter (
    g => string.Format (“id =” {0} “”, g.ToString ())
    )
    ). ToArray ()
    );

    Jakie jest radykalnym odejściem od pętli for ongi. Prawdopodobnie dyskusyjna, czy to poprawa rzeczywistych wyników (string.Format jest szybszy niż stary łączenie łańcuchów znaków, ale można użyć string.Format pierwszym podejściu też oczywiście). Jest to o wiele bardziej funkcjonalne podejście, bez skutków ubocznych. Ale chodzi o to, co jest miłe dla oka, nie mam żadnych wątpliwości, nawet jeśli jest to łączący więcej linii, to po prostu czuje się dobrze. Nigdy nie kończy się na to robić, więc nigdy nie jest dowolny ciąg usunąć. Akt tworzenia ciągów potrzebne, a następnie połączenie ich jest oddzielona, ​​która czuje się dobrze.

    Minusem jest to, że robi się trudniejszy do debugowania. Jeśli masz na przykład linię

    bool b = SomeMethod (GetSomeValue (param1, param2), param3);

    Przy użyciu normalnego debuggera nie jest łatwo przebić się do wywołania metody do GetSomeValue. To samo będzie w przypadku odwzorowywania listy w pracy tutaj. Bez przypisanej wartości, to jest nieco trudniejsze do debugowania. Ale biorąc pod uwagę prostotę, to zwykle okazuje się być nie problem dla mnie.