9

Biorąc pod uwagę następujący przykład, czy obiektywnie jest lepszy/szybszy/bezpieczniejszy niż inny? Czy przypadkowe tworzenie obiektów powinno być najlepszą praktyką tam, gdzie jest to praktyczne?Czy tworzenie instancji literału obiektu jest szybsze niż ustawianie właściwości?

Gdzie jest to nieodpowiednie?

class Person 
{ 
    public string name; 
    public int age; 
} 
void MakePeople() 
{ 
    Person myPerson = new Person(); 
    myPerson.name = "Steve"; 
    myPerson.age = 21; 

    Person literalPerson = new Person { name = "John", age = 22 }; 
} 
+3

Wygenerowana IL z tych dwóch metod powinna być identyczna. Więc nie. –

+2

Jedna linia zamiast trzech i bardziej przejrzysta intencja i efekt. Mogło być 10 razy wolniejsze i nadal byłby to dobry pomysł. Nie jestem w stanie pojąć, w jaki sposób ludzie naprawiają małe różnice w wydajności (jako domyślne podejście, cieszę się z mikrooptymalizacji hotspotów). – delnan

Odpowiedz

16

Nie, nie jest szybszy ani wolniejszy. To jest to samo.

Kompilator tłumaczy obiekt inicjalizujący obiekt na wywołanie konstruktora, a następnie ustawia te właściwości.

Person literalPerson = new Person { name = "John", age = 22 }; 

Okazuje się:

Person myPerson = new Person(); 
myPerson.name = "John"; 
myPerson.age = 22; 

Należy użyć co jest bardziej czytelny i co uzgodnili ze swoim zespołem.

+2

+1 za użycie tego, co jest bardziej czytelne (szczególnie w środowisku zespołowym) – JYelton

+5

Technicznie nie jest to dokładnie to samo, ponieważ kompilator deklaruje zmienną tymczasową, aby zachować przypisanie do zmiennej atomowej. –

+0

@KirkWoll Czy to prawda, nawet w powyższym przypadku, gdy "Osoba" jest typem odniesienia? –

0

Jeśli spojrzysz na wygenerowaną IL, jestem pewien, że przekonasz się, że są one identyczne. Używanie inicjalizatorów obiektów jest tylko skrótem do kompilatora.

1

Albo jest właściwe. To zależy od tego, co musisz zrobić, aby ustawić właściwości. Na przykład, chciałbym uniknąć dosłownego instancji w przypadkach, gdy potrzebna jest jakaś logika, aby dojść do wartości nieruchomości:

Person myPerson = new Person(); 
myPerson.SomeProperty = if IsNewPerson ? GetPropertyFromDatabase() : GetDefaultProperty(); 

Edit:

Jedną zaletą korzystania z dosłownego inicjalizacji obiektów w Visual Studio to że Intellisense poprosi o właściwości, pokazując tylko te, które nie zostały jeszcze zadeklarowane. (Wpadłem na kod, w którym wartość została redundantnie przypisana podczas ustawiania właściwości.)

+1

To tylko osobiste preferencje. Nadal można to zrobić za pomocą dosłownego inicjowania. – Servy

+0

Można, ale staje się znacznie mniej czytelny. – JYelton

+0

Czytelność jest kwestią preferencji. Nie chodzi o to, że to jest złe, tylko że wygenerowany kod jest wciąż taki sam, nawet w twoim przykładzie. – Servy

0

Nie sądzę, że prędkość powinna być tym, co napędza tę decyzję. Prawdopodobnie istnieje niewielka różnica między szybkością dowolnej metody.

Myślę, że czytelność kodu powinna być głównym czynnikiem, w jaki sposób iść. Korzystając z tych kryteriów, myślę, że są one bardzo bliskie i sprowadzają się do osobistych preferencji lub do tego, co zdecyduje twoja drużyna. Jednak myślę, że w przypadku obiektu wymagającego ustawienia wielu właściwości, jawnie wywoływanie ustawiających jest nieco bardziej czytelne.