Osnovni koncept generičkih tipova
Ponavljanje gradiva: , ,
1. Pokrenuti Visual Studio
2. Kreirati novi projekat
- File → New → Project.
- U prozoru za novi projekat, prvo se bira Visual C# ispod opcije Installed Templates.
- Zatim se bira Console Application.
- U donjem delu prozora se unosi naziv projekta (npr. Primer1 ili MojaAplikacija1) i lokacija na disku gde treba da se projekat sačuva.
- I na kraju, klik na OK.
3. Definisati glavni kod aplikacije
Kada se otvori novi projekat, sa desne strane, u Solution Explorer-u,vidi se projekat i sve u njemu. U okviru projekta je fajl Program.cs u kojem je osnovni kod C# aplikacije.
Kako to obično izgleda na početku:
using System;
namespace MojaAplikacija // Naziv namespace-a se obično poklapa sa nazivom projekta!
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, world!");
Console.ReadLine();
}
}
}
4. Pokrenuti aplikaciju na jedan od sledeća dva načina
- opcija: pritisnuti F5 ili u meniju odabrati Debug → Start Debugging.
- ako se na kraju programa koristi
Console.ReadLine()iliConsole.ReadKey()- konzola će se otvoriti i odradiće šta god da je u programu.
- aplikacija će čekati unos od strane korisnika zbog
Console.ReadLine()iliConsole.ReadKey()komande.
- ako se ne koriste komande koje čekaju unos korisnika, tada će program da se izvrši i automatski zatvori
- ako se na kraju programa koristi
- opcija je da se koristi CTRL+F5 ili Debug → Start Without Debugging.
- tada će da se program izvrši i da čeka sa porukom tipa: "Press any key to continue..."
- nema potrebe za unosom komandi koje čekaju da korisnik nešto unese
5. Zatvoriti konzolu
Pritiskom na taster Enter, konzola će se zatvoriti i program će se završiti.
U konzolnoj aplikaciji u C#, za ispis teksta se koristi jedna od metoda Console.WriteLine() ili Console.Write() iz klase Console.
1. Console.WriteLine()
Metoda Console.WriteLine() ispisuje tekst u konzolu i prelazi u novi red nakon ispisa.
Console.WriteLine("Dobar dan ");
Kako to izgleda:
using System;
namespace MojaAplikacija
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Dobar dan!"); // Ispisuje poruku i prelazi u novi red
}
}
}
2. Console.Write()
Metoda Console.Write() ispisuje tekst, ali ne prelazi u novi red nakon ispisa, što znači da će sledeći ispis biti na istoj liniji.
Console.Write("Ovo je ispis bez prelaska u novi red.");
Console.Write(" Nastavlja na istoj liniji."); // ako se ne unese razmak na početku, onda se reči "prilepe"
Primer kombinovanja
Obe metode mogu da se koriste zajedno u cilju boljeg izgleda priikom ispisa:
using System;
namespace MyConsoleApp
{
class Program
{
static void Main(string[] args)
{
Console.Write("Ime: ");
Console.WriteLine("Marko"); // Ispisuje ime i prelazi u novi red
Console.Write("Prezime: ");
Console.WriteLine("Marković"); // Ispisuje prezime u novom redu
}
}
}
Rezultat ovog koda biće:
Ime: Marko Prezime: Marković
Tekst (ili bilo koji drugi unos) od strane korisnika se vrši korišćenjem metode Console.ReadLine() iz klase Console. Ova metoda čita ceo red teksta koji korisnik unese u konzolu i vraća ga kao string.
Primer unosa i ispisa teksta:
using System;
namespace MojaAplikacija
{
class Program
{
static void Main(string[] args)
{
// Pitanje za korisnika
Console.WriteLine("Unesite svoje ime:");
// Unos korisnika
string ime = Console.ReadLine();
// Ispis unešenog imena
Console.WriteLine("Zdravo, " + ime + "!");
}
}
}
Objašnjenje:
- Console.WriteLine("Unesite svoje ime:") – Ispisuje poruku u konzolu i prelazi u novi red.
- string ime = Console.ReadLine() – Ova linija koda čeka da korisnik unese tekst i pritisne Enter. Tekst koji korisnik unese se čuva u promenljivoj
imekao string. - Console.WriteLine("Zdravo, " + ime + "!") – Ispisuje pozdrav zajedno sa unešenim imenom.
Unos brojeva:
Opet se koristi Console.ReadLine(), gde se unosi ceo red, ali je posle toga potrebno da se uradi konverzija odgovarajući numerički tip pomoću metoda poput int.Parse() ili double.Parse() ili Convert.ToInt32() ...
Primer unosa broja:
using System;
namespace MojaAplikacija
{
class Program
{
static void Main(string[] args)
{
// Pitanje za korisnika
Console.WriteLine("Unesite broj:");
// Unos korisnika
string unos = Console.ReadLine();
// Pretvaranje stringa u ceo broj (int)
int broj = int.Parse(unos);
// Uvećanje broja za 1
broj++;
// Ispis uvećanog broja
Console.WriteLine("Uvećani broj: " + broj);
}
}
}
Zapamtite: Za unos bilo čega u konzoli se koristi Console.ReadLine() koji unosi ceo red slova, dokle god se ne pritisne Enter. Ako nam treba broj onda taj dobijeni string treba da se konvertuje u odgovarajući tip !Uvod u generičke tipove
Generički tipovi su koncept u programiranju koji omogućava kreiranje funkcija, klasa ili struktura podataka koje mogu raditi sa različitim tipovima podataka. Umesto da se piše kôd za svaki konkretan tip, generički tipovi omogućavaju pisanje opšteg koda koji može raditi sa bilo kojim tipom podataka. Ovaj pristup povećava ponovnu upotrebljivost koda i smanjuje potrebu za dupliranjem koda.
Ključni pojmovi:
- Generički tip: Tip koji je definisan sa parametrom tipa, koji se specificira kada se koristi u kodu.
- Sigurnost tipova: Osigurava da se podaci određenog tipa koriste na odgovarajući način, smanjujući mogućnost grešaka.
- Ponovna upotrebljivost koda: Mogućnost da se isti kod koristi sa različitim tipovima podataka bez potrebe za njegovim prilagođavanjem.
Primeri upotrebe generičkih tipova:
-
Generičke funkcije:
- Generičke funkcije omogućavaju kreiranje funkcija koje mogu raditi sa različitim tipovima podataka.
- Na primer, može se kreirati funkcija koja poredi dve vrednosti i vraća veću od njih, bez obzira na tip (broj, tekst, itd.).
-
Generičke kolekcije:
- Generičke kolekcije, poput lista ili nizova, mogu čuvati objekte bilo kog tipa, a tip podataka se specificira kada se kolekcija kreira.
- Na primer, može se kreirati lista celih brojeva, lista tekstova ili čak lista objekata drugih klasa.
-
- Generičke klase su šabloni koji se mogu koristiti za rad sa različitim tipovima podataka.
- Na primer, može se kreirati klasa koja predstavlja kutiju za čuvanje vrednosti bilo kog tipa.
Prednosti generičkih tipova:
- Fleksibilnost: Omogućavaju rad sa različitim tipovima podataka koristeći isti kod.
- Ponovna upotrebljivost: Smanjuju potrebu za pisanjem duplog koda za različite tipove podataka.
- Sigurnost tipova: Generički tipovi omogućavaju kompajleru da proveri ispravnost tipova podataka tokom kompajliranja, smanjujući mogućnost grešaka tokom izvršavanja programa.
Uvođenje generičkih tipova:
-
Zašto generički tipovi?
- Bez generičkih tipova, moraeo bi se kreirati posebne verzije istih klasa ili metoda za svaki tip podataka sa kojim treba da se radi.
- Na primer, ako treba kreirati klasu
Boxkoja može čuvati vrednosti različitih tipova, morale bi se kreirati posebne klase za svaki tip (BoxInt,BoxString, itd.). Generički tipovi rešavaju ovaj problem omogućavajući korišćenje jednog koda za sve tipove.
Definisanje generičke metode:
- Generičke metode omogućavaju kreiranje metoda koje mogu raditi sa različitim tipovima podataka, a tipovi se specificiraju kada se metoda poziva.
- Sintaksa:
{
Console.WriteLine(item);
}
U ovom primeru, Print<T> je generička metoda koja može raditi sa bilo kojim tipom podataka, gde T predstavlja generički tip.
Definisanje generičke klase:
- Generičke klase omogućavaju kreiranje klasa koje mogu raditi sa različitim tipovima podataka na isti način kao generičke metode.
- Sintaksa:
{
public T Value { get; set; }
public Box(T value)
{
Value = value;
}
public void Display()
{
Console.WriteLine("The value is: " + Value);
}
}
Box<T> je generička klasa koja može raditi sa bilo kojim tipom podataka, gde T predstavlja generički tip.Korišćenje generičkih tipova:
- Prilikom kreiranja objekta generičke klase, treba da se specificira tip podataka koji će se koristiti:
intBox.Display(); // Output: The value is: 123
Box<string> strBox = new Box<string>("Hello");
strBox.Display(); // Output: The value is: Hello
Vežbe za učenike:
- Kreiranje generičke metode: Kreirati generičku metodu koja vraća veći od dva broja bilo kog tipa (int, float, double).
- Kreiranje generičke klase: Kreirati generičku klasu
Pair<T1, T2>koja može čuvati par vrednosti različitih tipova podataka i implementirati metodu za prikaz ovih vrednosti.
Pitanja za diskusiju:
- Zašto su generički tipovi korisni u poređenju sa običnim tipovima?
- Kada biste koristili generičke klase, a kada generičke metode?
- Kako generički tipovi pomažu u povećanju sigurnosti tipova u vašem kodu?