Zk 15.2.2011

Merlin at 2011-02-15 15:42:30

Nepamatuju si vše.

Co je výsledkem následujícího?

"file".ToUpper().Equals("FILE")
  • true

  • false

  • Ovlivněno nastavením CurrentCulture

  • Ovlivněno nastavením CurrentUICulture

  • Nelze používat metody na řetězcové konstanty

Správně je c nebo d (viz turecká abeceda). Radši jsem nezaškrtával nic.

(6^1024)&(~5)

Nějaký možnosti, správně 1026.

Rozhodněte tvrzení o strukturách:

  • Mohou mít jako předka třídu -> NE

  • Mohou mít jako předka strkturu -> NE

  • Implicitní viditelnost členů je public -> NE

  • Lze definovat nové virtuální metody -> NE

  • Mohou být uloženy na haldě -> ANO

  • Mohou být uloženy na zásobníku -> ANO

Klasická prasárna s generickými třídami, které navíc dědí od interfaců. Hraní si s operátory is, as typeof a jestli vrátí true, false nebo se nezkompiluje. Kód už tu někde na fóru je v předchozích zkouškách.

Co je a není hodnotový typ?

  • object -> NE

  • System.Object -> NE

  • System.Drawing.Color -> ANO (je to struktura, viz MSDN)

  • System.Int64 -> ANO

  • něco, už nevím co, ale byl to jasný hodnotvý typ

Byl tam nějaký kód a měla se doplnit jeho implementace, aby to vypsalo pole string[][] v určitém formátu. Řešení bylo navržené tak, aby se musela použít lambda funkce, která vypadala cca takto (za správnost neručím):

(string[]) => {
Console.WriteLine(obj[0] + obj[1]);
}
paulie at 2011-02-15 16:18:10

ad 1) jen upřesním, že šlo o Thread.CurrentThread.CurrentCulture/CurrentUICulture. Taky jsem nezaškrtl nic...

ad generické třídy: nebylo to jako v minulých testech, Ježek pro nás přichystal novou chuťovku: typeof(I), kde I je interface. Dal jsem, že se to nepřeloží, ale ono nejspíš ano, jak koukám na internet...

Taky tam byla klasická otázka, jestli lze doplnit implementaci třídy X, aby kód šel zkompilovat (možnosti Ano, Ne (I<double> a I<System.Single> jsou stejná rozhraní) a ještě další 3 ne s různými důvody):

interface I<T> {  T m(); }

class X : I<double>, I<System.Single> { ... }

A ještě tam bylo něco.

paulie at 2011-02-15 20:03:31

U první otázky bylo řešením "Ovlivněno nastavením Thread.CurrentThread.CurrentCulture"

Taky tam byl kód obsahující metodu vracející IEnumerable<int> s yield return (o tom, jak se překládá, viz slajdy). Na začátku té metody se testovalo, jestli její argument není null, a případně se vyhazovalo ArgumentNullException. Chyták byl v tom, že, ačkoliv se metoda volala s parametrem null, nebylo nikde voláno MoveNext na objekt, který vrátila (tj. enumerátor nebyl použit ve foreach cyklu), takže se výjimka vůbec nevyhodila, jelikož kód té metody se převeden na MoveNext a při volání té metody se tedy vůbec neprovede.

Dál tam byla klasika:

string s1 = "a", s2 = "b", s3 = "ab";
 s1 += s2;
bool a = s1 == s3; 
bool b = (object)s1 == (object)s3

(a možnosti a == true, b == true, nebo a == true, b == false.... řešení: a == true, b == false)

Příklad na lambda nebo anonymní funkci vypadal zhruba takto:
Měli jsme upravit program (smělo se pouze dopsat něco do šedého pole) tak, aby vypsal na standardní výstup:

Ax
By
Cz


class Program {
  public static void Main() {
     string[,] table = {{"A", "x"}, {"B", "y"}, {"C", "z"}}
     System.Array.ForEach(table, 

     <šedé pole>


     ); 
  }
}

System.Array.ForEach má deklaraci: public static void ForEach<T>(T[] array, Action<T> action);
Action<T> má deklaraci public delegate void Action<in T>(T obj);

Správné řešení je doplnit třeba toto:

list => { 
    System.Array.ForEach(list, s => { System.Console.Write(s) } );
    System.Console.WriteLine();
 }

Toť snad vše.