Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Programowanie wizualne
- wersja 2016-06-13 (dostęp)
- Opracowanie
- 1. C# - Wesołe modyfikatory
- out vs ref
- ● np. public void Wykonaj(out int a)
- lub public void Wykonaj(ref int a)
- ● są to modyfikatory parametrów funkcji, służące do przekazywania referencji
- ● po zmianie zmienne są widoczne na zewnątrz funkcji
- ● out musi być zainicjalizowany wewnątrz funkcji
- ● ref musi być zainicjalizowany przed wykonaniem funkcji
- ● Przykład out
- class OutExample
- {
- static void Method(out int i)
- {
- i = 44;
- }
- static void Main()
- {
- int value;
- Method(out value);
- // value is now 44
- }
- }
- ● Przykład ref
- class RefExample
- {
- static void Method(ref int i)
- {
- // Rest the mouse pointer over i to verify that it is an int.
- // The following statement would cause a compiler error if i
- // were boxed as an object.
- i = i + 44;
- }
- static void Main()
- {
- int val = 1;
- Method(ref val);
- Console.WriteLine(val);
- // Output: 45
- }
- }
- Zadanie 1 ze strony Wojciechowskiego
- Jaka jest różnica między modyfikatorem ref i out? (przypisanie wartości wewnątrz metody i wartość początkowa parametru)
- Odpowiedź:
- 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.
- private static void xd(out int d)
- {
- Console.WriteLine(d); // CS0269 nie da się bo d jest niezainicjowane
- d = 3;
- }
- Zadanie 5 ze strony Wojciechowskiego
- Czy argumenty z parametrami out/ref mogą mieć wartości domyślne?
- Odpowiedź:
- Nie.
- readonly vs const
- ● const jest przypisywany na poziomie kompilacji
- ● const musi być zainicjalizowany już na poziomie deklaracji
- ● const nie może być static - i tak jest już związany z klasą a nie instancją
- ● readonly jest inicjalizowany w konstruktorze i nie można juz go potem zmieniać (przypisywany podczas działania programu)
- ● readonly może być static
- dynamic vs object
- ● object jest po prostu typem, po którym wszystko dziedziczy
- ● 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 ;)
- ● 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.
- sealed
- ● klasa zapieczętowana
- ● nie można po niej dziedziczyć
- ● (modyfikator private również uniemożliwia dziedziczenie)
- 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
- ● Przykład sealed
- sealed class SealedClass
- {
- ...
- }
- class ChildClass:SealedClass
- // powoduje błąd cannot inherit from sealed class 'SealedClass'
- {
- ...
- }
- partial
- ● pozwala podzielić klasę, strukturę albo interfejs na kilka części (będące na przykład w różnych plikach)
- ● każda część musi być oznaczona jako partial
- params
- ● pozwala przyjąć funkcji dowolną liczbę argumentów danego typu
- ● argument z params musi być ostatnim argumentem
- ● w efekcie dostajemy tablicę zawierającą wszystkie przekazane parametry
- ● np. public void Wykonaj(int a, params string b) - dostaniemy b jako tablicę stringów
- ● wywołanie powyższego: Wykonaj(1, "aa", "bb", "accs", "safdasa");
- Zadanie 2 ze strony Wojciechowskiego
- Czy jedna metoda może mieć dwa parametry z modyfikatorem params?
- Odpowiedź:
- Nie.
- Zadanie 3 ze strony Wojciechowskiego
- Czy argument z modyfikatorem params może być pierwszy? Innymi słowy, czy poprawna jest definicja:
- public int SumDiv(params int [] arg, ref int x, out float res)
- Odpowiedź:
- Nie jest poprawne. Argument params zawsze musi być ostatni.
- new vs override
- ● override przysłania metodę i pozwala użyć polimorfizmu. Przysłania metodę virtual, abstract albo inny override.
- ● 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)
- implicit
- ● operator konwersji niejawnej (i jawnej też)
- ● Przykład:
- class Text
- {
- public static implicit operator Text(int n)
- {
- return new Text {str = n.toString()};
- }
- }
- Potem używamy:
- Text txt = 1 lub ewentualnie Text txt = (Text) 1;
- explicit
- ● operator konwersji jawnej
- ● Przykład:
- class Text
- {
- public static explicit operator Text(int n)
- {
- return new Text {str = n.toString() };
- }
- }
- Potem używamy:
- Text txt = (Text) 1;
- static
- ● 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.
- Czy funkcja jest poprawna?
- Przykład 1:
- ● class Klasa {
- public static int a = 1;
- public static int b = 1;
- public int funk(int c){
- return a+b+c;
- }
- }
- ● Jest poprawna. Funkcja jest static i odwołuje się tylko do pól statycznych i swoich arg.
- Przykład 2:
- ● class Klasa {
- public static int a = 1;
- public int b = 1;
- public static int funk(int c){
- return a+b+c;
- }
- }
- ● Nie jest poprawna, bo odwołuje się do niestatycznego b.
- Zadanie 3 z egzaminu
- Czy podany kod jest poprawny:
- class jakaśtak {
- public int a;
- public static int b = 1234;
- public int f1(int c)
- {
- return a+b+c;
- }
- }
- Odpowiedź:
- 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' ).
- Składowe klas są inicjowane wartością domyślną, natomiast zmienne nie są domyślnie inicjowane.
- 2. C# - Ciekawe operatory
- is
- ● Operator sprawdzenia czy dana zmienna jest jakiegoś typu, czy dziedziczy po typie lub czy implementuje interfejs.
- ● Przykład:
- var x = "aaa";
- if(x is Object) ... // zwróci true
- as
- ● Umożliwia niektóre rzutowanie (tylko typów nulllowalnych (np. string, object), czyli typy proste i struktury odpadają).
- ● W przeciwieństwie do jawnego rzutowania, w przypadku nieudanego rzutowania nie rzuci wyjątkiem a zwróci null.
- ● Przykład:
- var zmienna = zmienna2 as SuperKlasa;
- typeof
- ● Zwraca obiekt klasy Type dla danego typu / klasy. Za jego pomocą można sprawdzić czy zmienna jest dokładnie jakiegoś typu.
- ● Przykład:
- var i = 1;
- if(i.getType() == typeof(int)) // zwróci true
- Operator ?
- ● Znany wszystkim operator warunkowy.
- ● Przykład:
- var x = y > 10 ? "Wieksze":"Mniejsze";
- Operator ??
- ● Operator sprawdzenia nulla. Bierze kolejną zmienną, jeśli poprzedzająca operator jest nullem .
- ● Przykład
- var x = y ?? z;
- // x=y gdy y nie jest nullem, x=z gdy y jest nullem
- 3. C# - Niesamowite sztuczki
- extern alias
- ● 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
- ● Przykładowo zarówno w Costam1 jak i Costam2 jest klasa KlasaA (gdzie Costam1 i Costam2 to nazwy .dll)
- extern alias Costam1;
- extern alias Costam2;
- Wymagane będzie wtedy użycie Costam1::KlasaA oraz Costam2::KlasaA
- decimal vs double
- ● double używa reprezentacji binarnej o podstawie 2 - nie nadaje się do przechowywania wartości, które istnieją w systemie dziesiętnym
- ● decimal używa reprezentacji dziesiętnej (o podstawie 10) i jest to dedykowany typ do "trzymania" pieniędzy
- ● przez to że double przechowuje jedynie wartość przybliżoną liczb dziesiętnych, mogą narastać błędy
- leniwa inicjalizacja (Lazy<T>)
- ● Inicjalizacja obiektu w momencie jego pierwszego użycia (wywołania Value)
- ● Jeżeli nie odwołamy się do obiektu, pozostanie niezainicjalizowany
- ● Przykład:
- var x = new Lazy<Czlowiek>( () => new Czlowiek() ); // nie inicjalizuje się tutaj
- x.isValueCreated(); // zwróci false
- var y = x.Value; // inicjalizacja
- nullable
- ● Typy niereferencyjne możemy rozszerzyć o wartość null
- ● To wcale nie znaczy, że staną się referencyjne!
- ● Dwa sposoby użycia:
- int? zmienna;
- Nullable<int> zmienna;
- verbatim strings
- ● Operator @ wyłącza formatowanie stringa, tj. ignoruje sekwencje kontrolne
- ● Przykładowo dla var x = @"abc \t abc"; nie zostanie wstawiony tabulator, pozostanie tekst \t
- global
- ● 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ć).
- ● Przykład:
- var Console = 7;
- global::System.Console.Write("abc"); // użyte Console z .NETa
- checked/unchecked
- ● Sprawdzanie (lub nie) overflowa przy operacjach arytmetycznych.
- ● Domyślnie wszystko jest unchecked
- ● Przykładowe użycie checked:
- checked {
- var i = 1;
- while(1) i++;
- }
- W powyższym przypadku gdy wystąpi overflow, rzucony będzie wyjątek
- ● 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)
- Przykład 1:
- ● var a = 0;
- var b = 0;
- var c = 0;
- while(true)
- c++;
- checked {
- while(true)
- a++;
- while(true)
- unchecked { b++; }
- }
- ● a się przekręci i poleci wyjątek
- ● 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)
- Przykład 2:
- ● var a = 2000000000;
- a += 2000000000;
- ● 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
- Zadanie 2 z egzaminu
- Czym się różni p1 od p2:
- int a = 200000;
- a = a + 200000; (p1)
- a = checked (a + 20000); (p2)
- Odpowiedź:
- 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.
- Domyślnie (tj. bez napisanego jawnie checked) przepełnienia nie są sprawdzane (chyba że włączy się je globalnie w opcjach kompilatora).
- Zadanie 2 z egzaminu "sprzed 2 lat"
- Czym się różni p1 od p2:
- int a = 1 000 000 000;
- a = a + 1 000 000 000; //(p1)
- a = checked (a + 1 000 000 000); //(p2)
- Odpowiedź:
- Opis tak samo jak w poprzednim, tu sie też nie zdąży przekręcić, int.MaxVal to ponad dwa miliardy
- unsafe
- ● włączenie kodu niezarządzanego
- ● słowo to może stać zarówno przed nazwą funkcji jak i być oddzielnym blokiem
- ● w kodzie niezarządzanym możemy używać wskaźników
- ● Uwaga @MB: dodatkowo można używac stackalloc
- yield
- ● Służy do tworzenia ‘leniwych’ kolekcji
- ● Dobry w przypadku tworzenia tablicy, w której tylko parę elementów jest potrzebne
- ● Przykład:
- public IEnumerable<int> GetInts(int nNumberOfElements)
- {
- for (int nNumber = 0; nNumber < nNumberOfElements; ++nNumber)
- {
- yield return nNumber;
- }
- }
- ● Uwaga @MB: konstrukcja yield break kończy tworzenie kolekcji
- indexer
- ● W C# nie można przeciążyć operatora [ ], ale da się zrobić indexer który działa tak samo.
- ● Indeksem może być dowolny typ
- ● Przykład (indeksem jest int, użycie [ ] zwraca string )
- class SuperLista {
- private List<string> lista;
- public string this[int i]{
- get { return lista[i]; }
- set { lista[i] = value; }
- }
- }
- Użycie:
- var x = new SuperLista();
- x[3] = "abcd";
- delegate
- ● wywodzą się ze wskaźników na funkcje
- ● pozwalają do siebie przypisać funkcje
- ● dbają o to, by programista przypisał funkcję zwracającą odpowiedni typ i mającą odpowiednie parametry
- ● Przykład:
- delegate int Obliczenia(int x, int y);
- Obliczenia suma = new Obliczenia(Suma); // Suma to jakaś funkcja przyjmującą 2 parametry typu int, zwracająca int
- ● 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
- o Uwaga @MB: przypisywanie wielu funkcji robi się przez +=
- delegaty vs interfejsy
- ● Jeśli mamy w interfejsie jakąś metodę, to można (w jednej chwili) ją implementować tylko raz (w klasie implementującej interfejs)
- ● 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
- ● 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
- ● Użycie interfejsu jest bardziej czytelne - wiemy co to za metoda i gdzie jest zaimplementowana
- Zadanie 7 z egzaminu "sprzed 2 lat"
- Napisz w jakich sytuacjach warto stosować interfejsy a nie delegacje.
- Odpowiedź:
- Use a delegate when:
- - An eventing design pattern is used.
- - The caller has no need access other properties, methods, or interfaces on the object implementing the method.
- - Easy composition is desired.
- - A class may need more than one implementation of the method.
- Use an interface when:
- - There are a group of related methods that may be called.
- - A class only needs one implementation of the method.
- - The class using the interface will want to cast that interface to other interface or class types.
- - The method being implemented is linked to the type or identity of the class: for example, comparison methods.
- rzutowanie
- ● automatyczne (niejawne) - po prostu przypisujemy zmienną danego typu do innego
- o Może być rozszerzające lub zawężające (kompilator wywali błąd)
- ● wymuszone (jawne) np. int x = (int) y;
- o Należy uważać na błędne wartości!
- Zadanie 1 z egzaminu
- Czy kod jest poprawny:
- Przykład 1:
- double x, y;
- x = y;
- Odpowiedź:
- Nie, bo nie ma zadeklarowanej wartości, ścilej dlatego, że y jest niezdefiniowane.
- Przykład 2:
- double x = 1.5;
- int y = 15;
- x = y;
- Odpowiedź:
- 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.).
- Zadanie 1 z egzaminu "sprzed 2 lat"
- Czy poniższy fragment kodu jest poprawny, jeśli nie to napisz dlaczego.
- Przykład 1
- double x, y = 1.5;
- x = y;
- Odpowiedź:
- tak
- Przykład 2
- int x;
- double y = 1.5;
- x = y;
- Odpowiedź:
- Nie. rzutowanie double -> int może prowadzić do utraty danych i musi być wykonane jawnie
- enum
- ● Domyślnie dziedziczą po int, ale mogą też po byte (mają wtedy tylko 2 wartości)
- ● Przykład:
- public class EnumTest
- {
- enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
- static void Main()
- {
- int x = (int)Days.Sun;
- int y = (int)Days.Fri;
- Console.WriteLine("Sun = {0}", x);
- Console.WriteLine("Fri = {0}", y);
- }
- }
- /* Output:
- Sun = 0
- Fri = 5
- */
- 4. C# - Modyfikatory dostępności
- public
- ● dostępny wszędzie
- ● 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.
- private
- ● dostępne tylko w ramach klasy
- ● Domyślnie wszystkie elementy danej klasy czy struktury są traktowane jako elementy prywatne, jeśli nie określimy modyfikatora dostępu.
- protected
- ● dla pól - dostępne w klasach dziedziczących
- internal
- ● dostępne w pakiecie (podzespole)
- ● klasy są domyślnie internal
- protected internal
- ● dostępne dla klas dziedziczących w pakiecie
- Zagnieżdżanie klas
- Czy możemy w C# zagnieżdżać klasy? Jeśli tak, co to daje gdy klasa wewnętrzna będzie public?
- ● Tak, można
- ● Jeśli public, to klasa będzie ogólnodostępna, ale tylko za pośrednictwem klasy ‘rodzica’
- np. KlasaWew jest zagniedżczona w KlasaZew, więc żeby się dostać do KlasaWew, musimy napisać KlasaZew.KlasaWew
- ● Domyślnie zagnieżdżone typy są prywatne
- Zadanie 5 z egzaminu "sprzed 2 lat"
- 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.
- Odpowiedź:
- Tak, jest dopuszczalne. Jeśli X zostanie oznaczone modyfikatorem private to będzie widoczne tylko wewnątrz klasy Y.
- 5 - WPF, czyli to, co tygryski lubią najbardziej
- Podstawy WPF: http://www.tutorialspoint.com/wpf/index.htm
- Dynamiczne wartości właściwości
- ● Specjalna składnia umożliwia nadawanie wartości dynamicznych przez wiązanie jej z wartościami właściwości klas
- Przykład:
- <Label … Background="{ x : Static SystemColors.HighlightColor }" />
- Właściwości powiązane - Attached Properties
- ● właściwości zdefiniowane w jednym z komponentów, ale zdefiniowane w innej klasie
- ● używanie poprzez: TypDefniniujący.NazwaWłaściwości
- ● <Label Name="label1" ... Grid.Row="0" Grid.Column="0"/>
- ● są one przekształcane w wywołania metod TypDefiniujący.SetNazwaWłaściwości np. Grid.SetColumn(label1, 1);
- Behavior
- ● Zachowania pozwalają na ponowne użycie kodu związanego z interfejsem użytkownika
- ● Nie są częścią WPF-a – zostały zdefiniowane w Expression Blend
- Binding
- ● 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
- ● właściwość docelowa jest zawsze dependency property
- ● Przykład:
- XAML:
- < TextBox Name="ScaleText" Text="Binding ElementName=ScaleSlider, Path=Value}" />
- < Slider Name="ScaleSlider" … Value="1" />
- C#:
- Binding binding = new Binding();
- binding.Source = ScaleSlider;
- binding.Path = new PropertyPath("Value");
- binding.Mode = bindingMode.TwoWay;
- ScaleText.SetBinding(TextBox.TextProperty, binding);
- ● najprostszym zastosowaniem jest wiązanie dwóch takich właściwości
- ● realizacja wiązania poprzez klasę Binding z pakietu System.Windows.Data
- ● niepoprawne wiązanie nie generuje wyjątków
- o Uwaga: ręczne ustawienie wartości w kodzie powoduje zerwanie wiązania
- ● BindingMode
- ● OneWay - jednostronne od źródła do celu
- ● TwoWay - dwustronne
- ● OneTime – jednorazowe – w celu inicjalizacji
- ● OneWayToSource – jednostronne od celu do źródła
- ● Default - domyślne – zależne od właściwości
- ● 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
- Jak wygląda binding?
- ● Content = "{Binding JakasWlasciwosc, Mode=OneWay}"
- ● Content = "{Binding JakasWlasciwosc, ElementName=WybranyElement}"
- ● OnClick = "{Binding JakasMetoda}"
- ● Visiblity = "{Binding CzyWidoczny, Converter={StaticResource BoolToVisiblityConverter}}"
- o Uwaga @MB: żeby to dobrze działało to klasa, do której się binduje, powinna implementować interfejs INotifyPropertyChanged.
- Rodzaje bindingów
- ● OneWay - od źródła do celu
- ● TwoWay - także od celu do źródła
- ● OneTime - aktualizowana tylko raz ze źródła
- ● OneWayToSource - od celu do źródła
- ● Default - domyślny tryb
- ○ Uwaga @MB: Rodzaj bindingów domyślny oznacza, że różne property mają różnie ustawiony domyślny podobnie jak UpdateSourceTrigger
- Co nam daje UpdateSourceTrigger przy bindingu?
- ● pozwala określić, kiedy podbindowana właściwość jest aktualizowana
- ● Rodzaje:
- o PropertyChanged - natychmiastowa aktualizacji
- o LostFocus - kiedy kontrolka straci focus
- o Explicit - tylko ręcznie poprzez BindingExpression.UpdateSource
- o Default - domyślnie, zależnie od komponentu
- ● Przykład:
- Binding.UpdateSourceTrigger(PropertyChanged, LostFocus, Explicit, Default);
- Usuwanie wiązania
- BindingOperations.ClearBinding(ScaleSlider, Slider.ValueProperty);
- DependencyProperty
- ● DependencyProperty jest to właściwość z dodatkowymi możliwościami.
- ● 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.
- ● 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.
- 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.
- o Uwaga: DependencyProperty jest zawsze static readonly, np. Public static readonly DependencyProperty AquariumGraphicProperty
- o Uwaga: właściwości tego typu mogą być współdzielone, np.: TextBlock.FontFamilyProperty = TextElement.FontFamilyProperty.AddOwner(typeof(TextBlock));
- ● Przykładowy wrapper właściwości:
- Public Uri AquariumGraphic
- {
- get {return (Uri) GetValue(AquariumGraphicProperty);}
- set {SetValue(AquariumGraphicProperty, value);}
- }
- ● 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.
- ● 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ść
- ● Możemy dodać walidację do ustawiania wartości tego Property (walidacja jednak nie następuje w getterach i setterach)
- o Uwaga: domyślnie WPF ignoruje wyjątki związane z ustawianiem Binding.ValidationRules.ExceptionValidationRule
- ● 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)
- Change notification
- ● Uruchamia metodę OnPropertyChangeCallback(), która przekazuje informację o zmianie wartości do serwisów wiązania danych i triggerów
- ● Chcąc zatem reagować na zmianę wartości, można albo napisać trigger, albo utworzyć wiązanie
- Metody w DependencyProperty (ustalamy je w Metadata) - są wywoływane w takiej kolejności przy zmianie wartości jakiegoś DependencyProperty
- ● 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)
- ● ValidateValueCallback - walidacja wartości przypisanej do DP. Możemy zwrócić tam true albo false.
- ● PropertyChangedCallback - wywoływana po wszystkim, jak wartość zostanie zmodyfikowana. Możemy tam wrzucić wszystko co ma się stać po zmianie wartości DP.
- Wiązanie typu Source
- C#:
- public static double DefaultScale {get; set;}
- static MainWindow()
- {
- DefaultScale = 1.0;
- }
- XAML:
- Value = {Binding Source={x : Static local : MainWindow.DefaultScale}, Mode=OneWay}
- Wiązanie typu RelativeSource
- XAML:
- <TextBlock Text={Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Path=Title} />
- ● Typy: Self, FindAncestor, PreviousData, TemplatedParent
- Wiązanie typu DataContext
- ● Kontekst, z którego następuje bindowanie. Trzeba go najpierw wskazać - np. przypisać w konstruktorze klasy, która jest formatką
- ● Dane są wyszukiwane w hierarchii komponentów do czasu napotkania właściwości DataContext różnej od null
- ● Przykład wiązania typu DataContext
- <Window.Resources>
- <local:Person x:Key="JurekPerson" Name="Jurek Owciak" Age="44"/>
- </Window.Resources>
- Normalne:
- <StackPanel>
- <TextBlock Text="{Binding Source={StaticResource JurekPerson},Path=Name}"/>
- <TextBlock Text="{Binding Source={StaticResource JurekPerson},Path=Age}"/>
- </StackPanel>
- DataContext:
- <StackPanel DataContext="{Binding Source={StaticResource JurekPerson}}">
- <TextBlock Text="{Binding Path=Name}"/>
- <TextBlock Text="{Binding Age}"/>
- </StackPanel>
- ItemsSource
- ● 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
- Co daje zastosowanie ObservableList/ObservableCollection jako źródła danych dla ListBoxa?
- ● 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ł
- Layout - Grid, DockPanel, Canvas, StackPanel, WrapPanel
- Rozmieszczenie elementów w:
- ● 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.:
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition />
- <RowDefinition Height="Auto" />
- …
- ● 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" /> )
- ● DockPanelu (Dock Panel) - Pozwala on na umieszczenie elementów, w czterech różnych kierunkach naszego panelu - wzdłuż jednej z czterech krawędzi.
- ● 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.
- ● 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)
- ● 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).
- Zdarzenia - RoutedEvent a Event
- ● 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.
- ● Zwykły Event wywołany zostanie tylko w elemencie źródłowym
- ● Typy zdarzeń:
- o Direct Event np. Click,
- o Bubbling Event (od liści do korzenia) np. MouseDown (w górę hierarchii),
- o Tunnel Event (od korzenia do liści) np. PreviewMouseDown (w dół hierarchii)
- ● Rodzaje zdarzeń:
- o zdarzenia cyklu życia (Initialized, Loaded, Unloaded)
- o wejściowe
- ▪ okna (SourceInitialized, ContentRendered, Activated, Deactivated, Closing, Closed)
- ▪ klawiatury (PreviewKeyDown, KeyDown, PreviewTextInput, TextInput, PreviewKeyUp, KeyUp, KeyPressed)
- ▪ KeyEventArgs zawiera m.in KeyCode, KeyData, Shift, Alt, Control, Modifiers, Handled, Key, IsDown, IsUp, IsRepeat, IsToggled, KeyStates
- ▪ myszy (MouseEnter, MouseLeave, MouseMove, Mouse(Left|Right)Button(Down|Up), MouseWheel, MouseDoubleClick, Click)
- ▪ MouseEventArgs zawiera m.in. Button, Clicks, Delta, X, Y
- ▪ MouseButtonEventArgs zawiera m.in. ButtonState, ClickCount, ChangedButton, LeftButton
- ▪ Uwaga: aby otrzymywać zdarzenia myszy, należy zmienić właściwość Background z null na transparent
- Przykład
- XAML:
- <Button … Click="button1_Click" />
- C#:
- private void button1_Click(object sender, RoutedEventArgs e)
- {
- MessageBox.Show("Ala ma kota");
- }
- Obsługa zdarzeń
- Przykłady C#:
- button1.Click += new RoutedEventHandler(button1_Click);
- button1.Click += button1_Click;
- button1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(button1_Click));
- RoutedEventArgs
- private void MouseDownHandler(object sender, RoutedEventArgs rea)
- {
- string message = "Nadawca: " + sender.ToString() + "\t źródło: " + rea.Source;
- listBox.Items.Add(message);
- }
- Definiowanie zdarzeń
- private static readonly RoutedEvent MyEvent;
- MyEvent = EventManager.RegisterRoutedEvent("MyEvent",
- RoutingStrategy.Bubble,
- typeof(RoutedEventHandler),
- typeof(MainWindow));
- Współdzielenie pomiędzy klasami
- MyEvent = Mouse.MouseDownEvent.AddOwner(typeof((MainWindow));
- Wywołanie zdarzenia
- RoutedEventArgs rea = new RoutedEventArgs(Mouse.MouseDownEvent, this);
- base.RaiseEvent(rea); // wywołanie zdarzenia tylko dla metod zarejestrowanych metodą AddHandler()
- Elementy kontrolne
- ● rodzaje:
- ○ Content
- ○ Headered Content
- ○ Text
- ○ List
- ○ Range-Based
- ○ Date
- ● Control class
- ○ kolory, czcionki, kursor
- ● ContentControl class
- Konwersja
- ● … {Binding …, StringFormat=Data:{0:yyyy-MMMM-dd} … } …
- ● konwertery Converter={StaticResource ColorConverter}
- Style
- Wiązanie stylu z typem i dziedziczenie styli
- <Style x:Key="YellowBackground">
- <Setter Property="Button.Background">
- <Setter.Value>
- <SolidColorBrush Color="Yellow">
- </SolidColorBrush>
- </Setter.Value>
- </Setter>
- <Setter Property="Button.FontSize" Value="30" />
- </Style>
- <Style x:Key="YBwithBold" TargetType="Button" BasedOn="{StaticResource YellowBackground}">
- <Setter Property="Control.FontWeight" Value="Bold"/>
- </Style>
- Zastosowanie stylu dla wszystkich elementów danej klasy
- <Style TargetType="Button" BasedOn="{StaticResource YellowBackground}">
- <Setter Property="Control.FontWeight" Value="Bold"/>
- </Style>
- Co jest równoznaczne z takim zapisem:
- <Style x:Key="{x:Type Button}" BasedOn="{StaticResource YellowBackground}">
- <Setter Property="Control.FontWeight" Value="Bold"/>
- </Style>
- Konwertery
- ● Pozwalają przy bindowaniu zmienić jeden typ na drugi
- Drag & Drop
- http://patryknet.blogspot.com/2013/01/70-511-rozdzia-10-drag-drop.html Drag&Drop in 6 Steps
- ● Detect a drag as a combination of MouseMove and MouseLeftButtonDown
- ● Find the data you want to drag and create a DataObject that contains the format, the data and the allowed effects.
- ● Initiate the dragging by calling DoDragDrop()
- ● Set the AllowDrop property to True on the elements you want to allow dropping.
- ● 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.
- ● 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.
- ● ...and that's all the magic.
- DataTemplate
- ● Pozwalają tworzyć szablony, np dla elementów list, tabel
- Resource
- ● Zasoby pakietów (ang. Assembly Resources)
- ● Zasoby te są osadzane w skompilowanym pakiecie (bibliotece dll lub pliku exe) jako dane binarne.
- ● np obrazki etc.
- ● <Image Name="img" Source="Images/bitmap.jpg"/>
- ● Zasoby WPF
- ● Zasoby WPF są to obiekty .NET zdefiniowane w jednym miejscu, a wykorzystywane w wielu miejscach.
- ● Zasoby statyczne pobierają obiekt z kolekcji zasobów tylko raz.
- ● Zasoby dynamiczne pobierają obiekt z kolekcji za każdym razem gdy jest to potrzebne.
- 6. ADO.NET
- Entity Framework ADO.NET jest narzędziem typu ORM (Object Relational Mapping), pozwalającym odwzorować relacyjną bazę danych za pomocą architektury obiektowej.
- ● 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.
- ● DataTable - zawierają dane i opisujące je szablony. Tabele mają kolumny i wiersze oraz klucz główny.
- ● DataRelation - definiuje relacje między tabelami z DataSet.
- ● DataColumn - reprezentacja pojedynczej kolumny tabeli danych DataTable. Kolumny można dodawać wywołując metodę Add na kolekcji Columns w DataTable.
- ● DataRow - wiersz tabeli danych DataTable, można go dodawać metodą Add na kolekcji Rows w DataTable.
- Zadanie 10 z egzaminu "sprzed 2 lat"
- Jaką rolę w technologii ADO.NET pełni klasa DataSet?
- Odpowiedź:
- 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ć.
- Modele ADO.NET
- ● 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.
- ● 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.
- 7. Operacje równoległe
- Parallel.For
- Dzięki temu można łatwo zrównoleglić obliczenia.
- Przykład:
- Parallel.For(0, n, i =>
- {
- Console.WriteLine(i);
- });
- Kolejno argumentami są:
- początkowy indeks, ilość iteracji, lambda przyjmująca argument i - czyli aktualny numer iteracji.
- Parallel.ForEach
- Można łatwo zrównoleglić obliczenia na kolekcji.
- Przykład:
- Parallel.ForEach(listaElementów, aktualnyElement =>
- {
- Console.Write(aktualnyElement.toString());
- });
- Iterujemy po listaElementów i mamy labdę przyjmującą aktualnyElement - możemy z nim coś zrobić.
- Zadanie 6 z egzaminu "sprzed 2 lat"
- Do czego służy funkcja Parallel.ForEach.
- Odpowiedź:
- 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.
- 8. Synchronizacja zasobów
- ● 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)
- ● 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
- ● 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.
- 9. WCF (Windows Communication Foundation)
- http://codeguru.geekclub.pl/baza-wiedzy/wstep-do-technologii-wcf,2186
- Kontrakty
- 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.
- ● 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]
- ● 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ć.
- Jak to wygląda w praktyce?
- 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.
- Zadanie 8 z egzaminu "sprzed 2 lat"
- Jak w technologii WCF można definiować parametry współpracy klienta z nosicielem (host).
- Odpowiedź:
- 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
- Składniki WCF
- ● IPC (Inter Process Communication)
- ● DCOM, COM+
- ● MSMQ
- ● NET. Remoting
- ● XML Web Services
- 10. Przykładowe zadania
- Egzamin
- Zadanie 4 z egzaminu
- Jakie wyrazy powinny sie pojawić w wykropkowanym miejscu, jeśli metoda ma być dziedziczona:
- public ... int costam() {}
- Odpowiedź:
- (virtual/override)
- 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.
- Zadanie 5 z egzaminu
- Jaka klasa biblioteczna pozwala na dostęp do plików dyskowych?
- Odpowiedź:
- FileInfo i milion innych...
- Zadanie 6 z egzaminu
- Jaką postać plików zwraca klasa FileStream?
- Odpowiedź:
- strumień bajtów
- Zadanie 7 z egzaminu
- Czym jest interfejs?
- Odpowiedź:
- 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.
- Zadanie 8 z egzaminu
- Jak zrobić, żeby radio buttony były tak ustawione, że tylko jeden można wybrać?
- Odpowiedź:
- 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
- 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
- Egzamin "sprzed 2 lat"
- Zadanie 9 z egzaminu "sprzed 2 lat"
- Opisz ogólnie sposób dodawania usługi Przeciągnij i Upuść (Drag & Drop)
- Odpowiedź:
- http://www.wpftutorial.net/draganddrop.html
- Pytania ze strony Wojciechowskiego
- Zadanie 4 ze strony Wojciechowskiego
- Czy używając nazw argumentów należy podać je dla wszystkich używanych argumentów?
- Odpowiedź:
- Nie.
- Zadanie 6 ze strony Wojciechowskiego
- 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 ?
- Odpowiedź:
- 3
- Zadanie 7 ze strony Wojciechowskiego
- Czy można dwóm elementom typu wyliczeniowego nadać tę samą wartość?
- Odpowiedź:
- Tak
- Zadanie 8 ze strony Wojciechowskiego
- 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;
- Co się stanie, jeśli struktura Point będzie miała dodatkowo pole będące obiektem jakiejś klasy?
- Odpowiedź:
- Pole będące obiektem będzie wspólne dla obu punktów.
- Zadanie 9 ze strony Wojciechowskiego
- Czy można przekazać typ referencyjny przez wartość i referencję?
- Odpowiedź:
- Nie, typów referencyjnych nie można przekazywać przez wartość.
- Natomiast typy wartościowe można przekazywać przez referencję (rzutowanie na object).
- Zadanie 10 ze strony Wojciechowskiego
- Czy obiekt dowolnej klasy może być typem Nullable?
- Odpowiedź:
- Nie, tylko typy wartościowe mogą być Nullable
- Zadanie 11 ze strony Wojciechowskiego
- Jak zdefiniować właściwość automatyczną?
- Odpowiedź:
- MODYFIKATOR_DOSTĘPU TYP NAZWA {get; set;}
- np:
- public int Wizualny {get; set;}
- Zadanie 12 ze strony Wojciechowskiego
- Czy właściwość może być tylko do odczytu/zapisu?
- Odpowiedź:
- Tak
- Zadanie 13 ze strony Wojciechowskiego
- Czym są pola readonly?
- Odpowiedź:
- Są to pola, które można przypisać tylko w konstruktorze lub definicji pola. Później zachowują się jak stałe.
- Zadanie 14 ze strony Wojciechowskiego
- Ile konstruktorów statycznych można zdefiniować? Kiedy jest on uruchamiany?
- Odpowiedź:
- Jeden. Jest uruchamiany przed pierwszym użyciem klasy. Nie jest powiedziane kiedy dokładnie.
- Zadanie 15 ze strony Wojciechowskiego
- Co to jest i kiedy działa konstruktor domyślny?
- Odpowiedź:
- Jest to konstruktor bez parametrów. Jest generowany automatycznie jeśli nie jest jawnie stworzony. Jest wywoływany przy tworzeniu tablic.
- Zadanie 16 ze strony Wojciechowskiego
- Jak wywołać jeden konstruktor z drugiego?
- Odpowiedź:
- przez słowo this np:
- public Wizualny(string tekst) {}
- public Wizualny() : this("xd"){}
- Pytania z lab3
- http://www.cs.put.poznan.pl/pwojciechowski/files/Lab3.pdf
- login: student_pw
- hasło: !wiem
- ● 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()?
- ○ Nie, nie
- ● Czy w przypadku gdy jeden interfejs dziedziczy po drugim, mogą oba mieć taką samą metodę?
- ○ Mieć mogą, ale wymaga to nadpisania przez new
- ● Jakie metody wymagane są przez interfejs IEnumerator?
- ○ MoveNext, Reset. Jest jeszcze property Current
- ● Jak w konstrukcji foreach wybrać z którego enumeratora chcemy skorzystać?
- ○ Enumerable.Select ??
- ● W jakim przypadku wystarczy stworzyć płytką kopię metodą this.MemberwiseClone()
- ○ Jeżeli klasa ma same pola wartościowe, tudzież referencyjne, które są Immutable (np. string)
- Pytania z lab4
- http://www.cs.put.poznan.pl/pwojciechowski/files/Lab4.pdf
- login: student_pw
- hasło: !wiem
- ● Jak należy podać typ metody anonimowej?
- ○ Obojętnie, byleby pasowało do sygnatury delegata. Metoda anonimowa to taka sama jak każda inna, tylko ma nazwę generowaną niejawnie.
- ● W jakich przypadkach można pominąć parametry delegata w metodzie anonimowej?
- ○ ?
- ● Co się dzieje z modyfikatorem params w metodzie anonimowej?
- ○ Nic ?
- ● Czy metoda anonimowa ma dostęp do prywatnych pól klasy?
- ○ Tak
- Egzamin 2011
- Zadanie 1 z egzaminu 2011
- 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".
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication {
- class Program {
- static void Main(string[] args) {
- var vals=args.Where
- (...);
- }
- }
- }
- Odpowiedź
- (x => x.EndsWith("ski"));
- Zadanie 2a z egzaminu 2011
- Jakie są modyfikatory dostępu w poniższym przykładzie dla klasy Car i metody Drive.
- class Car
- {
- void Drive(){}
- }
- Odpowiedź
- Dla klasy Car: INTERNAL
- Dla metody Drive: PRIVATE
- Zadanie 2b z egzaminu 2011
- Dla danej klasy:
- namespace ConsoleApplication
- {
- class Program
- {
- internal int _var;
- }
- }
- Gdzie można uzyskać dostęp do pola _var?
- Odpowiedź
- wewnątrz klasy Program, w klasach pochodnych i we wszystkich klasach zawartych w tym samym assembly (pakiet) co klasa Program.
- Zadanie 3 z egzaminu 2011
- Wypełnij brakujący warunek testujący czy obiekt kryjący się pod zmienną v implementuje interfejs IVariable.
- ...
- var v = new Variable();
- Odpowiedź:
- if(v is IVariable){
- ...
- Zadanie 4 z egzaminu 2011
- 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.
- Odpowiedź:
- [Author(name="janusz", version=21.37)]
- class Project
- {...}
- Zadanie 5 z egzaminu 2011
- Jak w języku C# tworzymy właściwości (nie mylić z polami) klasy?
- Odpowiedź:
- MODYFIKATOR TYP NAZWA { get; set; }
- np.
- Public string Student { get; set; }
- Zadanie 6 z egzaminu 2011
- 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)?
- Odpowiedź:
- sposób 1: int? zmienna;
- sposób 2: Nullable<int> zmienna;
- Operator ?? służy do przypisywania wartości domyślnej obiektom, jeśli są null, np.:
- var jaguar = zwierzak ?? new Zwierze();
- jeżeli zwierzak jest nullem to pod jaguar jest wstawione nowe Zwierze, jeżeli nie to wstawiany jest istniejący zwierzak
- Zadanie 7 z egzaminu 2011
- Zaimplementuj metode Inc2, która dla obiektów typu int przyjmuje wartośc o 2 większą.
- Odpowiedź:
- int Inc2(int xd) { return xd + 2; }
- Zadanie 8 z egzaminu 2011
- public class Shape
- {
- public Shape() { Console.WriteLine("S1"); }
- public Shape(string s)
- {
- Console.WriteLine("S2" + s);
- }
- }
- public class Polygon: Shape
- {
- public Polygon() : base(" from ")
- {
- Console.WriteLine("P");
- }
- }
- public class Rectangle:Polygon
- {
- public Rectangle()
- {
- Console.WriteLine("R");
- }
- }
- Dla powyższych deklaracji, co pojawi się na ekranie po wykonaniu następującego fragmentu programu:
- Rectangle r = new Rectangle();
- Odpowiedź:
- S2 from
- P
- R
- Zadanie 9 z egzaminu 2011
- 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ć?
- Odpowiedź:
- Mechanizmu refleksji
- Zadanie 10 z egzaminu 2011
- Co oznacza termin late binding? Do czego ten mechanizm służy?
- Odpowiedź:
- 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.
- Zadanie 11 z egzaminu 2011
- Które z poniższych stwierdzeń jest prawdą (podkreśl właściwe stwierdzenia) (3 pkt.):
- W języku C# nie można bezpośrednio przeciążyć operatora [], można jednak utworzyć tzw. indekser zapewniający wykorzystanie tegoż operatora.
- Odpowiedź: PRAWDA
- Język C# nie daje możliwości korzystania z klas generycznych.
- Odpowiedź: FAŁSZ
- Język C# daje możliwość tworzenia rozszerzonych statycznych obiektów np. typów klas.
- Odpowiedź: PRAWDA ?
- Wyrażenia lambda są dostępne w języku C# począwszy od specyfikacji języka 4.0.
- Odpowiedź: FAŁSZ
- Słowo kluczowe dynamic języka C# służy do ominięcia statycznej weryfikacji dostępnych w obiekcie elementów.
- Odpowiedź: PRAWDA ?
- W języku C# nie można tworzyć hierarchii interfejsów.
- Odpowiedź: FAŁSZ
- Zadanie 12 z egzaminu 2011
- 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)?
- Odpowiedź:
- MONO
- Zadanie 13 z egzaminu 2011
- Czy w języku C# można korzystać z kodu niezarządzanego (bez tzw. odśmiecacza)?
- Odpowiedź:
- TAK
- Zadanie 14 z egzaminu 2011
- Które z podanych poniżej nie jest słowem kluczowym języka C# (podkreśl prawidłowe odpowiedzi) (3 pkt.):
- Odpowiedź:
- continue, this, extends, new, super, ref ←CZERWONE NIE SĄ KLUCZOWE
- Zadanie 15 z egzaminu 2011
- Język C# nie zapewnia możliwości przeciążenia operatorów (podkreśl prawidłowe odpowiedzi) (3 pkt.):
- Odpowiedź:
- is, binarny +, unarny -, ?:, <<, ->
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement