INTRODUCERE
Cuprins
• Mediul .NET şi limbajul C#
• Structura programelor C#
• Operaţii cu consola
2
Mediul .NET şi limbajul C#
• Limbajul C#:– limbaj de programare relativ nou
– firma MicroSoft l-a anunţat în anul 2000 şi l-a lansatîn ianuarie 2002
– proiectat pentru a lucra în mediul .NET
• Caracteristici de bază: – simplitate, obiectual, puternic tipizat (type safe),
– derivat din limbajele C şi C++, din Java precum şi din VB respectiv Delphi
3
• .NET
• Mediu pentru dezvoltarea şi execuţia unor
aplicaţii, având următoarele caracteristici:
– uşurinţa în dezvoltarea unor servicii web
– servicii runtime (în timpul execuţiei) disponibile pentru
componente scrise în diverse limbaje de programare
– interoperabilitate între limbaje şi chiar între platform
• Mediile de programare își instalează automat
versiunea de .NET necesară
• Versiuni: 1.0 ... 4.5
4
• CLR (Common Language Runtime)
– set de resurse standard ce pot fi folosite de aplicaţiile
.NET, indiferent de limbajul în care au fost realizate:
• modelul de programare obiectual:
– moştenire, polimorfism, tratarea excepţiilor,
managementul automat al memoriei
• facilităţi de securitate
• un sistem de tipuri
• clasele de bază .NET
• unelte pentru dezvoltare, depanare şi profilare
• managementul execuţiei şi codului
• translatoare şi optimizatoare de la limbajul IL către
limbajul maşină
Terminologie de bază
5
• CTS (Common Type System)– Se referă la toate tipurile suportate de partea .NET
runtime şi ca urmare la tipurile ce pot fi folosite de aplicaţii
– Există însă limbaje ce nu suportă chiar toate tipuriledin CTS
• CLS (Common Language Specification)– Este un subset al CTS pe care toate limbajele .NET
îl suportă
– Ca urmare, un program care utilizează tipuri din CLS poate interacţiona cu alte programe scrise înalte limbaje .NET
6
• IL (Intermediate Language) sau MSIL sau CIL (Common
Intermediate Language)
– Este un limbaj intermediar între codul sursă .NET şi
codul maşină dar independent de maşină
– Orice program .NET este compilat şi rezultă un
program în limbajul IL
– Apoi această formă este convertită în cod maşină în
momentul în care acel software este instalat sau la
execuţie de către compilatorul JIT (Just In Time)
– Platforma .NET este organizată în jurul CLR (similar
cu JVM) şi un set de biblioteci ce pot fi folosite de mai
multe limbaje de programare şi pot lucra împreună ca
urmare a compilării într-un limbaj intermediar comun
7
• .NET
8
9
• Un program C#: o colecţie de tipuri, definite în fişiere, ce
sunt organizate în spaţii de nume (namespace), care
sunt compilate în module şi apoi grupate în ansambluri
(assembly)
• In general, aceste unităţi organizatorice se pot
suprapune:
– un ansamblu poate conţine mai multe spaţii de nume iar
un spaţiu de nume poate fi inclus în mai multe ansamble,
ş.a.m.d.
• Organizarea fişierelor este nesemnificativă pentru
compilatorul C#:
– un întreg proiect poate fi cuprins într-un singur fişier
2. Structura programelor C#
10
• Program C#:
11
Spaţii de nume. Ansambluri. Aplicaţii
• Un spaţiu de nume este de fapt o secţiune de
cod identificată printr-un nume:
– Se folosesc ca urmare a lucrului în echipă:
• este foarte posibil ca programatori diferiţi să utilizeze
aceleaşi nume pentru entităţi diferite (clase, functii,…)
– Un spaţiu de nume permite gruparea unor tipuri
corelate într-o manieră ierarhică (similar cu folderele)
– Prin convenţie, spaţiul de nume cel mai exterior este
numele organizaţiei, urmat de numele proiectului iar
cel mai interior spaţiu de nume se referă la un
domeniu specific12
• De exemplu:
namespace MyCompany {
namespace MyProduct {
class Point {
…
}
}
…
}
• Care mai poate fi scris şi astfel:
namespace MyCompany.MyProduct {
class Point {
…
}
…
}13
• Numele complet al unui tip include şi spaţiile de
nume în care a fost definit:
namespace Proiect_de_test
{
class Test {
static void Main ( ) {
MyCompany.MyProduct.Point x;
…
}
}
}
14
• Această calificare completă poate fi evitată prin utilizarea unei directive using:– prin care se cere compilatorului să recunoască
numele dintr-un spaţiu de nume:
namespace Proiect_de_test {
using MyCompany.MyProduct;
class Test {
static void Main ( ) {
Point x;
…
}
}
}
15
• In cazul spaţiilor de nume imbricate există posibilitatea asocierii unui nume (alias) unei construcţii formate din mai multe spaţii de nume:
using System;
using csProd = MyCompany.MyProduct;
namespace Proiect_de_test {
class Test {
static void Main ( ) {
csProd.Point x;
…
}
}
}
16
• Un spaţiu de nume poate conţine clase, structuri,
interfeţe, delegări şi enumerări
• .NET foloseşte spaţiile de nume pentru a organiza
bibliotecile de clase în manieră ierarhică
• Există şi un spaţiu de nume global:
– în cadrul căruia sunt declarate implicit toate celelalte
spaţii de nume şi tipuri
– dacă un tip nu este declarat explicit în cadrul unui
spaţiu de nume, acesta poate fi utilizat fără nici o
calificare în orice alt spaţiu de nume deoarece face
parte din spaţiul de nume global
17
• Ansamblurile se folosesc, în principal, pentru
împachetarea fizică:
– Un ansamblu poate conţine tipuri, cod executabil
pentru implementarea tipurilor cât şi referinţe la alte
ansambluri
– Tipuri de ansambluri:
• aplicaţii
• biblioteci
– O aplicaţie are un punct de intrare principal şi are de
obicei extensia .exe
– Bibliotecile nu au un punct de intrare principal şi au
de obicei extensia .dll
18
• La lansarea în execuţie a unei aplicaţii se crează
un domeniu al aplicaţiei ce acţionează ca şi un
container şi permite izolarea aplicaţiilor între ele:
– tipurile încărcate într-un domeniu de aplicaţie diferă
de aceleaşi tipuri încărcate în alt domeniu de aplicaţie
iar instanţele tipurilor nu sunt partajate între domeniile
de aplicaţii
• Lansarea unei aplicaţii se face atunci când
mediul de execuţie apelează o metodă anume
numită şi punct de intrare
• Aceasta metodă este întotdeauna numită Main( )
şi poate avea numai una din următoarele
semnături:19
• static void Main( )
{…}
• static int Main( )
{…}
• static void Main(string[ ] args)
{…}
• static int Main(string[ ] args)
{…}
20
• Dacă metoda Main( ) returnează tipul întreg:
– valoarea returnată reprezintă un cod de stare a
terminării aplicaţiei şi se foloseşte pentru a comunica
mediului de execuţie dacă execuţia s-a terminat cu
succes sau nu
– în acest caz este obligatorie prezenţa unei instrucţiuni
return expresie în corpul metodei
– de regulă, se returnează valoarea 0 pentru a specifica
că programul s-a executat cu succes sau o valoare
nenulă în cazul apariţiei unei erori în timpul execuţiei
• Dacă metoda Main( ) nu returnează nimic:
– se foloseşte forma void Main( ) şi execuţia aplicaţiei
se termină după execuţia ultimei instrucţiuni din
această metodă21
• Dacă nu există parametri:– se foloseşte forma Main( ) şi nu se specifică cuvântul
cheie void
• Dacă metoda Main( ) are un parametru:– acesta se foloseşte pentru parametrii aplicaţiei (de
obicei parametri din linia de comandă)
– parametrul metodei Main este întotdeauna un tablou de şiruri, cu indicii pornind de la 0 şi nu poate avea valoarea null
• Metoda Main( ) este o metodă statică:– pentru că nu depinde de existenţa unei instanţe a
unei clase
– ca urmare poate fi apelată independent de existenţa unui obiect
22
Observaţii
• Majoritatea aplicaţiilor au o singură metodă Main( ):– însă pot exista mai multe metode Main( ) în spaţii de
nume diferite dar numai una va fi punctul de intrare în aplicaţie
• aceasta trebuie specificată la lansarea în execuţie a aplicaţiei
• Nu există o separare între declarare şi implementare (în C++: fişiere antet şi fişiere sursă):– tot codul este plasat într-un singur fişier sursă (nume-
fişier.cs)
23
• Caracterul ‘;’ se foloseşte ca şi separator între
instrucţiuni
• In C# codul este plasat în clase iar clasele sunt
grupate în spaţii de nume
– la modul cel mai simplu există o singură clasă, într-un
singur fişier, cu un spaţiu de nume implicit
24
• Exemplu:
Fişierul Hello.cs
using System;
class Hello {
static void Main( ) {
Console.WriteLine("Hello World");
}
}
25
Clase de bază• Spaţiu de nume Clase conţinute
System Clase fundamentale folosite frecvent (clasa object, tipuri fundamentale: int, string, double,…)
System.Reflection Clase ce permit examinarea datelor ce descriu ansamblurile, obiectele şi tipurile (metadate)
System.IO Intrări şi ieşiri. Operaţii pe fişiere
System.Collections Tablouri, liste, liste înlănţuite şi alte structuri
System.Web Clase folosite pentru generarea paginilor web utilizând ASP+
System.Net Clase folosite pentru cereri în reţea sau în Internet
System.Data Clase ADO+ ce uşurează accesul la date din baze de date relaţionale sau alte surse
System.WinForms Clase ce permit afişarea unor controale Windows
Microsoft.Win32 Funcţii accesibile anterior prin funcţii Win32 API (de exemplu accesul la regiştri) 26
Intrări/ieşiri de la consolă
• Clasa Console asigură accesul la intrarea standard, ieşirea standard şi la fluxuri standard de erori:– intrarea standard este asociată consolei în intrare
adică tastaturii
– ieşirea standard şi fluxul standard de erori sunt asociate consolei în ieşire adică ecranului
• Clasa Console poate fi utilizată în aplicaţii consolă adică aplicaţii care se execută într-o fereastră de comenzi
27
Afişarea datelor
• Pentru afişarea datelor se pot folosi metodele:
Console.Write( );
Console.WriteLine( );
• Aceste metode sunt supraîncărcate:– se pot folosi cu un număr variabil de parametri
– se pot folosi cu parametri de tipuri diferite astfel că se pot afişa simplu numere, caractere, şiruri
• Primul parametru este un şir de caractere care specifică cum sunt afişate datele:– acest parametru care poate conţine marcaje
(placeholder) ce sunt înlocuite în ordine cu parametriiurmători (din lista de parametri) 28
• Forma unui marcaj (placeholder):
{N, M:Sir_de_formatare}
• unde:– N este numărul de ordine al parametrului ce urmează
a fi afişat
– M permite specificarea dimensiunii câmpului şi a modului de aliniere în cadrul câmpului
– Sir_de_formatare permite specificarea modului în care vor fi afişate valorile numerice:
• acest şir poate conţine un caracter care poate fi urmat de un număr ce dă numărul de digiţi afişati sau numărul de cifre zecimale
29
• Specificatori numerici:
Tip specificator Şirul rezultat Tip data
C[n] $XX,XX.XX Moneda locală
($XX,XXX.XX)
D[n] [-]XXXXXXX Valori zecimale
E[n] or e[n] [-]X.XXXXXXE+xxx Afişare cu exponent (format ştiinţific)
[-]X.XXXXXXe+xxx
[-]X.XXXXXXE-xxx
[-]X.XXXXXXe-xxx
F[n] [-]XXXXXXX.XX Afişare în virgulă fixă
G[n] General-ştiinţific Format general: varianta cea mai compactă
N[n] [-]XX,XXX.XX Numere ce includ şi separatori
P[n] [-]XX,XXX.XX % Procente
R Valori reale cu rotunjiri
X[n] sau x[n] Hex Hexazecimal 30
• In cazul valorilor de tip DateTime, se pot folosi alţi descriptori pentru afişarea datei şi a timpului:
Specificator Şirul rezultat
d MM/dd/yyyy
D dddd, MMMM dd, yyyy
f dddd, MMMM dd, yyyy HH:mm
F dddd, MMMM dd, yyyy HH:mm:ss
g MM/dd/yyyy HH:mm
G MM/dd/yyyy HH:mm:ss
m, M MMMM dd
r, R Ddd, dd MMM yyyy HH:mm:ss GMT
s yyyy-MM-ddTHH:mm:ss
t HH:mm
T HH:mm:ss
u yyyy-MM-dd HH:mm:ssZ
U dddd, MMMM dd, yyyy HH:mm:ss
y, Y MMMM, yyyy 31
– Afişarea şirurilor se face direct fără şir de formatare:
Console.WriteLine(“Suma dintre {0} si {1} este {2}”,
10, 20, 10+20);
Console.WriteLine(“Suma dintre {0,-8} si {1,-8} este
{2,8}”, 10, 20, 10+20);
– Dacă dorim conversia unei valori dintr-o variabilă
către un şir de caractere avem la dispoziţie metoda
ToString( ) ce poate fi folosită direct, pentru o
variabilă astfel:
int Age = 15;
Console.WriteLine("Age: {0}", Age.ToString( ));
32
• Exemplul 1:using System;
class TestDefaultFormats
{
static void Main( )
{
int i = 654321;
Console.WriteLine("{0:C}", i); // $654,321.00
Console.WriteLine("{0:D}", i); // 654321
Console.WriteLine("{0:E}", i); // 6.543210E+005
Console.WriteLine("{0:F}", i); // 654321.00
Console.WriteLine("{0:G}", i); // 654321
Console.WriteLine("{0:N}", i); / 654,321.00
Console.WriteLine("{0:P}", i); // 65,432,100.00 %
Console.WriteLine("{0:X}", i); // 9FBF1
Console.WriteLine("{0:x}", i); // 9fbf1
}
}33
• Exemplul 2:
using System;
class TestIntegerFormats
{
static void Main( )
{
int i = 123;
Console.WriteLine("{0:C6}", i); // $123.000000
Console.WriteLine("{0:D6}", i); // 000123
Console.WriteLine("{0:E6}", i); // 1.230000E+002
Console.WriteLine("{0:G6}", i); // 123
Console.WriteLine("{0:N6}", i); // 123.000000
Console.WriteLine("{0:X6}", i); // 00007B
34
i = -123;
Console.WriteLine("{0:C6}", i); // ($123.000000)
Console.WriteLine("{0:D6}", i); // -000123
Console.WriteLine("{0:E6}", i); // -1.230000E+002
Console.WriteLine("{0:G6}", i); // -123
Console.WriteLine("{0:N6}", i); // -123.000000
Console.WriteLine("{0:X6}", i); // FFFF85
}
}
35
• Exemplul 3:using System;
class TestDateTimeFormats
{
static void Main( )
{
DateTime dt = new DateTime(2007, 10, 23, 19, 15, 33);
Console.WriteLine(dt.ToString()); // "10/23/2007 7:15:33 PM"
Console.WriteLine("{0}", dt); // "10/23/2007 7:15:33 PM"
Console.WriteLine("{0:d}", dt); // "10/23/2007"
Console.WriteLine("{0:D}", dt); // "Tuesday, October 23, 2007"
Console.WriteLine("{0:t}", dt); // "7:15 PM"
Console.WriteLine("{0:T}", dt); // "7:15:33 PM"
Console.WriteLine("{0:u}", dt); // "2007-10-23 19:15:33Z"
}
} 36
Citirea datelor
• Pentru citirea datelor se pot folosi metodele:
int Console.Read( );
string Console.ReadLine( );
• Metoda Read( ):– citeşte un caracter de la consolă
– returnează codul caracterului sau valoarea –1 dacănu există un caracter disponibil
• Metoda ReadLine( ):– citeşte un şir de caractere până la întâlnirea
caracterului CR
– returnează acest şir 37
• Pentru citirea datelor se mai pot folosi:
property bool KeyAvailable;
ConsoleKeyInfo ReadKey( );
ConsoleKeyInfo ReadKey (bool intercept);
• Proprietatea KeyAvailable specifică dacă s-a apăsat o
tastă caracter sau taste funcţionale
• Metodele ReadKey( ) permit citirea tastei apăsate dar şi
a stării tastelor CTRL, ALT, SHIFT prin intermediul unui
obiect de tipul ConsoleKeyInfo
– prima variantă afişează tasta apăsată la consolă
– a doua variantă permite specificarea acestei opţiuni prin
intermediul parametrului
– ambele variante aşteaptă până se apasă o tastă caracter sau
una funcţională38
• In C# se pot citi de la consolă direct numaicaractere individuale sau şiruri de caractere:
string input = Console.ReadLine( );
Console.WriteLine(“{0}”, input);
• Dacă avem nevoie de citirea altor tipuri atuncitrebuie să facem diferite conversii:– platforma .NET furnizează un mecanism numit parse
şi o metodă Parse( ) pentru astfel de operaţii :
Tip.Parse(string);
39
• Exemplul 1:
using System;
class ReadFromConsole
{
public static void Main( )
{
Console.Write("Introduceti numele: ");
string strNume = Console.ReadLine( );
Console.Write("Introduceti prenumele: ");
string strPrenume = Console.ReadLine( );
Console.Write("Introduceti varsta: ");
string strVarsta = Console.ReadLine( );
Console.WriteLine( );
Console.WriteLine("Nume: " + strNume);
Console.WriteLine("Prenume: " + strPrenume);
Console.WriteLine("Varsta: " + strVarsta);
}
} 40
• Exemplul 2:
using System;
class ReadFromConsole
{
public static void Main( )
{
string myInput;
int myInt;
Console.Write("Introduceti un numar: ");
myInput = Console.ReadLine( );
myInt = Int32.Parse(myInput);
Console.WriteLine("Numarul introdus este: {0}.", myInt);
Console.Write("Introduceti un sir: ");
myInput = Console.ReadLine( );
Console.WriteLine("Sirul introdus este: {0}.", myInput);
41
DateTime dt;
Console.Write("Introduceti o data calendaristica(dd-mm-yyyy): ");
dt = DateTime.Parse(Console.ReadLine( ));
Console.Write("Data & Timpul: ");
Console.WriteLine(dt);
Console.WriteLine("\t{0:D}", dt);
}
}
42
Top Related