Limbajul c sharp



Yüklə 1,48 Mb.
səhifə12/14
tarix08.01.2019
ölçüsü1,48 Mb.
#92362
1   ...   6   7   8   9   10   11   12   13   14

special,izolat de restul memoriei,in care datele de tip MSIL sunt

transformate in coduri masina.Acest mediu de executie,este de fapt un

tampon de memorie,ce poate fi procesat local,sau poate fi expediat la

orice adresa de memorie din retea.Astfel,o aplicatie .NET poate fi

executata si arhivata local,poate fi executata local si expediata la o

alta adresa de memorie din retea,sau poate fi executata la multiple adrese

din retea (adica este portabila).Singura conditie este ca la adresa de

destinatie sa existe o copie a CLR (a interpretorului).

Pe langa interpretor,platforma .NET asigura si o biblioteca extensiva

de resurse software,formata din clase,interfete,enumerari si executabile

(tools = instrumente software).Toate aceste resurse,contin principalele

tipuri de data si functii specializate pentru majoritatea operatiilor

ce se pot executa asupra acestor tipuri de data.Aplicatia nu mai trebuie

sa defineasca tipuri de data si functii,ci doar le apeleaza pe cele

standardizate.Astfel,codurile vor fi mult mai simple,mai scurte si mai

usor de verificat si depanat.

Principalele avantaje oferite de platforma .NET sunt urmatoarele:

1. -se pot combina usor modulele executabile create de autori diferiti,

de la firme si companii diferite,scrise in limbaje de programare diferite.

2. -se creaza un standard industrial comun,pentru aplicatiile ce implica

si schimb de date,sau comunicatii active in reteaua Internet.

3. -aplicatiile platformei .NET sunt puternic obiectuale,datele sunt

foarte bine protejate in nenumarate containere,asigurand astfel o foarte

buna securitate in executie.

4. -aplicatiile platformei .NET se preteaza foarte bine la orice proces

de automatizare si control automat

5. -CLR asigura managementul complet automat la memoriei cu ajutorul unui

mecanism de tip "garbage collector" asemanator cu cel din Java.

6. -asigura o compatibilitate perfecta intre diferitele versiuni ale

bibliotecilor DLL.Pentru a actualiza o astfel de biblioteca DLL,codurile

noi se adauga langa cele vechi,pastrand si functionalitatea celor perimate

7. -permite crearea unor executabile dinamice,care exista doar pentru

putin timp,doar in memoria de executie.Se pot executa astfel operatii

complexe,fara a consuma nici un byte de memorie inscriptibila.

-92-


Instalarea platformei .NET este foarte facila.Se descarca din reteaua

Internet un modul executabil,denumit dotnetfx,ce va executa automat toate

operatiile necesare.In urma instalarii,vor exista cele doua componente

distincte: mediul de executie CLR si biblioteca de clase .NET Framework

Class Library.Cele doua componente,contin urmatoarele elemente esentiale:
COMMON LANGUAGE RUNTIME
Este un sistem de operare in miniatura.Contine toate elementele

necesare pentru contentionarea si prelucrarea datelor dintr-o aplicatie.

Lucreaza cu module executabile denumite asamblari (assembly) produse de

compilatorul specializat al fiecarui limbaj de programare (csc.exe in

cazul limbajului C#).Pentru prelucrarea datelor,contine un interpretor al

limbajului MSIL,dar si un mecanism complex prin care identifica si apoi

conecteaza resursele software.Legatura dintre coduri si bibliotecile de

resurse in care se afla definitia lor,se face cu ajutorul unor metadate,

generate de compilator in momentul in care se construieste modulul

executabil.CLR,citeste metadatele din modul si apoi preia codurile necesare

din bibliotecile de clase.Dupa ce aduna si asambleaza toate elementele

necesare,CLR transforma codul intemediar in cod masina (denumit "managed

code") ce urmeaza sa fie trimis spre executie.CLR organizeaza toate

obiectele si referintele spre obiecte si tine o evidenta stricta a lor.

In momentul in care un obiect,sau o referinta nu mai este utila in

program,aceasta va fi mutat intr-un tampon de memorie auxiliar,de unde

urmeaza sa fie apoi eliberat (sters din memorie).Practic,exista mai

multe astfel de tampoane de memorie,in care datele sunt arhivate "pe

linie de asteptare",pana cand procesorul gaseste o bresa in executie

pentru eliberarea lor.Aceste tampoane au o prioritate de executie,in

functie de vechimea si importanta lor.Daca exista suficienta memorie de

executie,procesorul va executa prioritar orice alta operatie din stiva

sa de functii,dar daca memoria de executie este plina,vor avea prioritate

operatiile de eliberare a memoriei.Acest mecanism de autocontrol este

denumit generic "garbage collection" (colectarea gunoiului) si a fost

introdus pentru prima data in practica,de mediul Java.

CLR poate prelucra simultan doua sau mai multe module executabile,

chiar daca au fost generate de compilatoare diferite.Biblioteca de clase

este aceeasi,limbajul intermediar este comun,asa ca nu mai trebuie decat

sa citeasca metadatele si sa creeze conexiunile necesare dintre resurse

si coduri.In acest fel,modulele scrise in limbaje diferite pot functiona

sinergic,pentru a forma aplicatii noi.

Interpretorul pentru codurile MSIL poarta si numele de compilator JIT

(Just In Time),sau compilator instantaneu.Codurile masina sunt diferite

de la un procesor la altul,asa ca CLR trebuie sa includa cate un astfel

de compilator pentru fiecare tip de arhitectura hardware a procesorului

instalat.Este posibil ca aplicatiile .NET sa nu poata fi executate,doar

atunci cand sunt prelucrate pe un calculator cu procesor diferit de

arhitectura ce formeaza standardul comercial.Este posibil ca aplicatia

sa contina si numeroase coduri MSIL,ce nu vor fi executate decat optional

sau alternativ.Compilatorul JIT nu converteste decat codurile cu executie

imediata,crescand astfel viteza si randamentul executiei,apoi memoreaza

codurile convertite atunci cand urmeaza sa fie executate repetat.

-93-


Pe langa compilatoarele JIT,CLR contine si un alt mecanism pentru

conversia codurilor MSIL in cod masina,denumit "install-time",adica cel

generat in momentul instalarii.Prin acest mecanism,codul MSIL este

convertit complet in cod masina,in momentul instalarii in memorie si

apoi este arhivat sub forma de coduri masina.In momentul apelului,codul

masina va fi expediat spre procesor,crescand mult viteza de executie.

Acest mecanism este utilizat doar atunci cand executia nu depinde de

configuratia actuala a mediului de executie si poate fi utilizat mediul

de executie din momentul initial.

Interpretorul CLR contine si un mecansim de verificare si control,prin

care verifica daca operatiile executate nu vor genera erori de executie.

Exemplu: -daca doua sau mai multe module executate simultan solicita

operatii ce duc la suprascrierea unor adrese de memorie sau la operatii

incompatibile.Acest mecanism va verifica si politele de securitate

anexate fiecarui modul,pentru a impiedeca orice operatie neautorizata.

Toate exceptiile si erorile vor fi semnalate prin mesaje de eroare,

dublate sau nu de blocarea executiei,in functie de gravitatea erorii.

In sinteza,CLR asigura urmatoarele operatii: incarcarea si conectarea

resurselor software,verificarea erorilor,exceptiilor si a restrictiilor,

compilarea la cod masina,gestionarea memoriei,eliberarea automata a

memoriei si securizarea executiei prin contentionarea aplicatiei.
CLASS LIBRARY (bibliotecile standard)
Pentru a creste cat mai mult functionalitatea programelor,platforma

.NET ofera o colectie foarte bogata de coduri predefinite,arhivate intr-o

serie de biblioteci DLL (biblioteci cu alocare dinamica).Aceste biblioteci

contin clase,interfete si colectii de date de tip valoare.

Pentru a simplifica mamagementul memoriei,datele din biblioteci sunt

separate in containere mai mici (namespaces) cu o denumire simpla si

clara.Aceste containere sunt incluse unul in altul,intr-o ordine de tip

ierarhic,structurata dupa conexiunile ce exista intre ele.Pentru a putea

utiliza datele,se va utiliza o sintaxa in care se specifica atat numele

containerului cat si numele tipului de data apelat.

EXEMPLU: System.Collections.ArrayList desemneaza tipul de date ArrayList,

arhivat in containerul System.Collections.

Daca containerele sunt incluse unul in altul,calea de acces se va

construi cu ajutorul operatorului punct (.).

EXEMPLU:

namespace System {

namespace Collections{ ...}

}

se va scrie: System.Collections



Trebuie remarcat faptul ca o singura biblioteca poate contine numeroase

astfel de containere.Pentru a economisi memoria consumata,se poate

importa strict containerul dorit,fara a incarca intreaga fila DLL.

Cel mai important dintre containere poarta numele de System si contine

toate tipurile esentiale de data,definite sub forma de clase.Aici sunt

definite tipurile: Object,Byte,Char,Array,Int32,String...etc.Practic,

nici o aplicatie nu poate fi executata fara aceasta resursa,decat data

fiecare tip de data este definit explicit de catre utilizator.

-94-

Numarul de containere (namespaces) din biblioteca de clase,difera in



functie de versiunea .NET incarcata.Fiecare versiune noua,adauga seturi

noi de clase,grupate in containere diferite.Majoritatea lor sunt incluse

in cele doua mari containere radacina: Microsoft si System.Exista si

cateva containere izolate: Accessibility,UIAutomationClientsideProviders

si XamlGeneratedNamespace.Clasele generate de compania Microsoft sunt

grupate in containerul Microsoft.Exemple: Microsoft.Build.BuildEngine,

Microsoft.CSharp,Microsoft.JScript,Microsoft.VisualBasic,Microsoft.Win32.

Restul claselor sunt incluse in containere ce au ca radacina comuna

containerul System.Exemple: System.Activities,System.AddIn,System.CodeDom,

System.Collections,System.ComponentModel,System.Configuration,System.Data,

System.Diagnostics,System.Drawing,System.IO,System.Management,System.Net,

System.Printing,System.Redflection,System.Runtime,System.Security,System.

ServiceModel,System.Speech,System.Text,System.Web,System.Windows,System.

Workflow,System.Xaml,System.Xml...etc.Fiecare dintre aceste subcontainere

radacina,poate contine la randul sau alte subcontainere.Este important sa

cunoasteti localizarea fiecarei clase,in containere pentru a putea preciza

calea de acces completa.Daca se importa doar containerul radacina,toate

clasele din subcontainere nu vor avea vizibilitate in program.Din acest

motiv este esential sa fie importat si subcontainerul ce contine clasa.

EXEMPLU: clasa ArrayList este inclusa in System.Collections

pentru a putea fi utilizata in program,se va utiliza expresia:

System.Collections.ArrayList sau se va importa intregul container cu:

using System.Collections; //apoi se poate utiliza direct ArrayList

Daca se importa doar containerul System,ArrayList va fi nedefinita.

Biblioteca de clase .NET contine un numar enorm de clase si resurse.

Prezentarea lor este imposibil de facut intr-un singur manual.Referintele

bibliografice se gasesc in reteaua Intenet,in biblioteca MSDN,sau pentru

utilizatorii programului Visual C# pot fi verificare cu utilitarul denumit

Intelisense.

Nu exista reguli speciale pentru limbajul C#.Regulile de baza sunt

cele definite pentru programarea orientata spre obiect.Aceleasi clase,

vor fi importate si in mediu C# ca si in mediul Visual Basic.Exista doar

mici diferente in formarea expresiilor,specifice fiecarui limbaj,dar

aceste diferente dispar o data cu compilarea la limbaj intermediar.


System.Windows.Forms
Contine clasele necesare pentru construirea unei interfete grafice cu

utilizatorul,de tip Windows.Clasele sunt organizate ierarhic.Majoritatea

lor deriva din clasa Control si mostenesc toate metodele acestei clase.

O parte dintre ele formeaza ferestre si controale destinate pentru

interactiunea cu utilizatorul,altele formeaza meniuri si bare de meniu.

Exista si controale specializate pentru operatii I/O,sau pentru transferul

datelor precum si controale specializate pentru afisarea datelor fie sub

forma de text si tabele,fie sub forma grafica.Numarul acestor clase si

paleta de proprietati si metode,poate fi diferita de la o versiune la

alta (versiunile noi adauga functionalitati noi).

Clasa de baza pentru orice interfata Windows o reprezinta fereatra

simpla,adica un obiect de tip Form.Aceasta fereastra va functiona pe post

de suport,(container) pentru toate obiectele din interfata.

-95-


EXEMPLU:

using System;

using System.Windows.Forms;

public class AWindow : System.Windows.Forms.Form {

public AWindow(){ }

static void Main(){

Application.Run(new AWindow());

}}

Salvati fila cu numele Window1.cs si compilati.Exemplul de mai sus,



creaza o fereastra simpla de tip Form.Aceasta fereastra poate constitui

suportul pentru diverse alte operatii: se poate scrie la fel ca si in

fereastra Console,se pot desena grafice sau se pot adauga alte obiecte

si componente vizuale.

EXEMPLU:

using System;

using System.Windows.Forms;

using System.Drawing;

public partial class AWindow: System.Windows.Forms.Form{

public AWindow() { Initializeaza(); }

private void Initializeaza() {

Button1 buton1 = new Button();

buton1.Text = "OK";

buton1.Location = new Point (90,100);

buton1.Size = new Size (72,24);

buton1.Click += new EventHandler (button_Click);

this.Controls.AddRange( new Control[] { buton1 });

this.ShowDialog();

}

private void button_Click(object sender, EventArgs e) {



MessageBox.Show("Butonul meu functioneaza OK !");

}

static void Main(){



Application.Run(new AWindow());

}}

Salvati fila cu numele Window2.cs si compilati.Observati in acest



exemplu ca in constructorul ferestrei am adaugat o functie de initializare

prin care de adauga controalele necesare si un eventhandler ce gestioneaza

evenimentul OnClick al butonului buton1.Fereastra functioneaza in acest

caz pe post de container pentru toate celelalte controale auxiliare.Pentru

a include butonul in fereastra se utilizeaza metoda Controls.AddRange.

Functia de initializare contine si toate setarile si modificarile de

design dorite.Nu este esential,dar este recomandabil ca functia de

initializare ca contina un nume cat mai sugestiv,pentru a fi cat mai

usor de identificat si verificat in etapa de depanare.Daca programul este

verificat si depanat cu programe automate,acestea vor executa initial

constructorul si functiile incluse in constructor si apoi vor verifica

mediul de executie,inainte de a trece la executarea celorlate metode si

functii din program.Conventional se utilizeaza numele:

InitializeComponent()

dar se poate utiliza orice denumire sugestiva.

Butonul se poate utiliza pentru a declansa functiile programului.

-96-

Fereastra poate fi utilizata si ca suport grafic,pentru operatii de



scriere sau desen.In acest caz,in locul unei functii de initializare,se

va defini o metoda OnPaint() in care se includ operatiile dorite:

EXEMPLU:

using System;

using System.Drawing;

using System.Windows.Forms;

public class AWindow: System.Windows.Forms.Form {

public AWindow(){}

protected override void OnPaint( PaintEventArgs paintEvent)

{

Graphics g = paintEvent.Graphics;



SolidBrush brush = new SolidBrush( Color.Blue );

Pen pen = new Pen( Color.Red );

g.FillRectangle( brush, 90, 30, 150, 90 );

g.DrawLine( pen, 90, 30, 110, 40 );

g.DrawLine( pen, 90, 120, 110, 130 );

g.DrawLine( pen, 240, 30, 260, 40 );

g.DrawLine( pen, 240, 120, 260, 130 );

g.DrawRectangle( pen, 110, 40, 150, 90 );

}

static void Main(){



Application.Run(new AWindow());

}}

Salvati fila cu numele Window3.cs si compilati.Observati etapele



comune pentru orice aplicatie grafica: se creaza contextul grafic,apoi

se creaza un obiect de tip penita (pentru desen) si un obiect de tip

pensula (pentru umplerea suprafetelor) dupa care se executa operatiile

dorite,specificand coordonatele din fereastra.Atunci cand fereastra

contine atat controale vizuale,cat si reprezentari grafice,este

recomandabil sa utilizati containere de tip Panel,in care sa separati

controalele vizuale de partea grafica.In caz contrar,exista riscul de

a suprapune obiectele vizuale cu graficele,sau de a altera coordonatele

obiectelor...etc.

O situatie mai speciala,este atunci cand reprezentarile grafice se

creaza si se modifica dinamic.In acest caz,este recomandabil sa existe

o fereastra separata pentru aceste reprezentari grafice.Preferabil se

vor utiliza doua sau mai multe thread-uri,astfel incat fereastra grafica

sa poata functiona in paralel cu fereastra in care sunt incluse butoanele

de control.

O interfata grafica cu utilizatorul este formata din mai multe astfel

de obiecte vizuale,a caror functinalitate este conectata intre ele prin

metode,proprietati,sau schimb activ de date.Proiectarea unui interfete

consta din urmatoarele etape:

1. -alegerea obiectelor necesare

2. -conectarea lor functionala pentru scopul propus

3. -aranjarea obiectelor in fereastra

4. -setarea designului grafic: culori,dimensiuni,etichete...etc.

5. -testarea exceptiilor si a cazurilor extreme

6. -depanare,verificare si control

7. -testarea interfetei pentru cativa utilizatori neavizati

-97-

EXEMPLU:


using System;

using System.Windows.Forms;

using System.Drawing;

using System.IO;


public class AWindow: System.Windows.Forms.Form{

Button buton1;

RichTextBox text1;

public AWindow(){ Initializeaza(); }

private void Initializeaza(){

this.Size = new Size(900,700);

buton1 = new Button();

buton1.Text = "Open File";

buton1.Location = new Point (20,10);

buton1.Size = new Size(72,24);

buton1.Click += new EventHandler (button_Click);

text1 = new RichTextBox();

text1.Location = new Point(30,40);

text1.Size = new Size(850,600);

text1.Font = new Font("Verdana",12,FontStyle.Bold);

this.Controls.AddRange(new Control[] { buton1,text1});

this.ShowDialog(); }

private void button_Click(object sender, EventArgs e) {

Stream myStream = null;

OpenFileDialog fila1 = new OpenFileDialog();

fila1.InitialDirectory = "c:\\";

fila1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";

fila1.FilterIndex = 2;

fila1.RestoreDirectory = true;

if (fila1.ShowDialog() == DialogResult.OK) {

try { if ((myStream = fila1.OpenFile()) != null)

{ using (myStream)

{ text1.LoadFile(fila1.Filename,RichTextBoxStreamType.PlainText); }

}}

catch (Exception ex)



{ MessageBox.Show("Nu gasesc fila.Eroare: " + ex.Message); }}}

static void Main(){ AWindow fereastra1 = new AWindow(); }

}

Salvati fila cu numele Window4.cs si compilati.In acest exemplu,pe



langa buton,se adauga un obiect de afisaj de tip RichTextBox si un

obiect de conectare de tip OpenFileDialog.La apasarea butonului se va

deschide caseta de dialog,in care utilizatorul poate alege orice fila

de tip text,pentru a fi afisata in RichTextBox.Obiectul de conectare,

are un filtru,prin care puteti limita accesul,doar la un anumit tip de

file.Exemplu: puteti arhiva in program cateva file cu extensia .xxx si

apoi setati filtrul pentru a deschide doar filele de tip .xxx.Cu un

astfel de control,utilizatorul va avea doar acces de tip Read-Only,la

un anumit subset de file,alese de programator.

Multe aplicatii executa si operatii cu date calendaristice.Pentru a

afisa data curenta,sau o data oarecare,exista clasa DateTimePicker.

-98-


EXEMPLU:

using System;

using System.Windows.Forms;
public class AWindow: System.Windows.Forms.Form {

public AWindow(){

DateTimePicker data1 = new DateTimePicker();

data1.MinDate = new DateTime(1900,1,1);

data1.MaxDate = DateTime.Today;

data1.CustomFormat = "MMMM dd,yyyy - dddd";

data1.Format = DateTimePickerFormat.Custom;

data1.ShowCheckBox = true;

data1.ShowUpDown = true;

Controls.Add(data1);

this.ShowDialog();

}

static void Main(){ AWindow a1 = new AWindow(); }



}

Salvati fila cu numele Window5.cs si compilati.Cu un astfel de

control,utilizatorul poate alege o data oarecare,din intervalul setat

intre MinDate si MaxDate.Apoi,data respectiva poate fi preluata si

procesata pentru a produce rezultatele dorite.

Unele controale pot contabiliza operatiile din interfata:

EXEMPLU:

using System;

using System.Windows.Forms;

public class Form1 : Form {

public static void Main() { Application.Run(new Form1()); }

private Button button1;

private ListBox listBox1;

public Form1() {

button1 = new Button();

button1.Left = 200;

button1.Text = "Exit";

button1.Click += new EventHandler(button1_Click);

listBox1 = new ListBox();

this.Controls.Add(button1);

this.Controls.Add(listBox1);

}

private void button1_Click(object sender,System.EventArgs e)



{ int count = 1;

while ( MessageBox.Show("Exit ?","",

MessageBoxButtons.YesNo) == DialogResult.No)

{ listBox1.Items.Add(count); count += 1; }

Application.Exit();

}}

Salvati fila cu numele Window6.cs si compilati.La fiecare selectie



a butonului No,caseta ListBox va inregistra o noua operatie.Observati

modul in care a fost implementata conditia optionala pentru fereastra

MessageBox.Intreaga functionalitate a interfetei este conectata prin

aceasta bucla while().

-99-

Exista si situatii in care doriti ca aplicatia sa deschida in paralel



doua,sau mai multe ferestre simultan.Solutia este sa includeti toate

ferestrele intr-un obiect de tip Application si sa utilizati thread-uri

diferite pentru fiecare fereastra.

EXEMPLU:


using System;

using System.Drawing;

using System.Threading;

using System.Windows.Forms;


public class AWindow : System.Windows.Forms.Form {

public AWindow(){ this.BackColor = Color.Red; } }

public class AWindow2 : System.Windows.Forms.Form {

public AWindow2(){ this.BackColor = Color.Blue; } }

class Aplicatie {

public void F1(){ Application.Run(new AWindow()); }

public void F2(){ Application.Run(new AWindow2()); }

static void Main() {

Aplicatie a1 = new Aplicatie();

Thread t1 = new Thread(a1.F1);

Thread t2 = new Thread(a1.F2);


Yüklə 1,48 Mb.

Dostları ilə paylaş:
1   ...   6   7   8   9   10   11   12   13   14




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin