Zk 15.2.2011

Cílem semináře je seznámit posluchače s jazykem C#, prostředím platformy .NET a tvorbou aplikací s grafickým uživatelským rozhraním. Předpokládají se znalosti objektově orientovaného programování.
Merlin
Matfyz(ák|ačka) level I
Příspěvky: 13
Registrován: 3. 2. 2008 01:00
Typ studia: Informatika Bc.
Bydliště: Praha
Kontaktovat uživatele:

Zk 15.2.2011

Příspěvek od Merlin »

Nepamatuju si vše.
Co je výsledkem následujícího?

Kód: Vybrat vše

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

Kód: Vybrat vše

(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):

Kód: Vybrat vše

(string[]) => {
Console.WriteLine(obj[0] + obj[1]);
}
paulie
Matfyz(ák|ačka) level I
Příspěvky: 18
Registrován: 4. 1. 2010 23:33
Typ studia: Informatika Mgr.

Re: Zk 15.2.2011

Příspěvek od paulie »

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):

Kód: Vybrat vše

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

class X : I<double>, I<System.Single> { ... }
A ještě tam bylo něco.
paulie
Matfyz(ák|ačka) level I
Příspěvky: 18
Registrován: 4. 1. 2010 23:33
Typ studia: Informatika Mgr.

Re: Zk 15.2.2011

Příspěvek od paulie »

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:

Kód: Vybrat vše

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:

Kód: Vybrat vše

Ax
By
Cz

Kód: Vybrat vše

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:

Kód: Vybrat vše

list => { 
    System.Array.ForEach(list, s => { System.Console.Write(s) } );
    System.Console.WriteLine();
 }
Toť snad vše.
Odpovědět

Zpět na „NPRG035 Jazyk C# a platforma .NET“