Overloading konstruktorów frazą this

Overloading konstruktorów frazą this
H4
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:107
0

Mógł by mi ktoś dokładniej wytłumaczyć przykład z książki OReilly'iego?

Kopiuj
	public class Wine
	{
		public decimal Price;
		public int Year;
		public Wine (decimal price) { Price = price; }
		public Wine (decimal price, int year) : this (price) { Year = year; }
	}

Zastanawiam się nad takim tokiem

  1. Wywołujemy konstruktor z nr 2 (decimal, int)
  2. Konstruktor nr 2 by pobrać zmienną price wywołuje konstruktor nr 1
  3. Reszta operacji to ciało konstruktora nr 2 czyli { Year = year; }

Może jest to oszczędność w ilości kodu, ale czy to jest szybsze w wykonywaniu?

edytowany 1x, ostatnio: Hell4Ge
H4
Zdeasemblowałem plik w ODA. Ten sposób zajmuje mniej miejsca, ale na tyle nieznacznie, że lepiej pisać jak komu wygodnie Nie zmienia to faktu, że chciał bym zrozumieć ową metodę :)
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Może jest to oszczędność w ilości kodu, ale czy to jest szybsze w wykonywaniu?

Kompilator nie jest "skończonym idiotą" i wiele rzeczy może zoptymalizować (i optymalizuje) w sposób, o jakim byś nie pomyślał ;)
A nawet jeżeli nie jest to tutaj optymalizowane, to o ile nie tworzysz milionów takich obiektów na sekundę, nie będzie żadnej różnicy.


H4
Tu chodzi tylko o taki detal, jednak imo warto czasem myśleć o takich rzeczach, gdyby ktoś chciał zoptymalizować długi kod. Wiem, że można w linii zapuścić -O2 czy nawet -O3 dla optymalizacji, ale wnikanie w takie detale nie uważam za stracone. Wystarczy spojrzeć na C++ :)
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:5 miesięcy
3

Zacznijmy może od tego (obowiązkowo) że to nie ma żadnego znaczenia. Taki szczegół praktycznie nie wpłynie na szybkość działania programu, nawet wywoływany dużo razy w pętli (bo mówimy o konstruktorze - jeśli go wywołujesz sporo razy w pętli to znaczy że alokujesz dużo pamięci => GC będzie miał co robić)

Wiem, że można w linii zapuścić -O2 czy nawet -O3 dla optymalizacji, ale wnikanie w takie detale nie uważam za stracone.

W csc? Nie ma takich opcji :P. Ale optymalizacje są, i prawdopodobnie uproszczą kod tak jak trzeba. Z jednym masz rację, też nie uważam wnikania w takie detale za stracony czas.

Zdeasemblowałem plik w ODA. Ten sposób zajmuje mniej miejsca, ale na tyle nieznacznie, że lepiej pisać jak komu wygodnie Nie zmienia to faktu, że chciał bym zrozumieć ową metodę :)

Nie wnioskuj na temat wydajności patrząc na Cil (kod pośredni). Kod który się wykonuje faktycznie (skompilowany przez JIT) często nie ma wiele wspólnego z kodem pośrednim.
A ten sposób został stworzony dla wygody programisty, nie kompilatora.

Może jest to oszczędność w ilości kodu, ale czy to jest szybsze w wykonywaniu?

Teoria - nie. Może być najwyżej wolniejsze jeśli nie zostanie zinlinowane, ale na 90% będzie. Za chwilę sprawdzę jak to wygląda praktycznie...

edytowany 1x, ostatnio: msm
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 13 godzin
2

Właśnie sprawdziłem.
W obu wersjach konstruktor został zinline'owany.

Ale to bez znaczenia. Bo trudno mówić o optymalizacji, gdy korzysta się z powolnego typu decimal.

DibbyDum
W jaki sposób najłatwiej takie rzeczy sprawdzić, jakieś polecane narzędzie ? :P
Azarien
debugger pod Visual Studio. tylko trzeba wyłączyć opcje: “Suppress JIT optimization on module load” oraz “Enable Just My Code”.
H4
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:107
0

A jak z działaniem samej frazy "this" w overloadingu?

edytowany 1x, ostatnio: Hell4Ge
H4
Przebieg, ew. "czemu to działa" :)
Azarien
podaj przykład, bo nie rozumiem o co chodzi.
0

Takie wywołanie konstruktorów ma przede wszystkim uniknąć powtarzania się.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.