Overloading konstruktorów frazą this

0

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

	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?

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.

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

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.

0

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

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1