# Zkouška 21.1.2009 (13:00)

<{ForumPost(poster="marxin", timestamp=2009-01-21 14:52:52)}>
Zadání:  
Test obsahuje v první části zaškrtávací možnosti, minimálně jedna možnost je vždy správně, za každé špatné zaškrtnutí jeden trestný bod( pokud otázka obsahuje 5 správných možností a žádnou nevyberu mám -5). Poslední příklad je na doplnění kódu (maximálně -4 body).  
  
Hodnocení (# trestných bodů):  
0-2 (výborně)  
3-5 (velmi dobře)  
6-8 (dobře)  
9- (neprospěl)  
  
Implicitně:  
.NET 3.5  
  
Test:  
1) Určete výsledek int i = -8 >> 1; \[-4]  
2) Nějaká konstrukce, kde je třída C potomkem structu S, což nejle.  
3) Velikost intu \[4B]  
4) Co bude na konzoli \[26]

        class A {
            public static int a = 5;
    
            public A() {
                a *= 3;
                m();
            }
    
            public virtual void m() {
                a++;
            }
        }
    
        class B : A {
            public B() {
                a *= 2;
            }
    
            public override void m() {
                a -= 2;
            }
        }
    
        class Program {
            static void Main(string[] args)
            {
                B b = new B();
                Console.WriteLine(A.a);
    
            }
        }

5) Zaškrtněte hodnotové typy: int, Interface I {}, enum A {}, System.Int64, bool\[] \[1,3,4]  
6) Co může být T? a  
a) Referencční typ  
b) Hodnotový typ  
c) Číselné typy (int, float, double, ...)  
d) Primární typy(bool, char, byte, int, ...)  
e) T smí obsahovat jenom bezparametrický konstruktor  
\[b,c,d]  
7) Jaký bude výstup následujícího programu

            static void Main() {
                try {
                    Main();
                } catch { }
            }
    

a) Nepůjde zkompilovat  
b) Program po spuštění skončí bez chyby  
c) Program se zacyklí do nekonečna  
d) Skončí s chybou  
\[d - Stack overflow, v 3.5 .NETu je tomu tak]  
8) Napište jaké se budou volat metody. \[A.m1(), D.I.m2(), D.m3()] Něco v tomto stylu

     interface I {
            void m1();
            void m2();
            void m3();
        }
    
        class A : I {
            public void m1() { Console.WriteLine("A::m1()"); }
            public virtual void m2() { Console.WriteLine("A::m2()"); }
            public virtual void m3() { Console.WriteLine("A::m3()"); }
        }
    
    
        class D : A, I {
            public override void m2() { Console.WriteLine("D::m2()"); }
            void I.m2() { Console.WriteLine("D::I.m2()"); }
            public new void m3() { Console.WriteLine("D::m3()"); }
        }
    
        class Program {
            static void Main(string[] args) {
                I d = new D();
    
                Console.Write("((A) d).m1() => "); d.m1();
                Console.Write("((A) d).m2() => "); d.m2();
                Console.Write("((A) d).m3() => "); d.m3();
    
            }
        }

9) Použití using(blok obsahující FileStream f  = new FileStream(...) { blok kódu}), k čemu blok using  
a) Uvolnění paměti alokované fs  
b) Uvolnění systémových zdrojů  
c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby  
d) Něco jiného  
  
10) Doplnění do kódu, aby byl vždy v konzistentním stavu (thread safe) a aby se choval správně za všech podmínek, popřípadě vyhodil výjimky !

    class Stack<T> {
            class Item {
                public T value;
                public Item next;
    
                public Item(T v, Item n) {
                    value = v;
                    next = n;
                }
            }
    
            Item top;
    
            public void Push(T v) {
                top = new Item(v, top);
            }
    
            public T Pop() {
                T value = top.value;
    
                top = top.next;
    
                return value;
            }
        }
    

Moje řešení:

    class Stack<T> {
            class Item {
                public T value;
                public Item next;
    
                public Item(T v, Item n) {
                    value = v;
                    next = n;
                }
            }
    
            Item top;
            private object locker = new object();
    
            public void Push(T v) {
                lock (locker) {
                    top = new Item(v, top);
                }
            }
    
            public T Pop() {
                lock (locker) {
                    if (top == null)
                        throw new Exception("Empty stack !");
    
                    T value = top.value;
                    top = top.next;
    
                    return value;
                }
            }
        }
    


<{/ForumPost}>

<{ForumPost(poster="Anonymous", timestamp=2009-01-21 15:11:44)}>

 > marxin wrote:
 > ...  
 > Explicitně:  
 > .NET 3.5  
 > ...

snad implicitne, nie?
<{/ForumPost}>

<{ForumPost(poster="Him", timestamp=2009-01-21 18:20:19)}>
Pisemka byla přesně ve stylu pana profesora Ježka: "Proč dávat známku zadarmo, jen ať si ji zaslouží". Nicméně, kdo dával pozor na přednáškách a poctivě si prošel slidy, tak to musel na nějakou známku dát. Já si přečetl asi 200 stránek z knížky, kterou p. Ježek doporučoval a bylo tam vše, co je potřeba vědět na test. Nicméně i tak jsem měl v testu čtyři chyby, tj. výsledná 2.
<{/ForumPost}>

<{ForumPost(poster="R.U.R.", timestamp=2009-01-21 18:55:55)}>
Dával jsem pozor na přednáškách a dopoledne před zkouškou jsem si pečlivě prošel slajdy a poznámky z přednášky - a nebylo tam úplně vše co jsem potřeboval vědět, ale na trojku to stačilo.
<{/ForumPost}>

<{ForumPost(poster="Donarus", timestamp=2009-01-21 21:04:35)}>
Nemate nahodou nekdo nejake poznamky z c# - nejake ty nonslide veci ? .. Prochazel jsem si ted svoje ale popravde receno tam toho moc nenachazim ...
<{/ForumPost}>

<{ForumPost(poster="Him", timestamp=2009-01-21 21:14:11)}>
Donaurus: Ne, ale zkus si opatrit tistenou (mozna je i nekde ke stahnuti) verzi knizky Programujeme profesionalne v C# .. tam je opravdu vsechno, co potrebujes.. staci precist to, kde mas mezery. Navic je to psano jak pro lidi trpici vypadky pameti, neustale autor opakuje a ujistuje se, ze tomu rozumis, takze se to da cist rychle.
<{/ForumPost}>

<{ForumPost(poster="Šlupka", timestamp=2009-01-21 21:19:00)}>

 > Donarus wrote:Nemate nahodou nekdo nejake poznamky z c# - nejake ty nonslide veci ? .. Prochazel jsem si ted svoje ale popravde receno tam toho moc nenachazim ...

Stáhni si zdrojáky jak je naimplementován .NET a pořádně si prostuduj jak se .NET kompiluje... To jak se v C# programuje do zkoušky potřebovat takřka nebudeš...  
  
Já jsem se C# učil z knížky "Pro C# 2008 and the .NET 3.5 Platform" a musím říct, že takové chujoviny co byly v testu v ní nejsou... A to je to opravdu hodně obsáhlá knížka...
<{/ForumPost}>

<{ForumPost(poster="cermi", timestamp=2009-01-21 21:41:27)}>
Přesně tak, jde spíš o detaily v .netu runtimu než o reálné věci (na to byl zas test zápočtový). Já kdybych od někoho dostal kód podobný tomu s tím voláním virtuální overridlé fce v konstruktoru (bezparametrickém navíc) předka, tak mu asi urazím pařátky. Ale zas na druhou stranu je asi dobré o nich aspoň vědět, chyby, kdy jsme si naprosto jistí, že je to takhle, a ono to tak není, se občas špatně hledají. Já jsem dostal těsně za jedna naštěstí, i když třeba u toho usingu jsem si nebyl jistý, přeci jen, v té metodě Dispose můžu uvolňovat i unmanaged paměť (obecně teda, FileStream si nic takového nealokuje, takže jsem nakonec zvolil dobře).
<{/ForumPost}>

<{ForumPost(poster="dargor", timestamp=2009-01-30 23:49:02)}>
9) Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using  
a) Uvolnění paměti alokované fs  
b) Uvolnění systémových zdrojů  
c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby  
d) Něco jiného  
  
Tak ze spravna odpoved je b) ?
<{/ForumPost}>

<{ForumPost(poster="cermi", timestamp=2009-02-05 01:33:37)}>

 > dargor wrote:9) Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using  
 > a) Uvolnění paměti alokované fs  
 > b) Uvolnění systémových zdrojů  
 > c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby  
 > d) Něco jiného  
 >   
 > Tak ze spravna odpoved je b) ?

Jo
<{/ForumPost}>

<{ForumPost(poster="Anonymous", timestamp=2009-06-11 18:10:44)}>

 > cermi wrote:
 >  > dargor wrote:9) Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using  
 >  > a) Uvolnění paměti alokované fs  
 >  > b) Uvolnění systémových zdrojů  
 >  > c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby  
 >  > d) Něco jiného  
 >  >   
 >  > Tak ze spravna odpoved je b) ?
 > 
 > 
 > Jo

Povedal by som, ze skor a)  
  
podla [http://msdn.microsoft.com/en-us/library ... S.80).aspx](http://msdn.microsoft.com/en-us/library/yh598w02%28VS.80%29.aspx)  
  
"Defines a scope, outside of which an object or objects will be disposed."
<{/ForumPost}>

<{ForumPost(poster="svick", timestamp=2009-06-11 21:13:14)}>

 > Návštěvník wrote:
 >  > cermi wrote:
 >  >  > dargor wrote:9) Použití using(blok obsahující FileStream f = new FileStream(...) { blok kódu}), k čemu blok using  
 >  >  > a) Uvolnění paměti alokované fs  
 >  >  > b) Uvolnění systémových zdrojů  
 >  >  > c) Když se nepovede připoj. k souboru v parametrech, pokračuje bez chyby  
 >  >  > d) Něco jiného  
 >  >  >   
 >  >  > Tak ze spravna odpoved je b) ?
 >  > 
 >  > 
 >  > Jo
 > 
 > 
 > Povedal by som, ze skor a)  
 >   
 > podla [http://msdn.microsoft.com/en-us/library ... S.80).aspx](http://msdn.microsoft.com/en-us/library/yh598w02%28VS.80%29.aspx)  
 >   
 > "Defines a scope, outside of which an object or objects will be disposed."

Jenže "dispose" znamená zavolat metodu IDisposable.Dispose(), u které je napsané

 > Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.

Takže správně je opravdu b). Samozřejmě takový objekt pak (nejspíš) není dosažitelný, takže podléhá GC, ale to není podstatou using.
<{/ForumPost}>

<{ForumPost(poster="flavius_", timestamp=2010-01-27 21:35:17)}>
Ad ta 8) - jaktože to napotřetí vypíše D.m3? Vzhledem k tomu, že je ta m3 new, tak by snad neměla být z pohledu A vidět, i když v A je m3 virtuální... Viz příklad s Beagly ve slidech.
<{/ForumPost}>

<{ForumPost(poster="1.John", timestamp=2011-06-13 01:20:42)}>
protože v kódu to není přetypované             
viz

    Console.Write("((A) d).m1() => "); ((A)d).m1();
    Console.Write("((A) d).m2() => "); ((A)d).m2();
    Console.Write("((A) d).m3() => "); ((A)d).m3();


<{/ForumPost}>

