Zk 23.1.2012

Drozi at 2012-01-23 17:09:11

Příklady si přesně nepamatuju, ale tak aspoň nástin dnešní zkoušky. Zařadil bych ji tak možná do těžšího průměru.

  1. klasika - velikost int [4B]

    // misto 1
    public class A
    {
        // misto 2
        public int ia;
        public void m(B b)
        {
            b.ib = 42;
            ib = 42;
        }

        public class B : I
        {
            //misto 3
            public int ib;
            public void m(A a)
            {
                a.ia = 42;
                ia = 42;
            }
        }
    }

Tady bylo potřeba označit řádky, který sou špatně [ib = 42; a ia = 42;] + další otázka byla, kam a jak se má dopsat definice interfacu I, tak aby "tvořila privátní kontrakt mezi A a B" (nebo jak to tam bylo napsaný). Z možností sem vybral, že má být private a na miste 2. Myslim, že to bylo dobře, ale jistej si nejsem.

  1. klasická otázka, co platí a neplatí pro user-defined třídy.

  2. (4|2)^(1024^6)

  3. příklad na enumerátor. Něco ve smyslu:

    using System; using System.Collections.Generic;

    static class Program { static IEnumerable<int> GetLenghts(this string[] list) { if (list == null) { throw new ArgumentException();

         }
    
         foreach (string s in list)
         {
             Console.Write("x ");
             yield return s.Length;
         }
     }
    
     static void Main()
     {
         string[] x = { "a", "aa", "aaa" };
         foreach (int i in x.GetLenghts())
         {
             Console.WriteLine(i);
             break;
         }
     }
    

    }

A co tohle vypíše.
Možnosti byly něco jako, že to vyhodí runtime chybu, pak že je to závislý na platformě a .NETu, že to vypíše x x 1, x x x 1.... správná odpověď byla x 1.

Další otázka byla na vlákna. Snad ji někdo doplní. Šlo tam přibližně o tohle:

class X
{
    public static volatile int a;
    public static long b;
    public static volatile int c;

    public void T2()
    {
        b = -1;
        System.Console.WriteLine(b);
    }

    public void T1()
    {
        a = 1;
        b = 2;
        c = 3;
    }
}

Když pustíme T1 a T2 ve dvou vláknech, tak co se bude dít. Možnosti byly typu "a se vždy zapíše před c, b se vždy zapíše po a, atd..."

Poslední otázka byla na virt. metody.

using System;

class A
{
    public virtual void m()
    {
        Console.WriteLine("A");
    }
}

class B : A
{
    public override void m()
    {
        Console.WriteLine("B");
    }
}

class C :B
{
    public override void m()
    {
        Console.WriteLine("C");
        ((A)this).m();
    }
}

class Program
{
    static void Main()
    {
        A x = new C();
        x.m();
    }
}

Co se vypíše? Možnosti něco jako: Jen A, Jen C, Jen A C, Jen A A, Něco jiného. //Něco jiného - bude se vypisovat C v nekonečné rekurzi až do zdechnutí na stackoverflow.

Kdyžtak mě někdo doplňte. Vše samozřejmě bez záruky :)

svick at 2012-01-23 21:18:04

Drozi wrote: Další otázka byla na vlákna. Snad ji někdo doplní. Šlo tam přibližně o tohle:

class X
{
    public static volatile int a;
    public static long b;
    public static volatile int c;

    public void T2()
    {
        b = -1;
        System.Console.WriteLine(b);
    }

    public void T1()
    {
        a = 1;
        b = 2;
        c = 3;
    }
}

Když pustíme T1 a T2 ve dvou vláknech, tak co se bude dít. Možnosti byly typu "a se vždy zapíše před c, b se vždy zapíše po a, atd..."

Myslím, že ty fieldy nebyly static, ale to na otázce nic nemění. A taky tam byly možnosti „T2 může vypsat -1/2/0/něco jiného“.