Advertisement
Guest User

PW

a guest
Dec 15th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 47.58 KB | None | 0 0
  1. Programowanie wizualne
  2. wersja 2016-06-13 (dostęp)
  3. Opracowanie
  4. 1. C# - Wesołe modyfikatory
  5.  
  6. out vs ref
  7. ● np. public void Wykonaj(out int a)
  8. lub public void Wykonaj(ref int a)
  9. ● są to modyfikatory parametrów funkcji, służące do przekazywania referencji
  10. ● po zmianie zmienne są widoczne na zewnątrz funkcji
  11. ● out musi być zainicjalizowany wewnątrz funkcji
  12. ● ref musi być zainicjalizowany przed wykonaniem funkcji
  13. ● Przykład out
  14.  
  15. class OutExample
  16. {
  17. static void Method(out int i)
  18. {
  19. i = 44;
  20. }
  21. static void Main()
  22. {
  23. int value;
  24. Method(out value);
  25. // value is now 44
  26. }
  27. }
  28.  
  29. ● Przykład ref
  30.  
  31. class RefExample
  32. {
  33. static void Method(ref int i)
  34. {
  35. // Rest the mouse pointer over i to verify that it is an int.
  36. // The following statement would cause a compiler error if i
  37. // were boxed as an object.
  38. i = i + 44;
  39. }
  40. static void Main()
  41. {
  42. int val = 1;
  43. Method(ref val);
  44. Console.WriteLine(val);
  45. // Output: 45
  46. }
  47. }
  48.  
  49. Zadanie 1 ze strony Wojciechowskiego
  50. Jaka jest różnica między modyfikatorem ref i out? (przypisanie wartości wewnątrz metody i wartość początkowa parametru)
  51. Odpowiedź:
  52. Parametry oznaczone jako out MUSZĄ być przypisane w treści/ciele metody, ref NIE MUSZĄ. Wartość początkowa dla out jest NIEZAINICJOWANA, dla ref jest taka jak była ustawiona w miejscu wywołania.
  53.  
  54. private static void xd(out int d)
  55. {
  56. Console.WriteLine(d); // CS0269 nie da się bo d jest niezainicjowane
  57. d = 3;
  58. }
  59.  
  60. Zadanie 5 ze strony Wojciechowskiego
  61. Czy argumenty z parametrami out/ref mogą mieć wartości domyślne?
  62. Odpowiedź:
  63. Nie.
  64.  
  65. readonly vs const
  66. ● const jest przypisywany na poziomie kompilacji
  67. ● const musi być zainicjalizowany już na poziomie deklaracji
  68. ● const nie może być static - i tak jest już związany z klasą a nie instancją
  69. ● readonly jest inicjalizowany w konstruktorze i nie można juz go potem zmieniać (przypisywany podczas działania programu)
  70. ● readonly może być static
  71.  
  72. dynamic vs object
  73. ● object jest po prostu typem, po którym wszystko dziedziczy
  74. ● dynamic pomija jakiekolwiek sprawdzanie typu - możemy na zmiennej dynamic wywołać dowolną metodę - kompilator nas nie ostrzeże, że jakaś nie istnieje w obiekcie który przypisaliśmy do tej zmiennej. Dopiero podczas działania programu się nieźle wywali ;)
  75. ● Zapis object x = 4; spowoduje, że do końca swojego istnienia zmienna x bedzie rozpoznawana jako int, z kolei dynamic d = 4; pozwoli na późniejsze przypisanie d = "cztery";, czyli zupełną zmianę typu.
  76.  
  77. sealed
  78. ● klasa zapieczętowana
  79. ● nie można po niej dziedziczyć
  80. ● (modyfikator private również uniemożliwia dziedziczenie)
  81. o Uwaga @MB: private i dziedziczenie polega na tym, że w klasach pochodnych nie można odwołać się do pól private ale są one dziedziczone
  82. ● Przykład sealed
  83.  
  84. sealed class SealedClass
  85. {
  86. ...
  87. }
  88. class ChildClass:SealedClass
  89. // powoduje błąd cannot inherit from sealed class 'SealedClass'
  90. {
  91. ...
  92. }
  93.  
  94. partial
  95. ● pozwala podzielić klasę, strukturę albo interfejs na kilka części (będące na przykład w różnych plikach)
  96. ● każda część musi być oznaczona jako partial
  97.  
  98. params
  99. ● pozwala przyjąć funkcji dowolną liczbę argumentów danego typu
  100. ● argument z params musi być ostatnim argumentem
  101. ● w efekcie dostajemy tablicę zawierającą wszystkie przekazane parametry
  102. ● np. public void Wykonaj(int a, params string b) - dostaniemy b jako tablicę stringów
  103. ● wywołanie powyższego: Wykonaj(1, "aa", "bb", "accs", "safdasa");
  104.  
  105. Zadanie 2 ze strony Wojciechowskiego
  106. Czy jedna metoda może mieć dwa parametry z modyfikatorem params?
  107. Odpowiedź:
  108. Nie.
  109.  
  110. Zadanie 3 ze strony Wojciechowskiego
  111. Czy argument z modyfikatorem params może być pierwszy? Innymi słowy, czy poprawna jest definicja:
  112. public int SumDiv(params int [] arg, ref int x, out float res)
  113. Odpowiedź:
  114. Nie jest poprawne. Argument params zawsze musi być ostatni.
  115.  
  116. new vs override
  117. ● override przysłania metodę i pozwala użyć polimorfizmu. Przysłania metodę virtual, abstract albo inny override.
  118. ● new przesłania metodę i blokuje polimorfizm. W efekcie klasa bazowa nie wie, że została przysłonięta. Rzutowanie jakiejś klasy z metodą new na klasę bazową spowoduje, że przysłaniająca metoda przestanie być widoczna (będzie wykonywana metoda z klasy bazowej)
  119.  
  120. implicit
  121. ● operator konwersji niejawnej (i jawnej też)
  122. ● Przykład:
  123.  
  124. class Text
  125. {
  126. public static implicit operator Text(int n)
  127. {
  128. return new Text {str = n.toString()};
  129. }
  130. }
  131.  
  132. Potem używamy:
  133. Text txt = 1 lub ewentualnie Text txt = (Text) 1;
  134.  
  135. explicit
  136. ● operator konwersji jawnej
  137. ● Przykład:
  138.  
  139. class Text
  140. {
  141. public static explicit operator Text(int n)
  142. {
  143. return new Text {str = n.toString() };
  144. }
  145. }
  146.  
  147. Potem używamy:
  148. Text txt = (Text) 1;
  149.  
  150. static
  151. ● Metoda klasy opatrzona słowem kluczowym static będzie traktowana jako statyczna. Odwołanie do metod statycznych nie wymaga tworzenia instancji (obiektu) klasy. W takim przypadku, pamięć potrzebna na wykonanie danej metody jest rezerwowana w momencie pierwszego użycia ów metody w klasie.
  152.  
  153. Czy funkcja jest poprawna?
  154. Przykład 1:
  155. ● class Klasa {
  156. public static int a = 1;
  157. public static int b = 1;
  158. public int funk(int c){
  159. return a+b+c;
  160. }
  161. }
  162. ● Jest poprawna. Funkcja jest static i odwołuje się tylko do pól statycznych i swoich arg.
  163.  
  164. Przykład 2:
  165. ● class Klasa {
  166. public static int a = 1;
  167. public int b = 1;
  168. public static int funk(int c){
  169. return a+b+c;
  170. }
  171. }
  172. ● Nie jest poprawna, bo odwołuje się do niestatycznego b.
  173.  
  174. Zadanie 3 z egzaminu
  175. Czy podany kod jest poprawny:
  176. class jakaśtak {
  177. public int a;
  178. public static int b = 1234;
  179. public int f1(int c)
  180. {
  181. return a+b+c;
  182. }
  183. }
  184. Odpowiedź:
  185. Kod jest poprawny. Zmienna a zostanie domyślnie zainicjowane zerem, więc żadnego wyjątku nie będzie (warning CS0649: Field `Program.Klasa.a' is never assigned to, and will always have its default value `0' ).
  186. Składowe klas są inicjowane wartością domyślną, natomiast zmienne nie są domyślnie inicjowane.
  187.  
  188. 2. C# - Ciekawe operatory
  189.  
  190. is
  191. ● Operator sprawdzenia czy dana zmienna jest jakiegoś typu, czy dziedziczy po typie lub czy implementuje interfejs.
  192. ● Przykład:
  193. var x = "aaa";
  194. if(x is Object) ... // zwróci true
  195.  
  196. as
  197. ● Umożliwia niektóre rzutowanie (tylko typów nulllowalnych (np. string, object), czyli typy proste i struktury odpadają).
  198. ● W przeciwieństwie do jawnego rzutowania, w przypadku nieudanego rzutowania nie rzuci wyjątkiem a zwróci null.
  199. ● Przykład:
  200. var zmienna = zmienna2 as SuperKlasa;
  201.  
  202. typeof
  203. ● Zwraca obiekt klasy Type dla danego typu / klasy. Za jego pomocą można sprawdzić czy zmienna jest dokładnie jakiegoś typu.
  204. ● Przykład:
  205. var i = 1;
  206. if(i.getType() == typeof(int)) // zwróci true
  207.  
  208. Operator ?
  209. ● Znany wszystkim operator warunkowy.
  210. ● Przykład:
  211. var x = y > 10 ? "Wieksze":"Mniejsze";
  212.  
  213. Operator ??
  214. ● Operator sprawdzenia nulla. Bierze kolejną zmienną, jeśli poprzedzająca operator jest nullem .
  215. ● Przykład
  216. var x = y ?? z;
  217. // x=y gdy y nie jest nullem, x=z gdy y jest nullem
  218.  
  219. 3. C# - Niesamowite sztuczki
  220.  
  221. extern alias
  222. ● Gdy mamy dołączone dwie .dll’ki z identycznymi klasami występuje konflikt. Można go rozwiązać wyrzucając te klasy poza globalny namespace
  223. ● Przykładowo zarówno w Costam1 jak i Costam2 jest klasa KlasaA (gdzie Costam1 i Costam2 to nazwy .dll)
  224. extern alias Costam1;
  225. extern alias Costam2;
  226. Wymagane będzie wtedy użycie Costam1::KlasaA oraz Costam2::KlasaA
  227.  
  228. decimal vs double
  229. ● double używa reprezentacji binarnej o podstawie 2 - nie nadaje się do przechowywania wartości, które istnieją w systemie dziesiętnym
  230. ● decimal używa reprezentacji dziesiętnej (o podstawie 10) i jest to dedykowany typ do "trzymania" pieniędzy
  231. ● przez to że double przechowuje jedynie wartość przybliżoną liczb dziesiętnych, mogą narastać błędy
  232.  
  233. leniwa inicjalizacja (Lazy<T>)
  234. ● Inicjalizacja obiektu w momencie jego pierwszego użycia (wywołania Value)
  235. ● Jeżeli nie odwołamy się do obiektu, pozostanie niezainicjalizowany
  236. ● Przykład:
  237.  
  238. var x = new Lazy<Czlowiek>( () => new Czlowiek() ); // nie inicjalizuje się tutaj
  239. x.isValueCreated(); // zwróci false
  240. var y = x.Value; // inicjalizacja
  241.  
  242. nullable
  243. ● Typy niereferencyjne możemy rozszerzyć o wartość null
  244. ● To wcale nie znaczy, że staną się referencyjne!
  245. ● Dwa sposoby użycia:
  246. int? zmienna;
  247. Nullable<int> zmienna;
  248.  
  249. verbatim strings
  250. ● Operator @ wyłącza formatowanie stringa, tj. ignoruje sekwencje kontrolne
  251. ● Przykładowo dla var x = @"abc \t abc"; nie zostanie wstawiony tabulator, pozostanie tekst \t
  252.  
  253. global
  254. ● global przed nazwą typu wskazuje, że ma być on najpierw szukany w przestrzeni globalnej a nie lokalnej. Przydaje się gdy zmienna lokalna ma taką samą nazwę jak jakiś typ/klasa (nie powinniśmy do tego doprowadzić generalnie, ale może się zdarzyć).
  255. ● Przykład:
  256.  
  257. var Console = 7;
  258. global::System.Console.Write("abc"); // użyte Console z .NETa
  259.  
  260. checked/unchecked
  261. ● Sprawdzanie (lub nie) overflowa przy operacjach arytmetycznych.
  262. ● Domyślnie wszystko jest unchecked
  263. ● Przykładowe użycie checked:
  264. checked {
  265. var i = 1;
  266. while(1) i++;
  267. }
  268. W powyższym przypadku gdy wystąpi overflow, rzucony będzie wyjątek
  269. ● unchecked służy do wyłączenia sprawdzania overflow w obszarach gdzie włączyliśmy checked (np. gdy chcemy żeby coś wyjątkowo nie było sprawdzane)
  270.  
  271. Przykład 1:
  272. ● var a = 0;
  273. var b = 0;
  274. var c = 0;
  275. while(true)
  276. c++;
  277. checked {
  278. while(true)
  279. a++;
  280. while(true)
  281. unchecked { b++; }
  282. }
  283. ● a się przekręci i poleci wyjątek
  284. ● b/c się przekręci i użytkownik nie będzie o tym wiedział - będzie dalej inkrementowana wartość, zaczynając od minimalnej wartości int (ok -2,147 miliarda)
  285.  
  286. Przykład 2:
  287. ● var a = 2000000000;
  288. a += 2000000000;
  289. ● Ile wyniesie a? Odpowiedź: do przekręcenia brakuje 147 mln. Po przekręceniu zaczyna od -2,147mld czyli wartość to -2,147mld + 2mld - 0,147mld = -0,294mld = -294000000
  290.  
  291. Zadanie 2 z egzaminu
  292. Czym się różni p1 od p2:
  293. int a = 200000;
  294. a = a + 200000; (p1)
  295. a = checked (a + 20000); (p2)
  296. Odpowiedź:
  297. Checked oznacza, że są sprawdzane przepełnienia/niedopełnienia w trakcie operacji arytmetycznych. Jeżeli takie przepełnienie nastąpi to rzucany jest odpowiednio bodajże wyjątek ArithmeticUnderflow/OverflowException. 200 000 + 200 000 to za mało, żeby przepełnić inta (który ma 32 bity) więc w tym konkretnym przypadku nie ma żadnej różnicy.
  298. Domyślnie (tj. bez napisanego jawnie checked) przepełnienia nie są sprawdzane (chyba że włączy się je globalnie w opcjach kompilatora).
  299.  
  300. Zadanie 2 z egzaminu "sprzed 2 lat"
  301. Czym się różni p1 od p2:
  302. int a = 1 000 000 000;
  303. a = a + 1 000 000 000; //(p1)
  304. a = checked (a + 1 000 000 000); //(p2)
  305. Odpowiedź:
  306. Opis tak samo jak w poprzednim, tu sie też nie zdąży przekręcić, int.MaxVal to ponad dwa miliardy
  307.  
  308. unsafe
  309. ● włączenie kodu niezarządzanego
  310. ● słowo to może stać zarówno przed nazwą funkcji jak i być oddzielnym blokiem
  311. ● w kodzie niezarządzanym możemy używać wskaźników
  312. ● Uwaga @MB: dodatkowo można używac stackalloc
  313.  
  314. yield
  315. ● Służy do tworzenia ‘leniwych’ kolekcji
  316. ● Dobry w przypadku tworzenia tablicy, w której tylko parę elementów jest potrzebne
  317. ● Przykład:
  318.  
  319. public IEnumerable<int> GetInts(int nNumberOfElements)
  320. {
  321. for (int nNumber = 0; nNumber < nNumberOfElements; ++nNumber)
  322. {
  323. yield return nNumber;
  324. }
  325. }
  326. ● Uwaga @MB: konstrukcja yield break kończy tworzenie kolekcji
  327.  
  328. indexer
  329. ● W C# nie można przeciążyć operatora [ ], ale da się zrobić indexer który działa tak samo.
  330. ● Indeksem może być dowolny typ
  331. ● Przykład (indeksem jest int, użycie [ ] zwraca string )
  332.  
  333. class SuperLista {
  334. private List<string> lista;
  335. public string this[int i]{
  336. get { return lista[i]; }
  337. set { lista[i] = value; }
  338. }
  339. }
  340.  
  341. Użycie:
  342. var x = new SuperLista();
  343. x[3] = "abcd";
  344.  
  345. delegate
  346. ● wywodzą się ze wskaźników na funkcje
  347. ● pozwalają do siebie przypisać funkcje
  348. ● dbają o to, by programista przypisał funkcję zwracającą odpowiedni typ i mającą odpowiednie parametry
  349. ● Przykład:
  350. delegate int Obliczenia(int x, int y);
  351. Obliczenia suma = new Obliczenia(Suma); // Suma to jakaś funkcja przyjmującą 2 parametry typu int, zwracająca int
  352. ● Do delegate można podpiąć więcej niż jedną funkcję (np. za pomocą operatora +). Wykonają się wtedy wszystkie ALE wartość zwracana będzie tylko z ostatniej zwracającej
  353. o Uwaga @MB: przypisywanie wielu funkcji robi się przez +=
  354.  
  355. delegaty vs interfejsy
  356. ● Jeśli mamy w interfejsie jakąś metodę, to można (w jednej chwili) ją implementować tylko raz (w klasie implementującej interfejs)
  357. ● Delegaty używamy, gdy klasa potrzebuje więcej niż jednej implementacji. Pod delegaty możemy podpinać różne metody (nawet kilka naraz) w zależności od tego co potrzebujemy
  358. ● Używanie delegat na pewno jest bardziej elastyczne, gdyż możemy delegować do różnych metod, zależnie od tego do czego odwołuje się delegata
  359. ● Użycie interfejsu jest bardziej czytelne - wiemy co to za metoda i gdzie jest zaimplementowana
  360.  
  361. Zadanie 7 z egzaminu "sprzed 2 lat"
  362. Napisz w jakich sytuacjach warto stosować interfejsy a nie delegacje.
  363. Odpowiedź:
  364. Use a delegate when:
  365. - An eventing design pattern is used.
  366. - The caller has no need access other properties, methods, or interfaces on the object implementing the method.
  367. - Easy composition is desired.
  368. - A class may need more than one implementation of the method.
  369. Use an interface when:
  370. - There are a group of related methods that may be called.
  371. - A class only needs one implementation of the method.
  372. - The class using the interface will want to cast that interface to other interface or class types.
  373. - The method being implemented is linked to the type or identity of the class: for example, comparison methods.
  374.  
  375. rzutowanie
  376. ● automatyczne (niejawne) - po prostu przypisujemy zmienną danego typu do innego
  377. o Może być rozszerzające lub zawężające (kompilator wywali błąd)
  378. ● wymuszone (jawne) np. int x = (int) y;
  379. o Należy uważać na błędne wartości!
  380.  
  381. Zadanie 1 z egzaminu
  382. Czy kod jest poprawny:
  383. Przykład 1:
  384. double x, y;
  385. x = y;
  386. Odpowiedź:
  387. Nie, bo nie ma zadeklarowanej wartości, ścilej dlatego, że y jest niezdefiniowane.
  388.  
  389. Przykład 2:
  390. double x = 1.5;
  391. int y = 15;
  392. x = y;
  393. Odpowiedź:
  394. Przykład jest poprawny, chociaż to podchwytliwe, bo nie ma jawnego rzutowania! Promocja typów w górę odbywa się niejawnie (np float -> double, short -> long etc.).
  395.  
  396. Zadanie 1 z egzaminu "sprzed 2 lat"
  397. Czy poniższy fragment kodu jest poprawny, jeśli nie to napisz dlaczego.
  398. Przykład 1
  399. double x, y = 1.5;
  400. x = y;
  401. Odpowiedź:
  402. tak
  403.  
  404. Przykład 2
  405. int x;
  406. double y = 1.5;
  407. x = y;
  408. Odpowiedź:
  409. Nie. rzutowanie double -> int może prowadzić do utraty danych i musi być wykonane jawnie
  410.  
  411. enum
  412. ● Domyślnie dziedziczą po int, ale mogą też po byte (mają wtedy tylko 2 wartości)
  413. ● Przykład:
  414.  
  415. public class EnumTest
  416. {
  417. enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
  418.  
  419. static void Main()
  420. {
  421. int x = (int)Days.Sun;
  422. int y = (int)Days.Fri;
  423. Console.WriteLine("Sun = {0}", x);
  424. Console.WriteLine("Fri = {0}", y);
  425. }
  426. }
  427. /* Output:
  428. Sun = 0
  429. Fri = 5
  430. */
  431.  
  432. 4. C# - Modyfikatory dostępności
  433.  
  434. public
  435. ● dostępny wszędzie
  436. ● Elementy interfejsu czy typów wyliczeniowych są domyślnie traktowane jako publiczne, nie ma możliwości nadania modyfikatorów dla elementów tych typów.
  437.  
  438. private
  439. ● dostępne tylko w ramach klasy
  440. ● Domyślnie wszystkie elementy danej klasy czy struktury są traktowane jako elementy prywatne, jeśli nie określimy modyfikatora dostępu.
  441.  
  442. protected
  443. ● dla pól - dostępne w klasach dziedziczących
  444.  
  445. internal
  446. ● dostępne w pakiecie (podzespole)
  447. ● klasy są domyślnie internal
  448.  
  449. protected internal
  450. ● dostępne dla klas dziedziczących w pakiecie
  451.  
  452. Zagnieżdżanie klas
  453. Czy możemy w C# zagnieżdżać klasy? Jeśli tak, co to daje gdy klasa wewnętrzna będzie public?
  454. ● Tak, można
  455. ● Jeśli public, to klasa będzie ogólnodostępna, ale tylko za pośrednictwem klasy ‘rodzica’
  456. np. KlasaWew jest zagniedżczona w KlasaZew, więc żeby się dostać do KlasaWew, musimy napisać KlasaZew.KlasaWew
  457. ● Domyślnie zagnieżdżone typy są prywatne
  458.  
  459. Zadanie 5 z egzaminu "sprzed 2 lat"
  460. Klasa X została zdefiniowana wewnątrz definicji klasy Y. Czy takie definiowanie klas jest dopuszczalne, jeśli uważasz, że tak, to napisz jaki będzie skutek poprzedzenia definicji klasy X słowem private.
  461. Odpowiedź:
  462. Tak, jest dopuszczalne. Jeśli X zostanie oznaczone modyfikatorem private to będzie widoczne tylko wewnątrz klasy Y.
  463.  
  464. 5 - WPF, czyli to, co tygryski lubią najbardziej
  465. Podstawy WPF: http://www.tutorialspoint.com/wpf/index.htm
  466.  
  467. Dynamiczne wartości właściwości
  468. ● Specjalna składnia umożliwia nadawanie wartości dynamicznych przez wiązanie jej z wartościami właściwości klas
  469. Przykład:
  470. <Label … Background="{ x : Static SystemColors.HighlightColor }" />
  471.  
  472. Właściwości powiązane - Attached Properties
  473. ● właściwości zdefiniowane w jednym z komponentów, ale zdefiniowane w innej klasie
  474. ● używanie poprzez: TypDefniniujący.NazwaWłaściwości
  475. ● <Label Name="label1" ... Grid.Row="0" Grid.Column="0"/>
  476. ● są one przekształcane w wywołania metod TypDefiniujący.SetNazwaWłaściwości np. Grid.SetColumn(label1, 1);
  477.  
  478. Behavior
  479. ● Zachowania pozwalają na ponowne użycie kodu związanego z interfejsem użytkownika
  480. ● Nie są częścią WPF-a – zostały zdefiniowane w Expression Blend
  481.  
  482. Binding
  483. ● Jest to związek, który mówi, skąd dane powinny zostać pobrane (obiekt źródłowy), aby ustawić właściwość w obiekcie docelowym
  484. ● właściwość docelowa jest zawsze dependency property
  485. ● Przykład:
  486.  
  487. XAML:
  488. < TextBox Name="ScaleText" Text="Binding ElementName=ScaleSlider, Path=Value}" />
  489. < Slider Name="ScaleSlider" … Value="1" />
  490.  
  491. C#:
  492. Binding binding = new Binding();
  493. binding.Source = ScaleSlider;
  494. binding.Path = new PropertyPath("Value");
  495. binding.Mode = bindingMode.TwoWay;
  496. ScaleText.SetBinding(TextBox.TextProperty, binding);
  497.  
  498. ● najprostszym zastosowaniem jest wiązanie dwóch takich właściwości
  499. ● realizacja wiązania poprzez klasę Binding z pakietu System.Windows.Data
  500. ● niepoprawne wiązanie nie generuje wyjątków
  501. o Uwaga: ręczne ustawienie wartości w kodzie powoduje zerwanie wiązania
  502. ● BindingMode
  503. ● OneWay - jednostronne od źródła do celu
  504. ● TwoWay - dwustronne
  505. ● OneTime – jednorazowe – w celu inicjalizacji
  506. ● OneWayToSource – jednostronne od celu do źródła
  507. ● Default - domyślne – zależne od właściwości
  508. ● W skrócie: robisz zmianę na zmiennej to w efekcie zmienia się właściowość obiektu i/lub/ewentualnie robisz zmianę na właściwości obiektu to zmienia się zmienna
  509.  
  510. Jak wygląda binding?
  511. ● Content = "{Binding JakasWlasciwosc, Mode=OneWay}"
  512. ● Content = "{Binding JakasWlasciwosc, ElementName=WybranyElement}"
  513. ● OnClick = "{Binding JakasMetoda}"
  514. ● Visiblity = "{Binding CzyWidoczny, Converter={StaticResource BoolToVisiblityConverter}}"
  515. o Uwaga @MB: żeby to dobrze działało to klasa, do której się binduje, powinna implementować interfejs INotifyPropertyChanged.
  516.  
  517. Rodzaje bindingów
  518. ● OneWay - od źródła do celu
  519. ● TwoWay - także od celu do źródła
  520. ● OneTime - aktualizowana tylko raz ze źródła
  521. ● OneWayToSource - od celu do źródła
  522. ● Default - domyślny tryb
  523. ○ Uwaga @MB: Rodzaj bindingów domyślny oznacza, że różne property mają różnie ustawiony domyślny podobnie jak UpdateSourceTrigger
  524.  
  525. Co nam daje UpdateSourceTrigger przy bindingu?
  526. ● pozwala określić, kiedy podbindowana właściwość jest aktualizowana
  527. ● Rodzaje:
  528. o PropertyChanged - natychmiastowa aktualizacji
  529. o LostFocus - kiedy kontrolka straci focus
  530. o Explicit - tylko ręcznie poprzez BindingExpression.UpdateSource
  531. o Default - domyślnie, zależnie od komponentu
  532. ● Przykład:
  533.  
  534. Binding.UpdateSourceTrigger(PropertyChanged, LostFocus, Explicit, Default);
  535.  
  536. Usuwanie wiązania
  537. BindingOperations.ClearBinding(ScaleSlider, Slider.ValueProperty);
  538.  
  539. DependencyProperty
  540. ● DependencyProperty jest to właściwość z dodatkowymi możliwościami.
  541. ● Jest wykorzystywany w animacji elementów interfejsu, wiązaniu danych oraz obsłudze styli. Ponadto umożliwiają change notification, dziedziczenie i zmniejszają koszta przechowywania wartości.
  542. ● Może być dziedziczona w hierarchii - wystarczy, by każdy z elementów miał zdefiniowany taki DependencyProperty i włączone było dziedziczenie DependencyProperty. Trzeba też dodać właścicieli dla tego Property.
  543. o Uwaga: można dodać tylko do obiektów dziedziczących po DependencyObject. Każde DP należy zarejestrować przed jakimkolwiek użyciem klasy, dla której go definiujemy.
  544. o Uwaga: DependencyProperty jest zawsze static readonly, np. Public static readonly DependencyProperty AquariumGraphicProperty
  545. o Uwaga: właściwości tego typu mogą być współdzielone, np.: TextBlock.FontFamilyProperty = TextElement.FontFamilyProperty.AddOwner(typeof(TextBlock));
  546. ● Przykładowy wrapper właściwości:
  547.  
  548. Public Uri AquariumGraphic
  549. {
  550. get {return (Uri) GetValue(AquariumGraphicProperty);}
  551. set {SetValue(AquariumGraphicProperty, value);}
  552. }
  553.  
  554. ● Można ustawić wiele rzeczy, przekazując obiekt Metadata do tego DP. M.in. czy ten DP wpływa na przerysowywanie formatki, albo czy wpływa na zmianę jej wielkości.
  555. ● W Metadata można ustalić domyślną wartość dla tego DP, przez co możemy oszczędzić pamięć gdy chcemy zdefiniować ten property dla wielu elementów będących w jednej hierarchii - wystarczy dziedziczyć to DP i wtedy dla wszystkich elementów będzie ustawiona ta domyślna wartość
  556. ● Możemy dodać walidację do ustawiania wartości tego Property (walidacja jednak nie następuje w getterach i setterach)
  557. o Uwaga: domyślnie WPF ignoruje wyjątki związane z ustawianiem Binding.ValidationRules.ExceptionValidationRule
  558. ● Zwykłe Property w przeciwieństwie do DP, przechowuje wartość po prostu w pamięci i możemy ją modyfikować tylko bezpośrednio (nie przez binding)
  559.  
  560. Change notification
  561. ● Uruchamia metodę OnPropertyChangeCallback(), która przekazuje informację o zmianie wartości do serwisów wiązania danych i triggerów
  562. ● Chcąc zatem reagować na zmianę wartości, można albo napisać trigger, albo utworzyć wiązanie
  563.  
  564. Metody w DependencyProperty (ustalamy je w Metadata) - są wywoływane w takiej kolejności przy zmianie wartości jakiegoś DependencyProperty
  565. ● CoerceValueCallback - wywoływana jako pierwsza gdy następuje zmodyfikowanie wartości DP. Możemy tam przypisać tą wartość lub ewentualnie jej nie zaakceptować (zwrócić DependencyProperty.UnsetValue)
  566. ● ValidateValueCallback - walidacja wartości przypisanej do DP. Możemy zwrócić tam true albo false.
  567. ● PropertyChangedCallback - wywoływana po wszystkim, jak wartość zostanie zmodyfikowana. Możemy tam wrzucić wszystko co ma się stać po zmianie wartości DP.
  568.  
  569. Wiązanie typu Source
  570. C#:
  571. public static double DefaultScale {get; set;}
  572. static MainWindow()
  573. {
  574. DefaultScale = 1.0;
  575. }
  576. XAML:
  577. Value = {Binding Source={x : Static local : MainWindow.DefaultScale}, Mode=OneWay}
  578.  
  579. Wiązanie typu RelativeSource
  580. XAML:
  581. <TextBlock Text={Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=Title} />
  582. ● Typy: Self, FindAncestor, PreviousData, TemplatedParent
  583.  
  584. Wiązanie typu DataContext
  585. ● Kontekst, z którego następuje bindowanie. Trzeba go najpierw wskazać - np. przypisać w konstruktorze klasy, która jest formatką
  586. ● Dane są wyszukiwane w hierarchii komponentów do czasu napotkania właściwości DataContext różnej od null
  587. ● Przykład wiązania typu DataContext
  588.  
  589. <Window.Resources>
  590. <local:Person x:Key="JurekPerson" Name="Jurek Owciak" Age="44"/>
  591. </Window.Resources>
  592.  
  593. Normalne:
  594. <StackPanel>
  595. <TextBlock Text="{Binding Source={StaticResource JurekPerson},Path=Name}"/>
  596. <TextBlock Text="{Binding Source={StaticResource JurekPerson},Path=Age}"/>
  597. </StackPanel>
  598.  
  599. DataContext:
  600. <StackPanel DataContext="{Binding Source={StaticResource JurekPerson}}">
  601. <TextBlock Text="{Binding Path=Name}"/>
  602. <TextBlock Text="{Binding Age}"/>
  603. </StackPanel>
  604.  
  605. ItemsSource
  606. ● W przypadku wszystkich elementów w WPF, które moją zawierać wiele danych (np. wierszy), jest to źródło danych, z którego elementy będą pobierane
  607.  
  608. Co daje zastosowanie ObservableList/ObservableCollection jako źródła danych dla ListBoxa?
  609. ● ListBox, czyli formatka z listą, musi być podbindowana do jakiejś kolekcji. Jeśli będzie to kolekcja typu ObservableList, ListBox będzie dostawał informacje o wszelkich zmianach na tej liście i sam będzie się aktualizował
  610.  
  611. Layout - Grid, DockPanel, Canvas, StackPanel, WrapPanel
  612. Rozmieszczenie elementów w:
  613. ● Gridzie (Grid Panel) - określone jest przez atrybuty Column i Row. Musimy najpierw mieć definicje kolumn i wierszy (Grid.ColumnDefinitions i Grid.RowDefinitions), żeby wiadomo było ile ich jest, jaką mają wielkość itd., przykład XAML.:
  614.  
  615. <Grid>
  616. <Grid.RowDefinitions>
  617. <RowDefinition />
  618. <RowDefinition Height="Auto" />
  619.  
  620. ● Grid ponadto oferuje Grid.ColumnSpan do łączenia kolumn (np. <Button Grid.Row="1" Grid.ColumnSpan="2">Button 3</Button>) oraz GridSplitter do tworzenia odstępów (np. <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" /> )
  621. ● DockPanelu (Dock Panel) - Pozwala on na umieszczenie elementów, w czterech różnych kierunkach naszego panelu - wzdłuż jednej z czterech krawędzi.
  622. ● Canvasie (Canvas Panel) - Tutaj możliwe jest relatywne określenie położenia - za pomocą czterech atrybutów: Top, Bottom, Left, Right, czyli jak daleko od poszczególnych krawędzi Canvasa ma być element. Rozmieszczenie warstw określamy za pomocą atrybutu Zindex.
  623. ● StackPanelu (Stack Panel) - umieszcza elementy pionowo, jeden pod drugim. Może też istnieć w orientacji poziomej, wtedy umieszcza od lewej do prawej obok siebie. Wystarczy zmienić atrybut Orientation (Stack Panel to podobnie, jakbyśmy w kontenerze HTML ustawili wszystkim dzieciom właściwość CSS display: block)
  624. ● WrapPanelu (Wrap Panel) - Umieszcza elementy obok siebie, a jak się nie mieszczą to przerzuca do kolejnej linijki. Bardzo przydatny, gdy chcemy obsługiwać różne rozmiary okien - elementy wtedy same będą się układać tak, żeby się zmieścić (podobnie, jakbyśmy w kontenerze HTML ustawili wszystkim dzieciom właściwość CSS display: inline-block).
  625.  
  626. Zdarzenia - RoutedEvent a Event
  627. ● RoutedEvent, gdy zostanie wywołany, najpierw jest obsługiwany w elemencie, na którym jest ustawiony, a później podróżuje po drzewie wizualnym w górę aż do korzenia. Można to odwrócić, żeby najpierw był obsługiwany w korzeniu, a na końcu w naszym elemencie.
  628. ● Zwykły Event wywołany zostanie tylko w elemencie źródłowym
  629. ● Typy zdarzeń:
  630. o Direct Event np. Click,
  631. o Bubbling Event (od liści do korzenia) np. MouseDown (w górę hierarchii),
  632. o Tunnel Event (od korzenia do liści) np. PreviewMouseDown (w dół hierarchii)
  633. ● Rodzaje zdarzeń:
  634. o zdarzenia cyklu życia (Initialized, Loaded, Unloaded)
  635. o wejściowe
  636. ▪ okna (SourceInitialized, ContentRendered, Activated, Deactivated, Closing, Closed)
  637. ▪ klawiatury (PreviewKeyDown, KeyDown, PreviewTextInput, TextInput, PreviewKeyUp, KeyUp, KeyPressed)
  638. ▪ KeyEventArgs zawiera m.in KeyCode, KeyData, Shift, Alt, Control, Modifiers, Handled, Key, IsDown, IsUp, IsRepeat, IsToggled, KeyStates
  639. ▪ myszy (MouseEnter, MouseLeave, MouseMove, Mouse(Left|Right)Button(Down|Up), MouseWheel, MouseDoubleClick, Click)
  640. ▪ MouseEventArgs zawiera m.in. Button, Clicks, Delta, X, Y
  641. ▪ MouseButtonEventArgs zawiera m.in. ButtonState, ClickCount, ChangedButton, LeftButton
  642. ▪ Uwaga: aby otrzymywać zdarzenia myszy, należy zmienić właściwość Background z null na transparent
  643. Przykład
  644. XAML:
  645. <Button … Click="button1_Click" />
  646. C#:
  647. private void button1_Click(object sender, RoutedEventArgs e)
  648. {
  649. MessageBox.Show("Ala ma kota");
  650. }
  651.  
  652. Obsługa zdarzeń
  653. Przykłady C#:
  654. button1.Click += new RoutedEventHandler(button1_Click);
  655. button1.Click += button1_Click;
  656. button1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(button1_Click));
  657.  
  658. RoutedEventArgs
  659. private void MouseDownHandler(object sender, RoutedEventArgs rea)
  660. {
  661. string message = "Nadawca: " + sender.ToString() + "\t źródło: " + rea.Source;
  662. listBox.Items.Add(message);
  663. }
  664.  
  665. Definiowanie zdarzeń
  666. private static readonly RoutedEvent MyEvent;
  667.  
  668. MyEvent = EventManager.RegisterRoutedEvent("MyEvent",
  669. RoutingStrategy.Bubble,
  670. typeof(RoutedEventHandler),
  671. typeof(MainWindow));
  672.  
  673. Współdzielenie pomiędzy klasami
  674. MyEvent = Mouse.MouseDownEvent.AddOwner(typeof((MainWindow));
  675.  
  676. Wywołanie zdarzenia
  677. RoutedEventArgs rea = new RoutedEventArgs(Mouse.MouseDownEvent, this);
  678. base.RaiseEvent(rea); // wywołanie zdarzenia tylko dla metod zarejestrowanych metodą AddHandler()
  679.  
  680. Elementy kontrolne
  681. ● rodzaje:
  682. ○ Content
  683. ○ Headered Content
  684. ○ Text
  685. ○ List
  686. ○ Range-Based
  687. ○ Date
  688. ● Control class
  689. ○ kolory, czcionki, kursor
  690. ● ContentControl class
  691.  
  692. Konwersja
  693. ● … {Binding …, StringFormat=Data:{0:yyyy-MMMM-dd} … } …
  694. ● konwertery Converter={StaticResource ColorConverter}
  695.  
  696. Style
  697. Wiązanie stylu z typem i dziedziczenie styli
  698. <Style x:Key="YellowBackground">
  699. <Setter Property="Button.Background">
  700. <Setter.Value>
  701. <SolidColorBrush Color="Yellow">
  702. </SolidColorBrush>
  703. </Setter.Value>
  704. </Setter>
  705. <Setter Property="Button.FontSize" Value="30" />
  706. </Style>
  707.  
  708. <Style x:Key="YBwithBold" TargetType="Button" BasedOn="{StaticResource YellowBackground}">
  709. <Setter Property="Control.FontWeight" Value="Bold"/>
  710. </Style>
  711.  
  712. Zastosowanie stylu dla wszystkich elementów danej klasy
  713. <Style TargetType="Button" BasedOn="{StaticResource YellowBackground}">
  714. <Setter Property="Control.FontWeight" Value="Bold"/>
  715. </Style>
  716.  
  717. Co jest równoznaczne z takim zapisem:
  718. <Style x:Key="{x:Type Button}" BasedOn="{StaticResource YellowBackground}">
  719. <Setter Property="Control.FontWeight" Value="Bold"/>
  720. </Style>
  721.  
  722. Konwertery
  723. ● Pozwalają przy bindowaniu zmienić jeden typ na drugi
  724.  
  725. Drag & Drop
  726. http://patryknet.blogspot.com/2013/01/70-511-rozdzia-10-drag-drop.html Drag&Drop in 6 Steps
  727. ● Detect a drag as a combination of MouseMove and MouseLeftButtonDown
  728. ● Find the data you want to drag and create a DataObject that contains the format, the data and the allowed effects.
  729. ● Initiate the dragging by calling DoDragDrop()
  730. ● Set the AllowDrop property to True on the elements you want to allow dropping.
  731. ● Register a handler to the DragEnter event to detect a dragging over the drop location. Check the format and the data by calling GetDataPresent() on the event args. If the data can be dropped, set the Effect property on the event args to display the appropriate mouse cursor.
  732. ● When the user releases the mouse button the DragDrop event is called. Get the data by calling the GetData() method on the Data object provided in the event args.
  733. ● ...and that's all the magic.
  734.  
  735. DataTemplate
  736. ● Pozwalają tworzyć szablony, np dla elementów list, tabel
  737.  
  738. Resource
  739. ● Zasoby pakietów (ang. Assembly Resources)
  740. ● Zasoby te są osadzane w skompilowanym pakiecie (bibliotece dll lub pliku exe) jako dane binarne.
  741. ● np obrazki etc.
  742. ● <Image Name="img" Source="Images/bitmap.jpg"/>
  743. ● Zasoby WPF
  744. ● Zasoby WPF są to obiekty .NET zdefiniowane w jednym miejscu, a wykorzystywane w wielu miejscach.
  745. ● Zasoby statyczne pobierają obiekt z kolekcji zasobów tylko raz.
  746. ● Zasoby dynamiczne pobierają obiekt z kolekcji za każdym razem gdy jest to potrzebne.
  747.  
  748. 6. ADO.NET
  749. Entity Framework ADO.NET jest narzędziem typu ORM (Object Relational Mapping), pozwalającym odwzorować relacyjną bazę danych za pomocą architektury obiektowej.
  750. ● DataSet - pełni rolę bazy danych w pamięci. Możemy mieć DataSety pochodzące z różnych źródeł danych. Zawiera kompletny zestaw danych - tabele i powiązania między nimi.
  751. ● DataTable - zawierają dane i opisujące je szablony. Tabele mają kolumny i wiersze oraz klucz główny.
  752. ● DataRelation - definiuje relacje między tabelami z DataSet.
  753. ● DataColumn - reprezentacja pojedynczej kolumny tabeli danych DataTable. Kolumny można dodawać wywołując metodę Add na kolekcji Columns w DataTable.
  754. ● DataRow - wiersz tabeli danych DataTable, można go dodawać metodą Add na kolekcji Rows w DataTable.
  755.  
  756. Zadanie 10 z egzaminu "sprzed 2 lat"
  757. Jaką rolę w technologii ADO.NET pełni klasa DataSet?
  758. Odpowiedź:
  759. DataSet to taki "pojemnik" na dane wyciągnięte z bazy. Symbolizuje całą bazę, zawiera elementy typu DataTable, które są odpowiednikami tabel w bazie. Nie wie jakie są typy danych, które zawiera i trzeba samemu tego pilnować.
  760.  
  761. Modele ADO.NET
  762. ● bezpołączeniowy - wykorzystuje obiekt DataSet jako pamięć podręczną. Obiekt DataAdapter służy jako pośrednik pomiędzy obiektem DataSet a źródłem danych, z którego pochodzą dane w pamięci. DataAdapter sam decyduje o tym, kiedy połączenie ma być otwarte albo zamknięte. Skoro dane są przechowywane w pamięci podręcznej, to połączenie nie musi być cały czas aktywne.
  763. ● połączeniowy - Wszelkie polecenia wykonują się bezpośrednio na źródle danych. Połączenie musi cały czas być aktywne. W tym trybie korzystamy głównie z klas Command oraz DataReader.
  764.  
  765. 7. Operacje równoległe
  766.  
  767. Parallel.For
  768. Dzięki temu można łatwo zrównoleglić obliczenia.
  769. Przykład:
  770.  
  771. Parallel.For(0, n, i =>
  772. {
  773. Console.WriteLine(i);
  774. });
  775.  
  776. Kolejno argumentami są:
  777. początkowy indeks, ilość iteracji, lambda przyjmująca argument i - czyli aktualny numer iteracji.
  778.  
  779. Parallel.ForEach
  780. Można łatwo zrównoleglić obliczenia na kolekcji.
  781. Przykład:
  782.  
  783. Parallel.ForEach(listaElementów, aktualnyElement =>
  784. {
  785. Console.Write(aktualnyElement.toString());
  786. });
  787.  
  788. Iterujemy po listaElementów i mamy labdę przyjmującą aktualnyElement - możemy z nim coś zrobić.
  789.  
  790. Zadanie 6 z egzaminu "sprzed 2 lat"
  791. Do czego służy funkcja Parallel.ForEach.
  792. Odpowiedź:
  793. Normalne ForEach wykonuje operacje na kolekcji sekwencyjnie. Parallel.ForEach robi to równolegle. To takie #pragma omp for schedule(dynamic, 1) - tak najprościej wyjaśnić. Liczba wątków jest ustalana przez środowisko uruchomieniowe, można chyba też samemu wybrać, ale nie pamiętam dokładnie.
  794.  
  795. 8. Synchronizacja zasobów
  796. ● Klasa Interlocked - pozwala na współbieżny dostęp do zmiennych typu long i int. Żeby taką zmienną zwiększyć, wywołujemy Interlocked.Increment(zmienna), a żeby zmniejszyć Interlocked.Decrement(zmienna)
  797. ● Lock - Możemy łatwo zrobić sekcję krytyczną używając Lock(jakis_obiekt) - obiekt może być dowolny, byle byśmy we wszystkich miejscach, które mają działać tylko jedno naraz, użyć tego samego obiektu w każdym Lock
  798. ● Klasa Monitor - możemy wchodzić do sekcji krytycznej metodą Enter, a wychodzić Exit. Musi być założony na jakimś jednym obiekcie, podobnie jak Lock.
  799.  
  800. 9. WCF (Windows Communication Foundation)
  801. http://codeguru.geekclub.pl/baza-wiedzy/wstep-do-technologii-wcf,2186
  802.  
  803. Kontrakty
  804. Kontrakty danych i usług używane sa np. w WCF (protokół do komunikacji). Chodzi o to, by obie strony komunikujące się posiadały taki sam interfejs i struktury danych przesyłanych wiadomości, żeby móc dobrze ze sobą współpracować, przede wszystkim niezależnie.
  805. ● Kontrakty usług - ServiceContract - służą do określenia sygnatur metod, jakie mogą być wywoływane przez drugą aplikację. Sprowadza się to do nadania klasie atrybutu [ServiceContract] a metodom, które chcemy by mogły być wywoływane dajemy [OperationContract]
  806. ● Kontrakty danych - DataContract - określają wszystkie parametry, za pomocą których strony będą mogły się komunikować. Dzięki temu obie strony posługują się takim samym zestawem parametrów, więc dane można łatwo serializować i deserializować.
  807. Jak to wygląda w praktyce?
  808. Wybranej klasie dajemy atrybut [DataContract] a jego właściwościom dajemy [DataMember]. Dzięki temu WCF wie, które dane ma uwzględnić w komunikacji.
  809.  
  810. Zadanie 8 z egzaminu "sprzed 2 lat"
  811. Jak w technologii WCF można definiować parametry współpracy klienta z nosicielem (host).
  812. Odpowiedź:
  813. Podejrzewam, że chodzi o kontrakty. Tj. takie interfejsy z dodatkowymi atrybutami. WCF jest w sumie martwe ale jak ktoś chce to tu ma przykład: http://wcftutorial.net/Service-Contract.aspx
  814.  
  815. Składniki WCF
  816. ● IPC (Inter Process Communication)
  817. ● DCOM, COM+
  818. ● MSMQ
  819. ● NET. Remoting
  820. ● XML Web Services
  821.  
  822. 10. Przykładowe zadania
  823.  
  824. Egzamin
  825. Zadanie 4 z egzaminu
  826. Jakie wyrazy powinny sie pojawić w wykropkowanym miejscu, jeśli metoda ma być dziedziczona:
  827. public ... int costam() {}
  828. Odpowiedź:
  829. (virtual/override)
  830. Virtual jeżeli metoda jest przeznaczona do bycia polimorficzną. Override jeżeli przesłania metodę z klasy bazowej. Override automatycznie oznacza również virtual - tj. metodę override można przesłonić w klasie potomnej.
  831.  
  832. Zadanie 5 z egzaminu
  833. Jaka klasa biblioteczna pozwala na dostęp do plików dyskowych?
  834. Odpowiedź:
  835. FileInfo i milion innych...
  836.  
  837. Zadanie 6 z egzaminu
  838. Jaką postać plików zwraca klasa FileStream?
  839. Odpowiedź:
  840. strumień bajtów
  841.  
  842. Zadanie 7 z egzaminu
  843. Czym jest interfejs?
  844. Odpowiedź:
  845. Definicja abstrakcyjnego typu posiadającego jedynie operacje, a nie dane. Kiedy w konkretnej klasie zdefiniowane są wszystkie metody interfejsu mówimy, że klasa implementuje dany interfejs.
  846.  
  847. Zadanie 8 z egzaminu
  848. Jak zrobić, żeby radio buttony były tak ustawione, że tylko jeden można wybrać?
  849. Odpowiedź:
  850. a) radio buttony jeśli są w jednym kontenerze to zachowują się jak jedna grupa, tak więc jeżeli mamy dwa StackPanele i w nich po 4 radio buttony, to te grupy po cztery są od siebie niezależne
  851. b) Można ustawić właściwość GroupName dla danej grupy buttonów, wtedy dla tych, które mają taką samą właściwość GroupName automatycznie wybierany jest tylko jeden
  852.  
  853. Egzamin "sprzed 2 lat"
  854. Zadanie 9 z egzaminu "sprzed 2 lat"
  855. Opisz ogólnie sposób dodawania usługi Przeciągnij i Upuść (Drag & Drop)
  856. Odpowiedź:
  857. http://www.wpftutorial.net/draganddrop.html
  858.  
  859. Pytania ze strony Wojciechowskiego
  860. Zadanie 4 ze strony Wojciechowskiego
  861. Czy używając nazw argumentów należy podać je dla wszystkich używanych argumentów?
  862. Odpowiedź:
  863. Nie.
  864.  
  865. Zadanie 6 ze strony Wojciechowskiego
  866. Zdefiniować typ wyliczeniowy Fruit z następującymi elementami Apple, Pear, Banana. Jaka będzie początkowa wartość zmiennej dla następujących wartości elementów Apple = 3, Pear = 2, Banana ?
  867. Odpowiedź:
  868. 3
  869.  
  870. Zadanie 7 ze strony Wojciechowskiego
  871. Czy można dwóm elementom typu wyliczeniowego nadać tę samą wartość?
  872. Odpowiedź:
  873. Tak
  874.  
  875. Zadanie 8 ze strony Wojciechowskiego
  876. Zdefiniować strukturę Point o dwóch polach X i Y typu int oraz metodę Print(), która wyświetla wartości tych pól. Utworzyć zmienną p1 typu Point i nadać wartości 1,1 jej polom. Następnie utworzyć zmienną p2 tego samego typu w następujący sposób: Point p2 = p1;
  877. Co się stanie, jeśli struktura Point będzie miała dodatkowo pole będące obiektem jakiejś klasy?
  878. Odpowiedź:
  879. Pole będące obiektem będzie wspólne dla obu punktów.
  880.  
  881. Zadanie 9 ze strony Wojciechowskiego
  882. Czy można przekazać typ referencyjny przez wartość i referencję?
  883. Odpowiedź:
  884. Nie, typów referencyjnych nie można przekazywać przez wartość.
  885. Natomiast typy wartościowe można przekazywać przez referencję (rzutowanie na object).
  886.  
  887. Zadanie 10 ze strony Wojciechowskiego
  888. Czy obiekt dowolnej klasy może być typem Nullable?
  889. Odpowiedź:
  890. Nie, tylko typy wartościowe mogą być Nullable
  891.  
  892. Zadanie 11 ze strony Wojciechowskiego
  893. Jak zdefiniować właściwość automatyczną?
  894. Odpowiedź:
  895. MODYFIKATOR_DOSTĘPU TYP NAZWA {get; set;}
  896. np:
  897. public int Wizualny {get; set;}
  898.  
  899. Zadanie 12 ze strony Wojciechowskiego
  900. Czy właściwość może być tylko do odczytu/zapisu?
  901. Odpowiedź:
  902. Tak
  903.  
  904. Zadanie 13 ze strony Wojciechowskiego
  905. Czym są pola readonly?
  906. Odpowiedź:
  907. Są to pola, które można przypisać tylko w konstruktorze lub definicji pola. Później zachowują się jak stałe.
  908.  
  909. Zadanie 14 ze strony Wojciechowskiego
  910. Ile konstruktorów statycznych można zdefiniować? Kiedy jest on uruchamiany?
  911. Odpowiedź:
  912. Jeden. Jest uruchamiany przed pierwszym użyciem klasy. Nie jest powiedziane kiedy dokładnie.
  913.  
  914. Zadanie 15 ze strony Wojciechowskiego
  915. Co to jest i kiedy działa konstruktor domyślny?
  916. Odpowiedź:
  917. Jest to konstruktor bez parametrów. Jest generowany automatycznie jeśli nie jest jawnie stworzony. Jest wywoływany przy tworzeniu tablic.
  918.  
  919. Zadanie 16 ze strony Wojciechowskiego
  920. Jak wywołać jeden konstruktor z drugiego?
  921. Odpowiedź:
  922. przez słowo this np:
  923. public Wizualny(string tekst) {}
  924. public Wizualny() : this("xd"){}
  925.  
  926. Pytania z lab3
  927. http://www.cs.put.poznan.pl/pwojciechowski/files/Lab3.pdf
  928. login: student_pw
  929. hasło: !wiem
  930. ● Czy obiekt klasy implementująca jawnie oba interfejsy IPrintable i IPublicPrintable może wywołać metodę Print()? Czy w którejś z metod można wywołać Print() lub this.Print()?
  931. ○ Nie, nie
  932. ● Czy w przypadku gdy jeden interfejs dziedziczy po drugim, mogą oba mieć taką samą metodę?
  933. ○ Mieć mogą, ale wymaga to nadpisania przez new
  934. ● Jakie metody wymagane są przez interfejs IEnumerator?
  935. ○ MoveNext, Reset. Jest jeszcze property Current
  936. ● Jak w konstrukcji foreach wybrać z którego enumeratora chcemy skorzystać?
  937. ○ Enumerable.Select ??
  938. ● W jakim przypadku wystarczy stworzyć płytką kopię metodą this.MemberwiseClone()
  939. ○ Jeżeli klasa ma same pola wartościowe, tudzież referencyjne, które są Immutable (np. string)
  940.  
  941. Pytania z lab4
  942. http://www.cs.put.poznan.pl/pwojciechowski/files/Lab4.pdf
  943. login: student_pw
  944. hasło: !wiem
  945. ● Jak należy podać typ metody anonimowej?
  946. ○ Obojętnie, byleby pasowało do sygnatury delegata. Metoda anonimowa to taka sama jak każda inna, tylko ma nazwę generowaną niejawnie.
  947. ● W jakich przypadkach można pominąć parametry delegata w metodzie anonimowej?
  948. ○ ?
  949. ● Co się dzieje z modyfikatorem params w metodzie anonimowej?
  950. ○ Nic ?
  951. ● Czy metoda anonimowa ma dostęp do prywatnych pól klasy?
  952. ○ Tak
  953.  
  954. Egzamin 2011
  955. Zadanie 1 z egzaminu 2011
  956. Wpisz w lukę brakujący fragment kodu tak, by z przekazanych do programu parametrów program wybrał i wpisał do zmiennej vals tylko te, które kończą się na "ski".
  957. using System;
  958. using System.Collections.Generic;
  959. using System.Linq;
  960. using System.Text;
  961. namespace ConsoleApplication {
  962. class Program {
  963. static void Main(string[] args) {
  964. var vals=args.Where
  965. (...);
  966. }
  967. }
  968. }
  969. Odpowiedź
  970. (x => x.EndsWith("ski"));
  971.  
  972. Zadanie 2a z egzaminu 2011
  973. Jakie są modyfikatory dostępu w poniższym przykładzie dla klasy Car i metody Drive.
  974. class Car
  975. {
  976. void Drive(){}
  977. }
  978. Odpowiedź
  979. Dla klasy Car: INTERNAL
  980. Dla metody Drive: PRIVATE
  981.  
  982. Zadanie 2b z egzaminu 2011
  983. Dla danej klasy:
  984. namespace ConsoleApplication
  985. {
  986. class Program
  987. {
  988. internal int _var;
  989. }
  990. }
  991. Gdzie można uzyskać dostęp do pola _var?
  992. Odpowiedź
  993. wewnątrz klasy Program, w klasach pochodnych i we wszystkich klasach zawartych w tym samym assembly (pakiet) co klasa Program.
  994.  
  995. Zadanie 3 z egzaminu 2011
  996. Wypełnij brakujący warunek testujący czy obiekt kryjący się pod zmienną v implementuje interfejs IVariable.
  997. ...
  998. var v = new Variable();
  999. Odpowiedź:
  1000. if(v is IVariable){
  1001. ...
  1002.  
  1003. Zadanie 4 z egzaminu 2011
  1004. Skorzystaj z atrybutu Author z parametrami name (typu string) oraz version (typu double) do deklaracji klasy Project. Możesz założyć, że klasa Project i Author jest w tym samym namespace’ie. Implementacje klasy zastąp wielokropkiem.
  1005. Odpowiedź:
  1006. [Author(name="janusz", version=21.37)]
  1007. class Project
  1008. {...}
  1009.  
  1010. Zadanie 5 z egzaminu 2011
  1011. Jak w języku C# tworzymy właściwości (nie mylić z polami) klasy?
  1012. Odpowiedź:
  1013. MODYFIKATOR TYP NAZWA { get; set; }
  1014. np.
  1015. Public string Student { get; set; }
  1016.  
  1017. Zadanie 6 z egzaminu 2011
  1018. Jak w języku C# utworzyć zmienną typu int z możliwością wpisania do niej wartości null (podaj przynajmniej jeden z dwóch możliwych sposobów)? Do czego służy operator ?? (operator dwa znaki zapytania)?
  1019. Odpowiedź:
  1020. sposób 1: int? zmienna;
  1021. sposób 2: Nullable<int> zmienna;
  1022. Operator ?? służy do przypisywania wartości domyślnej obiektom, jeśli są null, np.:
  1023. var jaguar = zwierzak ?? new Zwierze();
  1024. jeżeli zwierzak jest nullem to pod jaguar jest wstawione nowe Zwierze, jeżeli nie to wstawiany jest istniejący zwierzak
  1025.  
  1026. Zadanie 7 z egzaminu 2011
  1027. Zaimplementuj metode Inc2, która dla obiektów typu int przyjmuje wartośc o 2 większą.
  1028. Odpowiedź:
  1029. int Inc2(int xd) { return xd + 2; }
  1030.  
  1031. Zadanie 8 z egzaminu 2011
  1032. public class Shape
  1033. {
  1034. public Shape() { Console.WriteLine("S1"); }
  1035. public Shape(string s)
  1036. {
  1037. Console.WriteLine("S2" + s);
  1038. }
  1039. }
  1040. public class Polygon: Shape
  1041. {
  1042. public Polygon() : base(" from ")
  1043. {
  1044. Console.WriteLine("P");
  1045. }
  1046. }
  1047. public class Rectangle:Polygon
  1048. {
  1049. public Rectangle()
  1050. {
  1051. Console.WriteLine("R");
  1052. }
  1053. }
  1054. Dla powyższych deklaracji, co pojawi się na ekranie po wykonaniu następującego fragmentu programu:
  1055. Rectangle r = new Rectangle();
  1056.  
  1057. Odpowiedź:
  1058. S2 from
  1059. P
  1060. R
  1061.  
  1062. Zadanie 9 z egzaminu 2011
  1063. Czy z poziomu języka C# można zmodyfikować wartość pola prywatnego obiektu bez korzystania z jego metod? Jeśli tak to czego trzeba użyć?
  1064. Odpowiedź:
  1065. Mechanizmu refleksji
  1066.  
  1067. Zadanie 10 z egzaminu 2011
  1068. Co oznacza termin late binding? Do czego ten mechanizm służy?
  1069. Odpowiedź:
  1070. Późne wiązanie służy do robienia wtyczek do programów głównie, generalnie chodzi o to że na etapie kompilacji nie są znane wszystkie zależności i część dll jest wczytywana dopiero przy uruchomieniu.
  1071.  
  1072. Zadanie 11 z egzaminu 2011
  1073. Które z poniższych stwierdzeń jest prawdą (podkreśl właściwe stwierdzenia) (3 pkt.):
  1074. W języku C# nie można bezpośrednio przeciążyć operatora [], można jednak utworzyć tzw. indekser zapewniający wykorzystanie tegoż operatora.
  1075. Odpowiedź: PRAWDA
  1076. Język C# nie daje możliwości korzystania z klas generycznych.
  1077. Odpowiedź: FAŁSZ
  1078. Język C# daje możliwość tworzenia rozszerzonych statycznych obiektów np. typów klas.
  1079. Odpowiedź: PRAWDA ?
  1080. Wyrażenia lambda są dostępne w języku C# począwszy od specyfikacji języka 4.0.
  1081. Odpowiedź: FAŁSZ
  1082. Słowo kluczowe dynamic języka C# służy do ominięcia statycznej weryfikacji dostępnych w obiekcie elementów.
  1083. Odpowiedź: PRAWDA ?
  1084. W języku C# nie można tworzyć hierarchii interfejsów.
  1085. Odpowiedź: FAŁSZ
  1086.  
  1087. Zadanie 12 z egzaminu 2011
  1088. Język C# jest językiem kompilowanym do kodu pośredniego, który może być uruchamiany na dowolnym systemie operacyjnym pod warunkiem, że istnieje na niego interpreter tego kodu. Jak nazywa się pakiet umożliwiający uruchamianie programu napisanego w C# pod systemami LINUX (1 pkt)?
  1089. Odpowiedź:
  1090. MONO
  1091.  
  1092. Zadanie 13 z egzaminu 2011
  1093. Czy w języku C# można korzystać z kodu niezarządzanego (bez tzw. odśmiecacza)?
  1094. Odpowiedź:
  1095. TAK
  1096.  
  1097. Zadanie 14 z egzaminu 2011
  1098. Które z podanych poniżej nie jest słowem kluczowym języka C# (podkreśl prawidłowe odpowiedzi) (3 pkt.):
  1099. Odpowiedź:
  1100. continue, this, extends, new, super, ref ←CZERWONE NIE SĄ KLUCZOWE
  1101.  
  1102. Zadanie 15 z egzaminu 2011
  1103. Język C# nie zapewnia możliwości przeciążenia operatorów (podkreśl prawidłowe odpowiedzi) (3 pkt.):
  1104. Odpowiedź:
  1105. is, binarny +, unarny -, ?:, <<, ->
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement