Transcript Wykład 5

Wydział Elektroniki
Kierunek: AiR
Zaawansowane metody programowania
Wykład 5
Język C#
Składowe klasy
Nazwa
Opis
Stałe
Stałe wartości związane z klasą
Pola
Metody
Zmienne klasy
Obliczenia i działania, które mogą być przeprowadzone przez klasę
Właściwości
Działania związane z odczytywaniem i zapisywaniem nazwanych
właściwości klasy
Indeksatory
Działania związane z indeksowanymi instancjami klasy, takimi jak tablice
Zdarzenia
Zgłoszenia generowane przez klasę
Operatory
Konwersje i operatory wyrażeń obsługiwane przez klasę
Konstruktory
Działania wymagane do inicjalizacji instancji klasy lub klasy samej w sobie
Destruktory
Działania przeprowadzane przed permanentnym usunięciem instancji klasy
Typy
Zagnieżdżone typy zadeklarowane przez klasę
Język C#
Składowe klasy / właściwości i akcesory
• Właściwości (property) to składowe
umożliwiające dostęp do cechy obiektu lub klasy
• Właściwości posiadają akcesory (accessors)
określające instrukcje, które mają być wykonane
gdy ich wartości są odczytywane lub zapisywane.
• Z punktu widzenia programisty właściwości to
metody a z punktu widzenia klienta klasy to pola
typu dane.
• Akcesory: set oraz get.
Properties and accessors
• Properties combine aspects of both fields and methods. To the user
of an object, a property appears to be a field, accessing the
property requires the same syntax. To the implementer of a class, a
property is one or two code blocks, representing a get accessor
and/or a set accessor.
• The code block for the get accessor is executed when the property is
read.
• The code block for the set accessor is executed when the property is
assigned a new value.
• A property without a set accessor is considered read-only.
• A property without a get accessor is considered write-only.
• A property that has both accessors is read-write.
Properties and accessors
• Unlike fields, properties are not classified as variables.
• Properties have many uses:
– they can validate data before allowing a change;
– they can transparently expose data on a class where that data is
actually retrieved from some other source, such as a database;
– they can take an action when data is changed, such as raising an
event, or changing the value of other fields.
• Properties are declared in the class block by specifying
the access level of the field, followed by the type of the
property, followed by the name of the property, and
followed by a code block that declares a get-accessor
and/or a set accessor.
Przykład 1
public class Date
• In this example,
Month is
{
declared as a property
so that
private
int month = 7; //"backing store"
the set accessorpublic
can makeint
sureMonth
that the Month value
is set
{
between 1 and 12. The Month
get
property uses a private field
{ to
track the actual value. The real return month;
location of a property's data
} is
often referred to as the set
property's "backing store."{ It is
common for properties to use
if ((value > 0) && (value < 13))
private fields as a backing
{
store. The field is marked
month = value;
private in order to make sure
}
that it can only be changed
} by
calling the property.
}
}
Przykład 2
• This example demonstrates instance,
static, and read-only properties.
• It:
– accepts the name of the employee from the
keyboard,
– increments NumberOfEmployees by 1, and
– displays the Employee name and number.
Przykład 2, c.d.
public class Employee
{
public static int NumberOfEmployees;
private static int counter;
private string name;
public string Name // A read-write instance property:
{
get { return name; }
set { name = value; }
}
public static int Counter // A read-only static property:
{
get { return counter; }
}
public Employee()
// A Constructor:
{
// Calculate the employee's number:
counter = ++counter + NumberOfEmployees;
}
}
Przykład 2, c.d.
class TestEmployee
{
static void Main()
{
Employee.NumberOfEmployees = 100;
Employee e1 = new Employee();
e1.Name = "Jerzy F. Kotowski";
System.Console.WriteLine("Employee number: {0}",
Employee.Counter);
System.Console.WriteLine("Employee name: {0}",
e1.Name);
System.Console.ReadKey();
}
}
Properties
• Properties – własności? właściwości?
• get i set są to akcesory
• Akcesor set automatycznie podczas próby
przypisania wartości otrzymuje ją w
parametrze o nazwie value
• Akcesor get musi zwrócić jakąś wartość
Przykład 3
class Pokaz
{
private int l;
public int liczba
{
get // Zwraca wartość
{
return l / 2;
}
set // Nadaje wartość
{
l = value;
}
}
}
class Program
{
public static void Main()
{
Pokaz p = new Pokaz();
p.liczba = 100;
Console.WriteLine(p.liczba);
Console.ReadKey();
}
}
Przykład 3 - komentarz
• Tworzymy klasę o nazwie Pokaz, która to zawiera prywatną
zmienną typu int o nazwie l
• Klasa zawiera własność o nazwie liczba, która to zawiera dwa
akcesory get i set
• Akcesor get zwraca l/2 (podzieloną przez dwa)
• Uwaga! Typ zwracany musi być taki sam jak typ własności.
• Akcesor set służy do zapisu (ustawiania) wartości. Ustala on miejsce
do którego ma być przypisana wartość parametru value
• Własności nie przechowują danych. Określają tylko miejsce ich
przechowywania.
• Z tego względu własności nie mogą korzystać z ref ani out
• Własność może być zadeklarowana jako static, virtual lub
abstract
• ZADANIE: CO NAPISZE TEN PROGRAM?
Indexers – indeksatory? Indeksery?
• Indexers are a syntactic convenience that enable you to create a
class, struct, or interface that client applications can access just as
an array.
• Indeksery są podobne do własności.
• Pozwalają po utworzeniu obiektu indeksować go jak tablicę, czyli za
pomocą operatora [ ].
• Indeksery są jedno i dwu wymiarowe, podobnie jak tablice.
• Ogólna składnia indeksera:
specyfikator_dostępu typ this[int index]
{
get
public int this[int index]
{…}
{
set
// get and set accessors
{….}
}
}
Indeksery - komentarze
• Parametr index musi być typu int.
• Reszta elementów jest taka sama, jak we własności.
• Są dwa akcesory get i set, zatem indeksery jak i
własności mogą być tylko do odczytu lub zapisu albo do
odczytu i zapisu równocześnie.
• Indekser nie przechowuje żadnych wartości on tylko
określa miejsce przechowywania wartości.
• Przykład:
– Utworzenie klasy, której instancje można będzie indeksować jak
tablice;
– Będzie można zapisać wartości tylko podzielne przez trzy;
– Tablica będzie odporna na błąd przekroczenia indeksu.
Przykład 4
class Pokaz
{
public static void Main() {
dane a = new dane(10);
a[0] = 9; a[1] = 34; a[2] = 3;
a[3] = 7; a[4] = 4356; a[19] = 15;
a.Wyswietl_elementy();
Console.ReadKey(); }}
class dane
{
int[] tab;
public dane(int rozmiar) // konstruktor
{tab = new int[rozmiar];}
public int this[int index] // indekser
{
get { return tab[index]; }
set {
if (value % 3 == 0)
{ if (index <= (tab.Length) - 1)
tab[index] = value; }}
}
public void Wyswietl_elementy() {
foreach(int x in tab){
Console.WriteLine(x);
}
}}
Przykład 4 - komentarze
• W programie znajduje się definicja klasy o nazwie liczba
• Klasa zawiera indekser
• Akcesor set indeksera zapisuje tylko liczby podzielne przez 3
• Dodatkowo akcesor set sprawdza czy parametr index jest zgodny z
rozmiarem tablicy tab.
• Po utworzeniu instancji obiektu jest do niego dostęp przez [ ].
• Przekroczenie indeksu nie wywołuje błędu gdyż nie trafia on do
tablicy.
• W przykładzie indekser został wykorzystany do zarządzania
miejscem zapisu wartości do tablicy. Tę wartość niekoniecznie
trzeba zapisywać do tablicy, parametr index może być
wykorzystany inaczej.
• Indekser nie przechowuje wartości. Indekser określa tylko miejsce
przechowywania tej wartości.
Exceptions - Wyjątki
• An exception is any error condition or unexpected behavior
encountered by an executing program.
try
{
• In the .NET Framework an exception
…
is an object that inherits from
}
the Exception Class class.
catch(nazwa_wyjątku1)
• W C#.NET wyjątkiem jest na przykład
{
błąd przekroczenia indeksu,
…
wyjątkiem (błędem) jest też przypisanie
}
do zmiennej int zmiennej typu char.
catch(nazwa_wyjątku2)
• Wychwycenie tych wyjątków w programie
pozwala uchronić program
przed ewentualnymi błędami.
• Ogólna deklaracja wychwytywania wyjątku:
{
…
}
finally
{
…
}
Wyjątki - komentarze
• W bloku kodu try umieszcza się kod w którym może
wystąpić jakiś wyjątek (na przykład przepełnienie
indeksu), lub kod który ma zostać poddany kontroli.
• W blokach catch wypisuje się co ma być wykonane po
wychwyceniu jakiegoś wyjątku.
• W nawiasach podaje jaki wyjątek ma być wychwycony.
• Istnieje instrukcja catch, która to wyłapuje wszystkie
wyjątki, zapisujemy ją bez nawiasów.
• Instrukcja finally jest opcjonalna, wykonuje się ona
zawsze na końcu niezależnie od tego czy wystąpił
wyjątek czy nie.
• Prosty przykład: przepełnienie indeksu.
Przykład 5
class Pokaz
{
public static void Main()
{
int[] tablica = new int[10];
try
{
for (int i = 0; ; i++){
tablica[i] = i;
Console.WriteLine(i);}
}
catch(IndexOutOfRangeException)
{
Console.WriteLine("Nastąpiło właśnie przepełnienie
indeksu");
Console.ReadKey();
}}}
Przykład 5 - komentarze
• Deklaracja tablicy o rozmiarze 10.
• Pętla ma specjalnie przekroczyć ten indeks.
• Ten kod jest umieszczony w bloku try.
• W bloku catch piszemy jaki rodzaj wyjątku chcemy
wychwycić (czyli przepełnienie indeksu).
• Kolejny przykład: Należy wyświetlić wiadomość o rodzaju
błędu, to znaczy IndexOutOfRangeException.
Przykład 6
class Pokaz
{
public static void Main()
{
int[] tablica = new int[10];
try
{
for (int i = 0; ; i++){
tablica[i] = i;
Console.WriteLine(i);}
}
catch(IndexOutOfRangeException e)
{
Console.WriteLine("Nastąpiło właśnie przepełnienie
indeksu\n\nTreść błędu:\n");
Console.WriteLine(e.ToString());
Console.ReadKey();
}}}
Wyjątki – najczęściej spotykane
• ArraryTypeMismatchException – Typ wartości jaki
chcemy przypisać jest niezgodny z typem docelowym
• DivideByZeroException – Próba dzielenia przez zero
• IndexOutOfRangeException – Przekroczenie indeksu
• InvalidCastException – Niepoprawne rzutowanie w
czasie rzeczywistym
• OutOfMemoryException – Porażka wywołania new z
powodu braku wolnej pamięci
• OverflowException – Arytmetyczne przepełnienie
Wyjątki – słowo kluczowe throw
• Ogólna deklaracja zgłoszenia wyjątku:
throw new nazwa_wyjątku();
• Przykładowo
throw new IndexOutOfRangeException();
• Przykład: Poprawiony przykład 4 z indekserami