# NPRG038 21.6.2012

<{ForumPost(poster="drogan", timestamp=2012-06-25 10:41:26)}>
No, tak tenhle termin byl fakt vtipny. Kdyz jsem odchazel, pulka lidi mu to uz vratila.  
  
1) ??? x = new ExpandoObject();  
x.NovaPolozka = "hodnota";  
x.AJesteDalsi = 42;  
  
Co se muze doplnit za ???. Moznosti byly: dynamic, ExpandoObject, IDynamicMetaObjectProvider, object, var  
  
  
2) V aplikaci vytvoříme partial-trust apl. doménu A, do které budeme pomocí třídy Api z assembly Api.dll nahrávat nedůvěryhodné plug-iny. Assembly Api.dll nahraná v A bude plug-inům sloužit pro komunikačni s full-trust kodem v implicitní apl. doméně aplikace.  
  
Api.dll:

    using ...
    ...
    public class Api: MarshalByRefObject
    {
       public void f() {...}
       public void g() {...}
    }
    ...
    

Metoda f má být volatelná pouze z full-trust, metoda g bude využívána plug-iny. Předpokládané nastavení level 2 transparency rules.  
  
otázky: - Musí být při tvorbě A dodány kromě nastavení vhodné PermissionSet ještě nějaké konfigurační parametry? Jestli ano, které?  
           - Musí být assembly Api.dll nějak speciálně označena / přeložena? Pokud ano, jak?  
  
  
3) Jak z textového řetězce získat první grafém (tím se myslí například ve slove Štěpán -> 1. grafém "Š"). Pomocí čeho to jde?  
Možnosti: CultureInfo, StringInfo, String zkonstruovaný vhodným Encoding, String zkonstruovaný vhodným IFormatProvider, String zkonstruovaný vhodným IFormatable.  
  
  
4) Vyberte nejvhodnější implementaci metody P:  
a) 

    static Task<X> P(Taxk<X> a, Task<X> b) {
       return Task<X>.Factory.StartNew(() =>
          { return a.Result.Add(b.Result); } );
    }
    

b) 

    static Task<X> P(Taxk<X> a, Task<X> b) {
       return Task<X>.Factory.StartNew(() =>
          { Task<X>.WaitAll(a, b);
             return a.Result.Add(b.Result); } );
    }
    

c) 

    static Task<X> P(Task<X> a, Task<X> b) {
       return Task<X>.Factory.ContinueWhenAll<X> (
          new [] {a ,b}, (t) => { return
             t[0].Result.Add(t[1].Result);
          } ) ;
    }
    

d) 

    static Task<X> P(Task<X> a, Task<X> b) {
       return Task<X>.Factory.ContinueWhenAll<X> (
          new [] {a ,b}, (t) => { return
             a.Result.Add(b.Result);
          } ) ;
    }
    

  
5) Mám nějaké data v databázi a stáhnu si je do datasetu. Na řádce X a sloupci Y, kde je nyní hodnota 1, změním hodnotu na 2. Než stačím nahrát data z datasetu zpátky do databaze, někdo přepsal v databázi na řádce X a sloupci Y hodnotu 1 na 3. Co se stane po zavolání metody Update na IDataAdapteru s implicitně vygenerovaným Update dotazem?  
Možnosti: - bez chyby, v datasetu bude 2, v databázi 3  
- chyba, v datasetu bude 2, v databazi 3  
- hodnota v datasetu se přepise z 2 na 3  
- hodnota v databazi se prepise z 3 na 2.  
  
  
6) Implementace metody A.m v CIL:

    .method public hidebysig static int32
    m() cil managed
    {
       .maxstack8
       ldsfld int32 A::v
       ldc.i4.6
       mul
       ret
    }
    

Ukolem je napsat implementaci třídy A tak, aby odpovídalo uvedené implementaci z assembly:

    public class A 
    {
       public static int v;
       ...
    
    }
    

  
7) Otázka z WPF na 3 MessageBoxy, která tady koluje na foru. Kolik se vyvola MsgBoxu, co se vypise v prvním z nich.  
  
  
Mno, kdybyste někdo věděli správné odpovědi, určitě se se zbytkem podělte :). Díky
<{/ForumPost}>

<{ForumPost(poster="Animaniak", timestamp=2012-06-25 21:40:18)}>
na jedničku je pouze dynamic,jinak nevim :D
<{/ForumPost}>

<{ForumPost(poster="pingu", timestamp=2012-06-27 21:57:05)}>
1) Zkusil bych to vysvětlit nějak takhle: Jedině je-li proměnná deklarovaná klíčovým slovem dynamic, do všech výrazů/příkazů s ní se vygeneruje kód pro runtimové vyhledání datových položek/vlastností/metod, umožňující v případě ExpandoObjectu i jejich automatické přidání. U deklarace pomocí (jakéhokoli) typu se nic takového neděje a výrazy/příkazy jsou přeloženy normálně staticky (takže lze přistupovat jen k položkám, které jsou už někde definovány).  
  
2) ani v jednom případě není správná odpověď "ne" :)  
  
3) jenom StringInfo  
  
4) c)  
  
5) jestli se nepletu, tak chyba  
  
6)

    public static int m() {
        return 6 * v;
    }

7) doplnění zadání pro nehledače:  
XAML - vnořené Window, StackPanel, Button, v každém atribut PreviewMouseDown="Common_PreviewMouseDown"  
Code behind - v metodě Common_PreviewMouseDown(object sender, MouseEventArgs e) vyskočí messagebox s vypsanými typy položek sender, e.Source a e.OriginalSource  
Obrázek - myš kliká na text na Buttonu  
řešení: zobrazí se 3 messageboxy, v prvním se vypíše Window, Button, TextBlock  
(v ostatních messageboxech se bude lišit jen sender)
<{/ForumPost}>

