Zkouška C# 17. 1. 2014

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í.
Oracions

Zkouška C# 17. 1. 2014

Příspěvek od Oracions »

1. Které z následujících jsou referenční typy?
(resp. které můžete dát jako typový parametr, když je omezení T: class)
a) long
b) long[]
c) System.Func<double,double>
d) int?
e) nějaký výčtový typ
f) nějaký "sealed class" typ
g) string

Správně je long[], Func, string a sealed class.

2. Jak můžete rozšířit kód "Console.WriteLine(2.Hours().Hours)", aby se zkompiloval?
a) struct MujInt : Int32 { ...něco... }
b) class MujInt : Int32 { ...něco... }
c) static class X { public static TimeSpan Hours (this int x) { return new Timespan(x, 0,0);}}
d) static class X { public static TimeSpan Hours (this double x) { return new Timespan((int)x, 0,0);}}

Správně je jen C, protože Int32 je struktura a od struktury nelze dědit. D je špatně, protože 2 je Int32 a to, že existuje implicitní konverze neznamená, že se na doublu budou hledat extension metody.

3. Co udělá následující:

Kód: Vybrat vše

IEnumerable<int> f(string[] pole)
{
	foreach(string s in pole)
	{
	  Console.Write("x ");
	  yield return s.Length;
	}
}
foreach(int i in f(new string[] { "a", "aa", "aaa"}))
{
	Console.Write(i);
	break;
}
Správná odpověď: "x 1"

4. Jak velká je proměnná, kterou deklarujete v nějakém .NET jazyku jako long (nemusí se jednat o c#)?
Správná odpověď: Nelze určit, protože např. v C# je to 8 bajtů, v C++/CLI 4 bajty tuším a ve VB.NET to hodí kompilátorovou chybu nejspíš.

5. Následující způsoby, jak zjistit index prvku v Listu<int>, jsou funkčně ekvivalentní. Který z nich je nejvhodnější?
a) list.FindIndex(x => x == i);
b) list.FindIndex(delegate (int x) { return x == i; });
c) list.IndexOf(i, 0, list.Count);
d) list.IndexOf(i);

Správná odpověď: D, protože A a B jsou extension metody s anonymníma funkcema a jsou pomalé, C je o trochu pomalejší než D protože, ač obě uvnitř volají stejnou metodu (Array.IndexOf tuším), tak C nejprve kontroluje, zda její argumenty jsou legální.

6. Zkompiluje se následující kód, a pokud ano, na kterém řádku vyhodí výjimku, pokud někde?

Kód: Vybrat vše

int[] pole = { 1, 2, 3 };
object[] o = pole;
o[0] = new object();
Console.WriteLine(o[0]);
Odpověď: Nezkompiluje se, protože pole hodnotových typů nejsou kovariantní a proto řádek "object[] o = pole" vyhodí compile error

7. Je možné naimplementovat tuto třídu:

Kód: Vybrat vše

interface Interf<T>
{
	T m();
}
class Trida : Interf<double>, Interf<System.Single> { ... }
Odpověď: Ano, protože double není stejný typ jako System.Single a rozhraní můžeme implementovat explicitně, přestože se metody m liší jen návratovým typem.

8. Co vytiskne následující kód?

Kód: Vybrat vše

string a = "Ahoj"
a.Replace("oj", "");
a += "!";
Console.WriteLine(a);
Odpověď: Ahoj!, protože Replace nemění string, na kterém operuje, ale ten upravený vrací jako návratovou hodnotu, kterou tento kód zapomene.

9. Co z následujícího je pravda o třídách?
Mohou dědit z libovolné třídy. (NE, existují sealed třídy)
Mohou dědit z libovolné struktury. (NE, od struktur nelze dědit)
Jejich instance mohou být na zásobníku (NE, jsou vždy na haldě)
Jejich instance mohou být na haldě (ANO)
Výchozí viditelnost třídy je private. (NE, normální třídy mají výchozí viditelnost internal; pouze vnitřní třídy mají výchozí viditelnost private)
Výchozí viditelnost členů třídy je private. (ANO)

Je možné, že jsem něco vynechal.
svick
Matfyz(ák|ačka) level I
Příspěvky: 18
Registrován: 22. 2. 2008 19:19
Typ studia: Informatika Mgr.
Bydliště: 17. listopad

Re: Zkouška C# 17. 1. 2014

Příspěvek od svick »

Oracions píše:Správná odpověď: D, protože A a B jsou extension metody s anonymníma funkcema
To není pravda, FindIndex není extension metoda.
Oracions píše:Jejich instance mohou být na zásobníku (NE, jsou vždy na haldě)
S tímhle bych nesouhlasil. Implementace .Netu může provést escape analysis a díky tomu někdy alokovat instrance tříd na zásobníku. To, že žádná implementace .Netu, kterou znám, to nedělá, nic neznamená.
Oracions

Re: Zkouška C# 17. 1. 2014

Příspěvek od Oracions »

Oracions píše:
Správná odpověď: D, protože A a B jsou extension metody s anonymníma funkcema

To není pravda, FindIndex není extension metoda.
Hm, máš pravdu. Moje odpovědi sice souhlasí se vzorovým řešení, ale to zdůvodnění je špatně. Lepší zdůvodnění je, že ačkoliv metoda FindIndex může být rychlejší pro některé Listy, tak pro Listy jednoduchých typů jako je int a float je metoda Array.IndexOf, kterou interně využívá List.IndexOf implementována tak, že využívá kód napsaný v C++ a obchází tak používání CompareTo.
...heap and stack...
Huh, to jsem nevěděl, díky. Tak možná bys to vyhádal, kdyby ti to stálo za to.
Odpovědět

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