W.Kasprzak: JiPP 3
5. Klasy autonomiczne
1
5. Klasy autonomiczne
Włodzimierz Kasprzak
Włodzimierz Kasprzak
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
2
Tre
ść
1. Istota programowania obiektowego
2. Klasy i obiekty
3. Składowe statyczne
4. Kapsułkowanie
5. Obiekty a zmienne referencyjne
6. Klasa
Object
7. Klasa
String
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
3
1. Istota programowania obiektowego
•
„Abstrakcyjne typy danych” (klasy) definiowalne przez
programist
ę
i obiekty jako zmienne tych klas.
•
Mo
ż
liwo
ść
dziedziczenia klas (klasy pochodne) i
•
Wielopostaciowo
ść
(polimorfizm) operacji,
•
Ukrywanie szczegółów realizacji, poziomy dost
ę
pu do
składowych klasy (kapsułkowanie, hermetyzacja).
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
4
2. Klasy i obiekty
• Klasa
w j
ę
zyku programowania obiektowego to:
– Element
składni
j
ę
zyka
opatrzony
nazw
ą
,
implementuj
ą
cy abstrakcyjny typ danych – wyznacza
pewn
ą
struktur
ę
(agregacj
ę
) danych i jej mo
ż
liwe
zachowanie (operacje).
– Definicja klasy zawiera definicj
ę
struktury danych (pól,
własno
ś
ci) i definicje funkcji składowych (metod).
• Obiekt
jest instancj
ą
(zmienn
ą
) klasy. W programie mo
ż
e
istnie
ć
wiele obiektów jednej klasy.
• Obiekt
posiada:
– To
ż
samo
ść
(dzi
ę
ki której odró
ż
niamy obiekty od siebie),
– Zachowanie
(operacje
wyznaczone
przez
klas
ę
obiektu),
– Stan
(własne dane o strukturze wyznaczonej przez
definicj
ę
klasy obiektu).
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
5
Klasa a struktura
• struct
jest przepisem dla warto
ś
ci zmiennej:
– Identyfikator równowa
ż
ny warto
ś
ci zmiennej, stan
zmiennej jest bezpo
ś
rednio dost
ę
pny, w strukturach nie
powinno si
ę
definiowa
ć
metod (poza operatorami).
• class
jest przepisem dla obiektu:
– Klasy s
ą
identyfikowalne; stan obiektu nie powinien by
ć
bezpo
ś
rednio dost
ę
pny; nale
ż
y definiowa
ć
metody
klasy.
struct Time
class RachunekBankowy
{
{
public int godzina;
...
public int minuta;
...
}
}
struct Time
class RachunekBankowy
{
{
public int godzina;
...
public int minuta;
...
}
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
6
Definiowanie klas autonomicznych
• Wewn
ą
trz klasy definiuje si
ę
jej składowe, Najwa
ż
niejsze
z nich to pola i metody.
• Metody s
ą
zwykle publiczne, dane – zwykle prywatne
class RachunekBankowy
{
public void Wyplata(decimal kwota)
{ ... }
public void Wplata(decimal kwota)
{ ... }
private decimal saldo;
private string klient;
}
class RachunekBankowy
{
public void Wyplata(decimal kwota)
{ ... }
public void Wplata(decimal kwota)
{ ... }
private decimal saldo;
private string klient;
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
7
„partial class”
• W C# 2.0 klas
ę
, struktur
ę
lub interfejs mo
ż
na definiowa
ć
„na
raty”, w jednym lub w ró
ż
nych plikach
ź
ródłowych. Np.
// w pliku plik1.cs:
namespace PC
{
public partial class CoOrds{
private int x;
private int y;
public CoOrds(int x, int y) {
this.x = x;
this.y = y;
}
}
}
// w pliku plik1.cs:
namespace PC
{
public partial class
CoOrds{
private int x;
private int y;
public CoOrds(int x, int y) {
this.x = x;
this.y = y;
}
}
}
// w pliku plik2.cs:
namespace PC
{
public partial class CoOrds {
public void PrintCoOrds() {
System.Console.WriteLine(
"CoOrds: {0},{1}", x, y);
}
}
}
// w pliku plik2.cs:
namespace PC
{
public partial class
CoOrds {
public void PrintCoOrds() {
System.Console.WriteLine(
"CoOrds: {0},{1}", x, y);
}
}
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
8
Dane (stan) obiektu
• Struktura danych obiektu wyznaczona jest przez klas
ę
obiektu.
• Ale warto
ś
ci danych obiektu s
ą
indywidualne dla ka
ż
dego
obiektu.
Np. obiekt klasy „RachunekBankowy” posiada własne
warto
ś
ci dla pół „saldo” i „klient”. Tylko przez przypadek te
warto
ś
ci mog
ą
by
ć
identyczne dla dwóch obiektów.
Wyplata( )
Wplata( )
saldo 12.56
klient
"Bert"
Wyplata( )
Wplata( )
saldo
12.56
klient
"Fred"
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
9
Metody
Definicja metody
Main
jest metodą. Ta sama składnia stosowana jest dla definicji
innych metod.
using System;
class ExampleClass
{
static void PrzykladowaMetoda( )
{
Console.WriteLine(„To jest metoda");
}
static void Main( )
{
// ...
}
}
using System;
class ExampleClass
{
static void PrzykladowaMetoda( )
{
Console.WriteLine(„To jest metoda");
}
static void Main( )
{
// ...
}
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
10
Wywołanie metody
• Wywoływanie metody w tej samej klasie.
– Poda
ć
nazw
ę
metody z list
ą
argumentów uj
ę
t
ą
w nawiasy.
• Wywołanie metody z innej klasy
– Nale
ż
y wskaza
ć
nazw
ę
klasy do której nale
ż
y
żą
dana metoda
– Wywoływana metoda musi by
ć
dost
ę
pna –
deklarowana ze słowem kluczowym public
• Mo
ż
na zagnie
ż
d
ż
a
ć
wywołania
– Metoda wywołuje inn
ą
metod
ę
, ta z kolei
jeszcze inn
ą
i tak dalej.
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
11
Zwracanie wyniku
• Metoda dla której
typ wyniku
jest inny ni
ż
void
musi
zwróci
ć
wynik.
• W takiej metodzie wyst
ą
pi
ć
musi instrukcja
return
, która
zwraca wynik wywołania. Np.:
• Wywołanie metody:
static int TwoPlusTwo( ) {
int a,b;
a = 2;
b = 2;
return a + b;
}
static int TwoPlusTwo( ) {
int a,b;
a = 2;
b = 2;
return a + b;
}
int x;
x = TwoPlusTwo( );
Console.WriteLine(x);
int x;
x = TwoPlusTwo( );
Console.WriteLine(x);
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
12
Instrukcja
return
• Ko
ń
czy wywołanie metody – zwykle wyst
ę
puje na
ko
ń
cu kodu metody.
• Mo
ż
e
by
ć
instrukcj
ą
wewn
ę
trzn
ą
instrukcji
warunkowej
static void PrzykladReturn( )
{
int numBeans;
//...
Console.WriteLine("Hello");
if (numBeans < 10)
return;
Console.WriteLine("World");
}
static void PrzykladReturn( )
{
int numBeans;
//...
Console.WriteLine("Hello");
if (numBeans < 10)
return;
Console.WriteLine("World");
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
13
U
ż
ycie lokalnych zmiennych
• Lokalne zmienne
– S
ą
tworzone podczas aktywacji i wykonania metody
– S
ą
dost
ę
pne jedynie w tym wywołaniu
– S
ą
usuwane wraz z zako
ń
czeniem wykonania
metody
static void przykladLokalneZmienne(int a)
// Parametr a ma charakter lokalny w tej metodzie
{
int num; // Zmienna lokalna w tej metodzie
...
}
static void przykladLokalneZmienne(int a)
//
Parametr a
ma charakter lokalny w tej metodzie
{
int num; //
Zmienna lokalna
w tej metodzie
...
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
14
Tworzenie obiektu klasy
• Definicja zmiennej dla zadanej klasy nie jest jeszcze
utworzeniem obiektu klasy.
• Do utworzenia obiektu słu
ż
y operator
new
.
class Program
{
static void Main( )
{
Time teraz;
teraz.godzina = 11;
RachunekBankowy moj = new RachunekBankowy( );
moj.Wplata(999999M);
}
}
class Program
{
static void Main( )
{
Time teraz;
teraz.godzina = 11;
RachunekBankowy moj = new RachunekBankowy( );
moj.Wplata(999999M);
}
}
godzina
minuta
teraz
moj
...
...
Nowy obiekt klasy
RachunekBankowy
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
15
Słowo kluczowe
this
• this
jest referencj
ą
do obiektu, na rzecz którego wywołano
metod
ę
• this
jest potrzebne, gdy metoda chce odwoła
ć
si
ę
do
stanu tego obiektu
class RachunekBankowy
{
...
public void UstawNazwe(string nazwa)
{
this.nazwa = nazwa;
}
private string nazwa;
}
class RachunekBankowy
{
...
public void UstawNazwe(string nazwa)
{
this.nazwa = nazwa;
}
private string nazwa;
}
Co by się stało
dla instrukcji
nazwa = nazwa; ?
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
16
Klasy zagnie
ż
d
ż
one
• Mo
ż
na definiowa
ć
klas
ę
zagnie
ż
d
ż
on
ą
w definicji innej
klasy
class Program
{
static void Main( )
{
Bank.Rachunek moj = new Bank.Rachunek( );
}
}
class Bank
{
... class Rachunek { ... }
}
class Program
{
static void Main( )
{
Bank.Rachunek moj = new Bank.Rachunek( );
}
}
class Bank
{
... class Rachunek { ... }
}
Pełna nazwa klasy zagnieżdżonej
zawiera nazwę klasy obejmującej
Pełna nazwa klasy zagnieżdżonej
zawiera nazwę klasy obejmującej
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
17
Dost
ę
p do klasy zagnie
ż
d
ż
onej
• Klasy zagnie
ż
d
ż
one równie
ż
mog
ą
posiada
ć
dost
ę
p
prywatny lub publiczny.
class Bank
{
public class Rachunek { ... } // Klasa zagnieżdżona
private class GeneratorNumeruRachunku { ... } // Klasa
// zagnieżdżona
}
class Program
{
static void Main( ) {
Bank.Rachunek ...
// nazwa jest tu dostępna;
Bank.GeneratorNumeruRachunku ...// nazwa niedostępna!
}
}
class Bank
{
public class Rachunek { ... }
// Klasa zagnieżdżona
private class GeneratorNumeruRachunku { ... }
// Klasa
// zagnieżdżona
}
class Program
{
static void Main( ) {
Bank.Rachunek ...
// nazwa jest tu dostępna;
Bank.GeneratorNumeruRachunku ...
// nazwa niedostępna!
}
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
18
3. Składowe statyczne
• Dane statyczne zawieraj
ą
informacje przeznaczone dla
wszystkich obiektów tej samej klasy
• Np. wszystkie rachunki pewnego typu dziel
ą
informacj
ę
o stopie oprocentowania. Nie jest dobrym rozwi
ą
zaniem,
gdy ka
ż
dy z obiektów zawiera swoj
ą
kopi
ę
pola
„stopaProc”.
Wyplata( )
Wplata( )
saldo 12.56
stopaProc 7%
Wyplata( )
Wplata( )
saldo
99.12
stopaProc 7%
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
19
Zmienne wspólne obiektów
• Zmienne dzielone pomi
ę
dzy obiektami klasy – wyznaczone
s
ą
przez składowe klasy zwane
polami statycznymi.
class PrzykladLicznika
{
static int nLicznik; // Pole statyczne – unikalne dla klasy
int num;
// Pole zwykłe – jedno w każdym obiekcie
static void InitLicznika() {
nLicznik = 0;
}
...
}
...
PrzykladLicznika A, B;
... // Utworzenie obiektów
PrzykladLicznika.InitLicznika(); // Zeruj nLicznik
A.nLicznik++; // nLicznik wynosi 1
B.nLicznik++; // nLicznik wynosi 2
class PrzykladLicznika
{
static
int nLicznik;
// Pole statyczne – unikalne dla klasy
int num;
// Pole zwykłe – jedno w każdym obiekcie
static void InitLicznika() {
nLicznik = 0;
}
...
}
...
PrzykladLicznika A, B;
...
// Utworzenie obiektów
PrzykladLicznika.InitLicznika();
// Zeruj nLicznik
A.nLicznik++;
// nLicznik wynosi 1
B.nLicznik++;
// nLicznik wynosi 2
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
20
Przesłanianie nazw
• Kompilator nie ostrzega, gdy wyst
ą
pi konflikt nazw
zmiennych lokalnych i statycznych. Np.
class PrzykladPrzeslaniania
{
static int numItems = 0; // Pole statyczne
static void Metoda1()
{
int numItems = 42; // Zmienna lokalna –
// przesłania pole statyczne
...
}
static void Metoda2()
{
numItems = 61; // Odwołanie do pola klasy
}
}
class PrzykladPrzeslaniania
{
static int numItems = 0;
// Pole statyczne
static void Metoda1()
{
int numItems = 42;
// Zmienna lokalna –
// przesłania pole statyczne
...
}
static void Metoda2()
{
numItems = 61;
// Odwołanie do pola klasy
}
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
21
Metody statyczne
• Statyczne metody mog
ą
odwoływa
ć
si
ę
jedynie do
danych statycznych.
• Statyczn
ą
metod
ę
wywołuje si
ę
na rzecz klasy a nie
obiektu.
StopaProcentowa( )
stopaProc 7%
Wyplata( )
Wplata( )
saldo
99.12
klient "Fred"
Obiekt klasy „Rachunek”
Klasa „Rachunek”
Z klasą związane są
dane statyczne i metody statyczne
Poprzez obiekt mamy dostęp do
stanu obiektu i do zwykłych metod
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
22
Metody statyczne
• Statyczne metody mog
ą
odwoływa
ć
si
ę
jedynie do
danych statycznych
class Time
{
...
public static void Reset(Time t)
{
t.hour =0; // OK
t.minute = 0; // OK
hour = 0; // Błąd kompilacji
minute = 0; // Błąd kompilacji
}
private int hour, minute;
}
class Time
{
...
public static void Reset(Time t)
{
t.hour =0; // OK
t.minute = 0; // OK
hour = 0;
// Błąd kompilacji
minute = 0;
// Błąd kompilacji
}
private int hour, minute;
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
23
4. Kapsułkowanie – poziomy
dost
ę
pu do składowych
• Klasa stanowi odr
ę
bny
zakres definicji nazw
– stanowi
swego rodzaju
kapsuł
ę
:
– Mamy poł
ą
czenie definicji danych i metod w jednej
kapsule (zakresie klasy)
– Istnieje wn
ę
trze
kapsuły (zakresu klasy) i jej
zewn
ę
trze
Wyplata( )
Wplata( )
saldo
Wyplata( )
Wplata( )
saldo
Tak. RachunekBankowy
.
Czy RachunekBankowy ?
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
24
Kapsułkowanie - kontrola dost
ę
pu
• Metody s
ą
zwykle publiczne (public), czyli dost
ę
pne z
zewn
ą
trz kapsuły (zakresu klasy)
• Dane s
ą
zwykle prywatne (private), czyli dost
ę
pne
jedynie z wewn
ą
trz
Wyplata( )
Wplata( )
saldo
Wyplata( )
Wplata( )
saldo
Pole „saldo” nie jest dostępne z zewnątrz
Wszystko jest dostępne z zewnątrz
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
25
Zalety kapsułkowania
• Pozwala na kontrol
ę
dost
ę
pu
Korzystanie z obiektu jest
mo
ż
liwe z zewn
ą
trz poprzez
metody publiczne
• Pozwala na modyfikacje kodu
Sposób korzystania z obiektu
nie ulega zmianie, je
ś
li
modyfikujemy jedynie
prywatne składowe
Wyplata( )
Wplata( )
dollar 12
Wyplata( )
Wplata( )
saldo 12.56
cent 56
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
26
5. Obiekty a zmienne referencyjne
• Typ dla warto
ś
ci
– Jego
zmienna
zawiera warto
ść
danego typu
– Np:
char, int
42
42
int mol;
mol = 42;
int mol;
mol = 42;
•
•
string mol;
mol = "Hello";
string mol;
mol = "Hello";
Hello
Hello
Typ referencyjny
Jego zmienna zawiera
odniesienie do warto
ś
ci
(do danej)
Dana jest pami
ę
tana w
oddzielnym miejscu
pami
ę
ci
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
27
Definiowanie i zerowanie zmiennej
referencyjnej
• Definicja zmiennej referencyjnej:
Coordinate c1;
c1 = new Coordinate();
c1.x = 6.12;
c1.y = 4.2;
Coordinate c1;
c1 = new Coordinate();
c1.x = 6.12;
c1.y = 4.2;
•
•
6.12
6.12
4.2
4.2
c1 = null;
c1 = null;
•
•
6.12
6.12
4.2
4.2
Zerowanie zmiennej referencyjnej
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
28
Niezdefiniowane referencje
• Odwołania realizowane poprzez niezainicjalizowane
referencje s
ą
wykrywane podczas kompilacji – kompilator
wygeneruje bł
ą
d.
• Zerowe referencje s
ą
wykrywane podczas wykonania
programu - system wygeneruje wyj
ą
tek.
Coordinate c1;
c1.x = 6.12; // Błąd: niezainicjowana zmienna
Coordinate c1;
c1.x = 6.12;
// Błąd: niezainicjowana zmienna
try { c1.x = 45;
}
catch (NullReferenceException) {
Console.WriteLine”c1 jest zerowy”);
}
try { c1.x = 45;
}
catch (NullReferenceException) {
Console.WriteLine”c1 jest zerowy”);
}
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
29
Operacje porównania warto
ś
ci i
referencji
• Porównywanie zmiennych typów dla warto
ś
ci:
– Operatory == , != porównuj
ą
warto
ś
ci .
• Porównywanie zmiennych referencyjnych (za wyj
ą
tkiem
String):
– Operatory == , != porównuj
ą
referencje a nie warto
ś
ci
– Nie mo
ż
na stosowa
ć
operatorów <, >, <=, >=
•
•
1.0
1.0
2.0
2.0
•
•
1.0
1.0
2.0
2.0
Różne referencje
mimo tych samych
wartości obiektów
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
30
Wielokrotne referencje do jednego
obiektu
• Dwie zmienne referencyjne mog
ą
referowa
ć
ten sam
obiekt
Coordinate c1= new Coordinate( );
Coordinate c2;
c1.x = 2.3; c1.y = 7.6;
c2 = c1;
Console.WriteLine(c1.x + " , " + c1.y);
Console.WriteLine(c2.x + " , " + c2.y);
Coordinate c1= new Coordinate( );
Coordinate c2;
c1.x = 2.3; c1.y = 7.6;
c2 = c1;
Console.WriteLine(c1.x + " , " + c1.y);
Console.WriteLine(c2.x + " , " + c2.y);
•
•
2.3
2.3
7.6
7.6
•
•
c1
c2
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
31
6. Klasa
Object
. Typ
object
.
• Typ
object
jest synonimem klasy
System.Object
– jest to
bazowa klasa wszystkich klas j
ę
zyka C# .
• Wszystkie klasy dziedzicz
ą
(jawnie lub niejawnie) klas
ę
Object
.
Exception
Exception
SystemException
SystemException
MojaKlasa
MojaKlasa
Object
Object
String
String
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
32
Wspólne metody wszystkich klas
• Klasa
Object
posiada metody dziedziczone przez
wszystkie klasy w C# :
– ToString – konwersja obiektu na String – domy
ś
lna
definicja w klasie Object zwraca nazw
ę
typu dla
obiektu.
– Equals – porównuje dwie referencje do obiektów
– GetType – podaje informacj
ę
czasu wykonania o typie
– Finalize – metoda wołana przed usuni
ę
ciem obiektu
Punkt p = new Punkt();
Console.WriteLine(p.ToString()); // Wyprowadzi napis: „Punkt”
Punkt p = new Punkt();
Console.WriteLine(p.ToString());
// Wyprowadzi napis: „Punkt”
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
33
7. Klasa
String
• Typ
string
-
przeznaczony do reprezentacji sekwencji
znaków (napisów) w
Unikodzie
• Jest to skrótowa nazwa dla klasy
System.String
• Reprezentuje
niemodyfikowalne napisy
• Klasa
StringBuilder
wspomaga operacje na
String-
ach –
reprezentuje
wewn
ę
trznie
modyfikowalne
napisy,
zamieniane na koniec na napisy typu
string
string s = "Hello";
...
s[0] = 'c'; // Błąd kompilacji – próba zmiany napisu
string s = "Hello";
...
s[0] = 'c';
// Błąd kompilacji –
próba zmiany napisu
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
34
Metody klasy
String
• Indeksowanie [ ]
• Insert -
wstawianie
• Własno
ść
Length
• Copy -
kopiowanie
• Concat -
poł
ą
czenie
string s = "Alfabet";
char znak= s[2]; // ‘f’
string s = "Alfabet";
char znak= s[2]; // ‘f’
string s = "On jest wielki";
s = s.Insert(3, "nie ");
Console.WriteLine(s); // „On nie jest wielki”
string s = "On jest wielki";
s = s.Insert(3, "nie ");
Console.WriteLine(s); // „On nie jest wielki”
string msg = "Hello";
int dlug = msg.Length; // 5
string msg = "Hello";
int dlug = msg.Length; // 5
string s1 = "Hello";
string s2 = String.Copy(s1);
string s1 = "Hello";
string s2 = String.Copy(s1);
string s = String.Concat("a", "b", "c");
string s = String.Concat("a", "b", "c");
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
35
Metody klasy
String
• Trim
– usuwa poprzedzaj
ą
ce i ko
ń
cz
ą
ce spacje
• ToUpper
,
ToLower
– zamiana na „du
ż
e” i „małe” litery
string s = " Hello ";
s = s.Trim();
Console.WriteLine(s); // Hello
string s = " Hello ";
s = s.Trim();
Console.WriteLine(s);
// Hello
string sT = "Przedmiot Jimp";
Console.WriteLine(sT.ToUpper( )); // PRZEDMOT JIMP
Console.WriteLine(sT.ToLower( )); // przedmiot jimp
string sT = "Przedmiot Jimp";
Console.WriteLine(sT.ToUpper( ));
// PRZEDMOT JIMP
Console.WriteLine(sT.ToLower( ));
// przedmiot jimp
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
36
Porównania napisów
• Operatory
==
i
!=
mog
ą
by
ć
stosowane dla porównania 2
napisów typu
string
• Metoda
Equals
( 2 wersje – klasowa i zwykła)
• ==
jest równowa
ż
ne
String.Equals
;
!=
jest równowa
ż
ny
!String.Equals
string a = "Test";
string b = "Test";
if (a == b) ... // Wynik porównania: true
string a = "Test";
string b = "Test";
if (a == b) ... // Wynik porównania: true
W.Kasprzak: JiPP 3
5. Klasy autonomiczne
37
Porównania napisów
• Metoda
Compare –
sprawdza kolejno
ść
leksykograficzn
ą
.
Zwraca ujemn
ą
warto
ść
, zero lub dodatni
ą
warto
ść
.
Np.
string s1 = ”Ala”;
string s2 = ”Jola”;
int comp = String.Compare(s1, s2);
// wynik ujemny
• 3-argumentowa wersja
Compare
–
ignoruj lub nie
rozró
ż
nienie „du
ż
e / małe” litery.
Np.
string s1 = ”Ala”;
string s2 = ”ala”;
int comp =String.Compare(s1,s2, true);
//ignoruj różnicę
„a” „A”