Zkouška C# 17. 1. 2014

Odeslat odpověď

Smajlíci
:D :) :( :o :shock: :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode je zapnutý
[img] je zapnutý
[flash] je vypnutý
[url] je zapnuté
Smajlíci jsou zapnutí

Přehled tématu
   

Rozšířit náhled Přehled tématu: Zkouška C# 17. 1. 2014

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

od Oracions » 19. 1. 2014 22:51

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.

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

od svick » 19. 1. 2014 16:40

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

Zkouška C# 17. 1. 2014

od Oracions » 17. 1. 2014 21:23

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.

Nahoru