Diskuze: Inicializace proměnných
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, když to napíšeš mimo metodu má k tomu přístup celá třídá, zato uvnitř metody je to jen promněná pro metodu, a když ji chceš měnit z jiné metody, tak ti to nepůjde... Snad tomu rozumíš
Ahoj, tady jsme se asi nepochopili. Já se ptám na inicializaci přes konstruktor nebo mimo něj. Pokud si všimneš, tak ta metoda má stejný název jako třída, takže se jedná o konstruktor a na to se právě ptám
Promiň, jak je ráno tak je pro mě těžký i číst, ale myslím že v tom žádný zásadní rozdíl není, jen jde o přehlednost.
Pokud se v konstruktoru nemění hodnota v závislosti na parametrech, tak se inicializuje při deklaraci. Rozdíl v tom není, je to jen pro přehlednost
Žádná instanční proměnná není nikdy přístupná v statickém kontextu.
Nie je v tom ziaden rozdiel. Povedal by som, ze kompilator vsetky priradenia hodnot mimo konstruktoru nakoniec aj tak strci do konstruktoru. Mozes to skusit zostavit a dekompilovat s ILSpy, ci je to naozaj tak.
@Marek Frydrych: Na tom nie je nic specialne. Staticke metody triedy zvycajne nevidia instance premenne.
No, rozdíl v tom sice není (jak jsem říkal), ale pochybuji, že to kompilátor strčí do konstruktoru. Ale nekontroloval jsem to
Vytváření má dvě fáze. Konstruktor se přece nestará o vytvoření
paměti pro třídu a podobné věci. Před vytvořením konstruktoru se teda
musí vytvořit objekt. V takovém výkladu tedy konstruktor můžeme spíše
považovat za metodu, která objekt změní do požadované podoby, než že jej
vytvoří.prostě regulérní metodu, poue volanou implicitně.
Čistě teoreticky by měla být inicializace mimo konstruktor pokud je to
možné. Vytvoří se v první fázi a měla by být tedy rychlejší.
Jestli to tak je nevím, otázka jak sám překladač kód optimalizuje, jak se
optimalizuje při kompilaci atd atd.
Taky bych se přiklonil k tomu, že to hodí kompilátor do konstruktoru.
Přece jen jsou to instanční proměnné a instanci vytváříš pomocí
konstruktoru a inicializace se vždy provádí v konstruktoru, takže bych
řekl, že to kompilátor provede v rámci konstruktoru.
Viz:
// The default constructor has no parameters. The default constructor
// is invoked in the processing of object initializers.
Object initializer by to pak asi měl pořešit.
Hm zajimavé, na tom něco bude. Zajimalo by mě, jestli není někde uvedeno jak to opravdu je Bylo by to zajimavé vědět jak s tím pracují.
No zostavil som si jednoduchy program a potom ho dekompiloval z IL.
class Program
{
int a = 4;
public Program() {
}
public Program(int b) {
this.a = b;
}
static void Main()
{
Program p = new Program();
p = new Program(6);
}
}
Vyzera to tak, ze kompilator vytvori nejaku .ctor():void
metodu,
ktora sluzi ako konstruktor.
Jej telo bolo taketo:
.ctor():void
// Program
private int a = 4;
public Program()
{
}
.ctor(int):void
// Program
private int a = 4;
public Program(int b)
{
this.a = b;
}
Cize by sme mohli povedat, ze ich kompilator zaroven strcil a aj nestrcil do konstruktoru. S istotou vieme podla tohoto povedat, ze deklaracie sa priradia skor, ako sa zacne vykonavat konstruktor triedy.
Ako je to so super konstruktormi neviem, bolo by fajn, ak by sa vyjadril niekto, kto ma vacsie skusenosti s .NET a IL ako ja a popripade ma poopravil s tym ako to v skutocnosti je.
Jak mě na to ještě dnes přišla později myšlenka, napadlo mě pár
řešení.
Podívat se do IL - už bylo řešeno a moc chytří z toho teda nejsme
S projektem Roslyn přišel i kompilátor do stavu OpenSource - bohužel
kompilátor kompiluje pouze do IL, takže i kdyby ses v něm vyznal (o čemž
pochybuji), zřejmě bys nezjistil nic nového než z IL (ale možná jo, kdo
ví).
Napsat na MSDN fórum - třeba dostaneš odpověď.
Ale optimalizace na takové úrovni už je so hardcore. Pokud nevytváříš tisíce (spíše milióny) instancí, nepoznáš rozdíl. Z jednoduché optimalizace algoritmu dostaneš stejný efekt, jak z tohoto případu.
... nebo si jednoduše přečteš specifikaci C#, kde je to vysvětlené. C#
5.0 spec, kapitola 10.11.2
Také se můžeš dozvědět, že konstruktor není metoda a není potřeba ho
vytvářet, což ostatně platí pro libovolnou metodu třídy.
Ahoj, no pokud to dobře chápu, konstruktor je platný jen při startu třídy a proměnné v něm aktivované nejsou použitelné v celé třídě. Pokud tedy chceš proměnnou používat, je potřeba ji mít v konstruktoru a následně do konstruktoru přiřadit hodnotu do proměnné třídy.
class XY
{
int autoTrida;
public XY()
{
int autoKonstruktor = 5;
this.autoTrida = autoKonstruktor;
}
}
hodnota z konstruktoru se přiřadí do proměnné třídy...
v podstatě v tom není žádný rozdíl .... spíš asi záleží na tom jestli ta tvoje proměnná je lokální v konstruktoru nebo ne ... pokud je, tak už nebude dostupná v celé třídě. ale je logičtější inicializace proměnné v konstruktoru - pokud je taková proměnná globální v celé třídě . mužeš mít i více konstruktorů. konstruktor muže být i prázdný a inicializaci proměnné mužeš dělat v nějaké soukromé metodě ...
Zobrazeno 17 zpráv z 17.