W.Kasprzak: JiPP3
3. Zmienne i operacje
1
JiPP3
3. Zmienne i operacje typów
prostych
Włodzimierz Kasprzak
Włodzimierz Kasprzak
W.Kasprzak: JiPP3
3. Zmienne i operacje
2
Układ
1.
Wbudowane typy danych
2.
Nazwy zmiennych
3.
Typy wbudowane i operacje
4.
Typy „proste” definiowane przez programistę
5.
Konwersje typów
W.Kasprzak: JiPP3
3. Zmienne i operacje
3
1. Typy danych
Wśród
typów wbudowanych
języka wyróżnia się
typy proste (value-type, typ dla wartości) i
typy referencyjne.
Typ referencyjny
Typ referencyjny
Typ wbudowany j
ę
zyka
(mechanizm CTS)
Typ wbudowany j
ę
zyka
(mechanizm CTS)
Typ prosty
Typ prosty
W.Kasprzak: JiPP3
3. Zmienne i operacje
4
Porównanie typów wbudowanych
Zmienna typu prostego:
Zawiera swoją wartość.
Każda zmienna typu
prostego odnosi się do
swojego, unikalnego
miejsca w pamięci.
Operacja wykonywane
na zmiennej nie
wpływają na inne
zmienne.
Zmienna referencyjna:
Zawierają odniesienia
(ukryte adresy) do swoich
danych (obiektów).
Dwie zmienne referencyjne
mogą odnosić się do tego
samego obiektu.
Operacje na jednej
zmiennej mogą wpływać na
inne.
W.Kasprzak: JiPP3
3. Zmienne i operacje
5
Typy dla wartości - wbudowane lub programisty
Np.:
int
float
Np.:
enum
struct
Typy programisty
Typy programisty
Typy dla wartości
Typy dla wartości
Typy wbudowane
Typy wbudowane
W.Kasprzak: JiPP3
3. Zmienne i operacje
6
Typy proste – wbudowane typy dla wartości
Rozpoznawane dzięki słowom kluczowym języka:
int // Słowo kluczowe języka – alias typu
struct
- lub odpowiadających im nazwom, np. -
System.Int32 // Nazwa typu
struct
zdefiniowana
// w obszarze nazw
System
Słowa kluczowe typów prostych stanowią synonimy nazw
definiowanych jako stuktury w standardowym obszarze
nazw
System
jezyka
C#.
W.Kasprzak: JiPP3
3. Zmienne i operacje
7
Typy proste – wbudowane typy dla wartości
Słowo kluczowe dla typu i odpowiedni typ strukt
W.Kasprzak: JiPP3
3. Zmienne i operacje
8
2. Nazwy zmiennych
Zasady tworzenia nazw
Stosujemy litery, znak podkreślenia i cyfry.
Rozpoczyna się literą lub znakiem
podkreślenia.
Konwencje:
Wyłącznie duże litery tylko dla nazw
stałych symbolicznych.
Nie rozpoczynaj od podkreślenia.
Unikaj skrótów w nazwach.
Stosuj duże litery dla rozpoczęcia słowa w
wielosłowowych nazwach.
Nazwy pól klasy i parametrów rozpoczynaj
małą literą. Pozostałe nazwy rozpoczynaj
dużą literą.
different
Different
different
Different
Answer42
42Answer
Answer42
42Answer
BADSTYLE
_poorstyle
BestStyle
BADSTYLE
_poorstyle
BestStyle
Msg
Message
Msg
Message
W.Kasprzak: JiPP3
3. Zmienne i operacje
9
Słowa kluczowe C#
Słowa kluczowe są zarezerwowanymi nazwami
Nie można re-definiować słów kluczowych
spowoduje błąd kompilacji.
Unikaj nazw różniących się od słów kluczowych jedynie
rozmiarem liter, np.
abstract, base, bool, default, if, finally
abstract, base, bool, default, if, finally
int INT; // Z
ł
y styl
int INT; // Z
ł
y styl
W.Kasprzak: JiPP3
3. Zmienne i operacje
10
Słowa kluczowe C#
W.Kasprzak: JiPP3
3. Zmienne i operacje
11
Test. Które nazwy są niepoprawne i dlaczego?
char $diskPrice;
char $diskPrice;
char middleInitial;
char middleInitial;
int 12count;
int 12count;
float this;
float this;
2
2
2
3
3
3
4
4
4
1
1
1
int __identifier;
int __identifier;
5
5
5
Błąd
Błąd
Poprawne
Błąd
Poprawne
W.Kasprzak: JiPP3
3. Zmienne i operacje
12
3. Typy wbudowane i operacje
Instrukcje deklaracji zmiennych:
Wiele nazw w jednej instrukcji:
-- lub --
int itemCount;
int itemCount;
int itemCount, employeeNumber;
int itemCount, employeeNumber;
int itemCount,
employeeNumber;
int itemCount,
employeeNumber;
W.Kasprzak: JiPP3
3. Zmienne i operacje
13
Nadanie wartości zmiennej
Poprzez operację przypisania do wcześniej zdefiniowanych
zmiennych:
Poprzez inicjalizację w miejscu definicji zmiennej:
Nie można odwoływać się do wartości niezainicjalizowanej
zmiennej.
int employeeNumber;
employeeNumber = 23;
int employeeNumber;
employeeNumber = 23;
int employeeNumber = 23;
int employeeNumber = 23;
char middleInitial = 'J';
char middleInitial = 'J';
W.Kasprzak: JiPP3
3. Zmienne i operacje
14
Rozszerzone operacje przypisania
Operacja dodawania wartości do zmiennej:
Taka operacja może być też zapisana krótko:
Rozszerzone operacje przypisania występują dla
wszystkich operacji arytmetycznych, np..:
itemCount = itemCount + 40;
itemCount = itemCount + 40;
itemCount += 40;
itemCount += 40;
itemCount -= 24;
itemCount -= 24;
W.Kasprzak: JiPP3
3. Zmienne i operacje
15
Podstawowe operatory
Podstawowe Operatory
Podstawowe
Podstawowe
Operator
Operator
y
y
•
Równościowe
•
Porównania
•
Logiczne
•
Inkrementacja
•
Dekrementacja
•
Arytmetyczne
•
Przypisania
Przyk
Przyk
ł
ł
ad
ad
== !=
< > <= >= is
&& || ?:
++
- -
+ - * / %
= *= /= %= += -= <<=
>>= &= ^= |=
W.Kasprzak: JiPP3
3. Zmienne i operacje
16
Inkrementacja i dekrementacja
Zmiana wartości zmiennej o jeden
Skrótowy zapis w postaci operacji inkrementacji lub
dekrementacji
Te
operacje
występują
w
2
postaciach:
przedrostkowej i przyrostkowej
itemCount += 1;
itemCount -= 1;
itemCount += 1;
itemCount -= 1;
itemCount++;
itemCount--;
itemCount++;
itemCount--;
++itemCount;
--itemCount;
++itemCount;
--itemCount;
W.Kasprzak: JiPP3
3. Zmienne i operacje
17
Inkrementacja i dekrementacja
Te operacje są rozszerzonymi przypisaniami –
zwracają wynik:
Różnica między przedrostkową a przyrostkową
wersją operatora:
int itemCount = 0;
Console.WriteLine(itemCount += 2); // Wyprowadzi 2
Console.WriteLine(itemCount -= 2); // Wyprowadzi 0
int itemCount = 0;
Console.WriteLine(itemCount += 2); // Wyprowadzi 2
Console.WriteLine(itemCount -= 2); // Wyprowadzi 0
int itemCount = 42;
int prefixValue = ++itemCount; // prefixvalue = 43
int postfixValue = itemCount++;//postfixvalue = 43
int itemCount = 42;
int prefixValue = ++itemCount; // prefixvalue = 43
int postfixValue = itemCount++;//postfixvalue = 43
W.Kasprzak: JiPP3
3. Zmienne i operacje
18
Wiązanie i priorytet operatora
Wiązanie operatora w wyrażeniu złożonym
Za wyjątkiem operatorów przypisania wszystkie
operatory
2-argumentowe
posiadają
wiązanie
lewostronne.
Operatory przypisania i 3-argumentowy (?:) posiadają
wiązanie prawo-stronne.
W.Kasprzak: JiPP3
3. Zmienne i operacje
19
4. Typy „proste” definiowane przez
programistę
Typy
„dla
wartości”
definiowane
przez
programistę:
Typy wyliczeniowe
Struktury
W.Kasprzak: JiPP3
3. Zmienne i operacje
20
Typy wyliczeniowe
Definicja typu wyliczeniowego
Zmienna typu wyliczeniowego
Korzystanie ze zmiennej
enum Color { Red, Green, Blue }//Nada wartości 0,1,2
enum Color { Red, Green, Blue }//Nada wartości 0,1,2
Color colorPalette = Color.Red;
Color colorPalette = Color.Red;
Console.WriteLine(“{0}”, colorPalette);//Wyświetli Red
Console.WriteLine(“{0}”, colorPalette);//Wyświetli Red
W.Kasprzak: JiPP3
3. Zmienne i operacje
21
Struktury
Definicja typu strukturalnego
Zmienna typu strukturalnego (struktura)
Zmienne typów strukturalnych traktowane są w C# tak, jak
zmienne innych typów dla wartości – alokowane są w obszarze
stosu danych, a nie w pamięci dynamicznej danych programu.
Employee companyEmployee;
companyEmployee.firstName = "Joe";
companyEmployee.age = 23;
Employee companyEmployee;
companyEmployee.firstName = "Joe";
companyEmployee.age = 23;
public struct Employee
{
public string firstName;
public int age;
}
public struct Employee
{
public string firstName;
public int age;
}
W.Kasprzak: JiPP3
3. Zmienne i operacje
22
5. Konwersje typów danych
Niejawne konwersje
Jawne konwersje
W.Kasprzak: JiPP3
3. Zmienne i operacje
23
Niejawne konwersje typów
Konwersja z
int
do
long
:
Niejawne konwersje
nie kończą się błędem
Można utracić precyzję ale nie przekroczymy zakresu
using System;
class Test
{
static void Main( )
{
int intValue = 123;
long longValue = intValue; // Konwersja niejawna
Console.WriteLine("(long) {0} = {1}", intValue,
longValue);
}
}
using System;
class Test
{
static void Main( )
{
int intValue = 123;
long longValue = intValue;
// Konwersja niejawna
Console.WriteLine("(long) {0} = {1}", intValue,
longValue);
}
}
W.Kasprzak: JiPP3
3. Zmienne i operacje
24
Jawne konwersje typów
Wymaga użycia wyrażenia konwersji typu:
Takie konwersje mogą zakończyć się błędem. Np. W powyższym
przykładzie wystąpi
błąd przekroczenia zakresu
– wynik będzie
postaci:
(int) 9223372036854775807
-1
using System;
class Test
{
static void Main( )
{
long longValue = Int64.MaxValue;
int intValue = (int) longValue; // Jawna konwersja
Console.WriteLine("(int) {0} = {1}", longValue,
intValue);
}
}
using System;
class Test
{
static void Main( )
{
long longValue = Int64.MaxValue;
int intValue =
(int)
longValue;
// Jawna konwersja
Console.WriteLine("
(int)
{0} = {1}", longValue,
intValue);
}
}
W.Kasprzak: JiPP3
3. Zmienne i operacje
25
Jawne konwersje typów
W poprzednim przykładzie program przeszedł „do porządku”
nad błędem przekroczenia zakresu. Aby został zgłoszony
wyjątek tego typu należy użyć bloku ze słowem kluczowym
checked
: