Page 1 .NET et C - Yats.com

http://msdn.microsoft.com/library/default.asp?url=/library/enus/cscon/html/vclrfcompa .... public static readonly Color White = new Color(255, 255, 255); private byte red, green, ...... http://tahe.ftp-developpez.com/fichiers-archive/csharp2008.pdf.
361KB taille 50 téléchargements 336 vues
The .NET Framework

Richness

.NET et C #

s API

1

COM Win32

Win16 1980

Daniel HERLEMONT

s ent pon m o C

Windows 3.0

Daniel HERLEMONT

1990

s vice S er

MFC

2000 2

.NET & CLR Common Language Runtime

Présentation .NET & .NET Framework

 Microsoft propose 4 langages C#, C++,VB.NET,ASP.NET dont C# est le premier recommandé par Microsoft  Autres langages supportés Perl, Cobol, Eiffel, J#, Oberon,Component Pascal, Python, Smalltalk

Daniel HERLEMONT

3

Daniel HERLEMONT

4

Page 1 1

Mécanisme de fonctionnement de MS.NET

CLI Standards

chien .vb

chat .cs

VS.NET C#

ECMA-334

Les applications c#, VB, c++ peuvent communiquer via le CLR En réalité le même programme peut etre écrit dans un lagage et décompilé dans un autre On retrouve les memes classes/packages dans les differentes environnements, CS, VB, C++

souris c++

JScript

VB VC/MC++

System.Web UI SessionState HtmlControls Caching Security WebControls Configuration

Debugger

System.Web.Services Protocols Discovery Description

Designers

System.Data (ADO.NET) ADO

chien MSIL

SDK Tools

souris MSIL

ILDbDump

CLR : moteur exécution

SN

en langage commun

ILDAsm

déploiement

MetaInfo PEVerify

Windows

Linux (?)

JIT

JIT

Boot Loader Threads

5

Daniel HERLEMONT

Printing

Imaging

Text System.Xml

XSLT

Adapters

CorDBG ILAsm

chat MSIL

System.Drawing Drawing2D

SQL

Design

ComponentModel

Serialization

XPath

System Collections

IO

Security

Configuration

Net

ServiceProcess

Diagnostics

Reflection

Text

Remoting

Globalization

Resources

Threading

Serialization

ECMA-335

CLR : Common Language Runtime JIT : Just in Time (2eme compilateur)

System.WinForms Design

Runtime InteropServices

Common Language Runtime GC

App Domain Loader

JIT

MSIL

Common Type System

Class Loader

Platform Abstraction Layer Sync

Timers

Networking Filesystem

6

Daniel HERLEMONT

Qu’est-ce c’est C# ?

Le framework .NET Les classes du framework Tous les langages de l’environnement .NET ont acceès au mêmes classes, notamment, les classes fondementales

System.Web Services Description Discovery Protocols

UI HtmlControls

Caching Configuration

Security SessionState

Button

MessageBox

ListControl

WebControls

SQL SQLTypes

Collections Configuration Diagnostics Globalization

IO Net Reflection Resources

   

System.Drawing Drawing2D Imaging

System.Data OLEDB Design

 Langage proposé par Microsoft, standardisé par ECMA, ressemble la syntaxe de Java

System.Windows.Forms Form

Printing Text

 Combinaison entre la force de C++ et la simplicité de Visual Basic  Cross Plate-forme  Cross Langage

System.Xml XSLT XPath

Langage orienté objet Une partie évolue vers langage orienté et langage de programmation de component Dérivé de C++ MFC est remplacée par librairie .NET Framework

Serialization

System

Daniel HERLEMONT

Security ServiceProcess Text Threading

Runtime InteropServices Remoting Serialization

7

Daniel HERLEMONT

8

Page 2 2

C# : comment ça marche ?

‘.exe’ ‘.dll’

.cs Code source

CLS ‘Règle de tranformation en .NET’

Just in Time Compiler

JIT

Microsoft Intermediate Language (MSIL)

C# vs C++

Avantages C# Code natif (selon OS)

Plus ouvert, plus de productivité productivité, programmes plus fiables et moins difficile a mettre au point Interopé Interopérabilité rabilité dans le futur avec Framework .Net (Windows, »Linux,Unix ») De plus en plus utilisé utilisé dans les applications financiè financières (front & middle) au dé détriment du C++ Inconvé Inconvénients C# Apprendre nouveau concept de base (.Net) Apprendre nouveau langage (temps d’ d’estimation

CLR Common Runtime Language

environ 4 semaines) 9

Daniel HERLEMONT

10

Daniel HERLEMONT

Avantages C#

Inconvénients de C#

 Peu de pointeur  Conversion automatique (boxing) list.Add(1); list.Add(13.12);

 Versioning  C# demande le développer de clarifier la création de la version librairie créée.

 Technologie Windows 100%, porter Framework sur Linux “à voir” (projet Mono)

 Utilise le keyword ‘new’ et ‘override

 Utiliser la librairie de framework .NET

 .NET et C# sont des "standards ouverts" ne signifie pas nécessairement des "environnements ouverts".

 Threading, Collection, XML, ADO+, ASP+, GDI+ & WinForms libraries

 C# élimine header .h  C# non pointeur (très limité).  C# est un langage objet orienté pur avec tous les objets et types dérivés de la classe Object.  Codé géré (pas besoin de ‘’free’’ et ‘’delete’’ – garbage collector)  Possibilité d’intégrer du code source natif C ou C++

 La première fois est lente (à cause de compilateur 2-time)  Relativement nouveau (bibliotheques spécialisées, …)

Plus détails :  http://msdn.microsoft.com/library/default.asp?url=/library/enus/cscon/html/vclrfcompa risonbetweenccsharp.asp

Daniel HERLEMONT

11

Daniel HERLEMONT

12

Page 3 3

Opérateurs

Instructions



Blocs



Libellés



Selections

{ ... }       

Unaires : Arithmétiques : Décalage : Relationnels : Logiques : Conditionnels : Assignation :

+ ! ~ ++x --x * / % + > < > = == != & ^ | && || ?: = *= /= %= += -= = &= ^= |=

.NET Framework, C# et .NET Remoting

(T)x

C#

Daniel HERLEMONT

;

x: instruction;

if(x == 1) { if(y == 2) { F(); } else { G(); } }

13

13

.NET Framework, C# et .NET Remoting

switch(i) { case 0: case 1: Choix(); break; default: ChoixAutre(); break; }

C#

Daniel HERLEMONT

Instructions



 for(int i = 0; i < n; i++) { ... } foreach(object o in collection) {

break; goto libelle;

continue; return value;

... } 



Sauts

Gestion des exceptions try { ... } catch(ArgumentException e) { ... } catch(Exception e) { ... } finally { ... }

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT



throw new Exception();

C#

15

14

Types

Itérations while(x != 0) { ... } do { ... } while(x == 0);

14

Valeurs  Types prédéfinis  Enumérations  Structures  Allocation dans la pile (stack)  Ne peut être null Références  Tableaux  Délégués  Classes  Interfaces  Allocation dans le tas (heap)  Peut être null

15

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

16

16

Page 4 4

Types prédéfinis

Type

Description

Exemple

object

Type de base de tous les autres types

object o = null;

string

Séquence de caractères Unicode

string s = "Hello";

sbyte

Entier signé de 8 bits

sbyte val = 12;

short

Entier signé de 16 bits

short val = 12;

int

Entier signé de 32 bits

int val = 12;

long

Entier signé de 64 bits

long val1 = 12; long val2 = 34L;

byte

Entier non signé de 8 bits

byte val = 12;

ushort

Entier non signé de 16 bits

ushort val = 12;

uint

Entier non signé de 32 bits

uint val1 = 12; uint val2 = 34U;

ulong

Entier non signé de 64 bits

ulong ulong ulong ulong

float

Flottant simple précision (32 bits, 1.7E +/- 308 15 chiffres significatifs)

float val = 1.23F;

double

Flottant double précision (64 bits, 3.4E +/- 38, 7 chiffres significatifs)

double val1 = 1.23; double val2 = 4.56D;

bool

Booléen

bool val1 = true; bool val2 = false;

char

Caractère Unicode

char val = 'h';

decimal

Décimal (28 chiffres significatifs)

decimal val = 1.23M;

.NET Framework, C# et .NET Remoting

val1 val2 val3 val4

C#

Daniel HERLEMONT

= = = =

Enumerations

enum Color : long { Red, Green, Blue }

Color color; switch(color) { case Color.Red: ... break; case Color.Blue: ... break;

12; 34U; 56L; 78UL;

case Color.Green: ... break; default: break;

17

}

17

.NET Framework, C# et .NET Remoting

C#

Structures

struct Point { public int x,y; public Point(int x, int y) { this.x = x; this.y = y; } }

.NET Framework, C# et .NET Remoting

C#

19

18

Tableaux

struct Point { public int x,y; }

Daniel HERLEMONT

18

Daniel HERLEMONT



Une dimension int[] myArray = new int[] {1, 3, 5, 7, 9}; string[] weekDays = {"Sun","Sat","Mon","Tue","Wed","Thu","Fri"};



Plusieurs dimensions int[,,] myArray = new int [4,2,3]; int[,] myArray = new int[,] {{1,2}, {3,4}, {5,6}, {7,8}};



Jagged (tableau de tableaux) int[][,] myJaggedArray = new int [3][,] { new int[,] { {1,3}, {5,7} }, new int[,] { {0,2}, {4,6}, {8,10} }, new int[,] { {11,22}, {99,88}, {0,9} } };

19

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

20

20

Page 5 5

Orientation Objet

Class basics

class myClass {

 programmation procédurale : P.P. (Pascal, C, etc.)

private string myVar; public myClass() { }

 programmation orientée objet : P.O.O. (C++, Java, C#)

protected void myMethod(int parameter) { //do stuff here }

 Principaux concepts de la programmation objet  Encapsulation, abstraction, interfaces, …  Héritage (simple, multiple)  Polymorphisme

}

21

Daniel HERLEMONT

22

Daniel HERLEMONT

Inheritance

Classes

 C# only supports single inheritance  Specify inheritance like so:



Nom



 

Attribut d’accessibilité  public  protected  private  internal  protected internal Attribut abstract (abstrait) Attribut sealed (sellé)

 

Classe de base (héritage simple de classe) Interfaces implémentées (héritage multiple d’interfaces)



Membres

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

class myClass : myBaseClass

non limité limité à la classe et aux classes dérivées limité à la classe limité à l’assemblage limité à l’assemblage et aux classes dérivées

C#

23

23

Daniel HERLEMONT

24

Page 6 6

Method example

Membres

class myClass { private string myVar;          

public myClass() { } public void myMethod(int parameter) { //do stuff here } public static void PrintStuff() { }

Constantes Champs Méthodes Constructeurs Destructeurs Types Propriétés Indexeurs Opérateurs Événements

} class myCallerClass { public myCallerClass() { myClass.PrintStuff(); myClass myInstance= new myClass(); myInstance.myMethod(5); } } .NET Framework, C# et .NET Remoting

25

Daniel HERLEMONT

C#

Daniel HERLEMONT

Constantes

public class Color { public static readonly Color Black = new Color(0, 0, 0); public static readonly Color White = new Color(255, 255, 255); private byte red, green, blue; public Color(byte r, byte g, byte b) { red = r; green = g; blue = b; } }

class B { public const int X = C.Z + 1; public const int Y = 10; }





class C { public const int Z = B.Y + 1; } .NET Framework, C# et .NET Remoting

26

Champs

class A { public const double X = 1.0; public const double Y = 2.0; public const double Z = 3.0; }

Daniel HERLEMONT

26

C#

27

Attributs d’accessibilité  public  protected  private  internal

non limité limité à la classe et aux classes dérivées limité à la classe limité à l’assemblage

Attributs  new  static  readonly  volatile

champ cachant (classe dérivé) champ de classe champ en lecture seule (initialisé par le constructeur) champ volatile

27

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

28

28

Page 7 7

Méthodes



Nom



Attribut d’accessibilité  public non limité  protected limité à la classe et aux classes dérivées  private limité à la classe  internal limité à l’assemblage Attributs new, static, virtual (virtuel), abstract, sealed, override (surcharge), extern



Méthodes abstraites

public abstract class Shape { public abstract void Paint(Graphics g, Rectangle r); } public class Ellipse: Shape { public override void Paint(Graphics g, Rectangle r) { g.DrawEllipse(r); } }

Type de retour Paramètres

 

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

public class Box: Shape { public override void Paint(Graphics g, Rectangle r) { g.DrawRect(r); } }

C#

29

29

.NET Framework, C# et .NET Remoting

C#

30

Daniel HERLEMONT

Properties    

Méthodes virtuelles

Properties are NOT fields Fields are variables declared in the class Properties are “wrappers” for fields Get/Set:

class A { public virtual void F() { Console.WriteLine("A.F"); } } class B: A { public override void F() { Console.WriteLine("B.F"); } }

private string mystring; public string MyString { get { return mystring; } set {mystring = value; } }

Daniel HERLEMONT

30

.NET Framework, C# et .NET Remoting

31

Daniel HERLEMONT

class Test { static void Main() { B b = new B(); A a = b; a.F(); a.F(); } }

> B.F

C#

32

32

Page 8 8

Constructeurs (instance)

 

Constructeur (classe)

Initialiser l’instance d’une classe En cas d’absence de constructeur, un constructeur sans paramètre est implicitement créé

   

Initialiser une classe Ne peut être appelé explicitement Appelé automatiquement Pas d’attribut d’accessibilité, pas de paramètre

class Point { public double x, y; public Point() { this.x = 0; this.y = 0; } public Point(double x, double y) { this.x = x; this.y = y; } }

.NET Framework, C# et .NET Remoting

class A { public static int X; static A() { X = B.Y + 1; } } class B { public static int Y = A.X + 1; static B() {} static void Main() { Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y); } }

C#

33

Daniel HERLEMONT

33

.NET Framework, C# et .NET Remoting

C#

Daniel HERLEMONT

Destructeur

  



Déclaration d’un type à l’intérieur d’une classe public class List { // Private data structure private class Node { public object Data; public Node Next; public Node(object data, Node next) { this.Data = data; this.Next = next; } } private Node first = null; private Node last = null; // Public interface public void AddToFront(object o) {...} public void AddToBack(object o) {...} public object RemoveFromFront() {...} public object RemoveFromBack() {...} public int Count { get {...} } }

class A { public static int X; static A() { X = B.Y + 1; } } class B { public static int Y = A.X + 1; static B() {} static void Main() { Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y); } }

.NET Framework, C# et .NET Remoting

C#

34

Types

Appelé automatiquement lors du processus de garbage collection Ne peut être appelé explicitement Pas d’attribut d’accessibilité, pas de paramètre

Daniel HERLEMONT

34

35

35

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

36

36

Page 9 9

Propriétés

Propriétés

abstract class A { int y; public virtual int X { get { return 0; } } public virtual int Y { get { return y; } set { y = value; } } public abstract int Z { get; set; } }

Accéder aux caractéristiques d’un objet ou d’une classe



    

longueur d’une chaîne de caractères taille d’un tableau titre d’une fenêtre dimensions d’une image …

Deux comportements



Lecture (get) Écriture (set)

 

Mêmes attributs que les méthodes



.NET Framework, C# et .NET Remoting

class B: A { int z; public override int X { get { return base.X + 1; } } public override int Y { set { base.Y = value < 0? 0: value; } } public override int Z { get { return z; } set { z = value; } } } C#

Daniel HERLEMONT

37

37

.NET Framework, C# et .NET Remoting

C#

Indexeurs



38

Daniel HERLEMONT

38

Opérateurs

Indexer une classe à la manière d’un tableau public struct Digit { byte value; public Digit(byte value) { if (value < 0 || value > 9) throw new ArgumentException(); this.value = value; } public Digit(int value): this((byte) value) {}

public class Stack { private Node GetNode(int index) { Node temp = first; while (index > 0 && temp != null) { temp = temp.Next; index--; } if (index < 0 || temp == null) throw new Exception("Index out of range."); return temp; } public object this[int index] { get { return GetNode(index).Value; } set { GetNode(index).Value = value; } } } .NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

public static implicit operator byte(Digit d) { return d.value; } public static explicit operator Digit(byte b) { return new Digit(b); } }

39

39

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

40

40

Page 10 10

Opérateurs

Opérateurs

public struct Digit { byte value; public Digit(byte value) { if (value < 0 || value > 9) throw new ArgumentException(); this.value = value; } public Digit(int value): this((byte) value) {}

public struct Digit { byte value; public Digit(byte value) { if (value < 0 || value > 9) throw new ArgumentException(); this.value = value; } public Digit(int value): this((byte) value) {}

public static Digit operator+(Digit a, Digit b) { return new Digit(a.value + b.value); }

public static bool operator==(Digit a, Digit b) { return a.value == b.value; }

public static Digit operator-(Digit a, Digit b) { return new Digit(a.value - b.value); }

public static bool operator!=(Digit a, Digit b) { return a.value != b.value; }

} public override bool Equals(object value) { if (value == null) return false; if (GetType() == value.GetType()) return this == (Digit)value; return false; } } .NET Framework, C# et .NET Remoting

C#

Daniel HERLEMONT

41

41

.NET Framework, C# et .NET Remoting

C#

42

Daniel HERLEMONT

Délégués

  

Événements

 

Pointeurs de méthodes (vulgarisation) Encapsule à la fois un objet et une méthode Peut « pointer » vers plusieurs méthodes

.NET Framework, C# et .NET Remoting

Mécanisme de notification Basé sur les délégués

Consommateur d’événements

delegate void D(int x); class C { public static void M1(int i) {...} public static void M2(int i) {...} } class Test { static void Main() { D cd1 = new D(C.M1); // M1 D cd2 = new D(C.M2); // M2 D cd3 = cd1 + cd2; // M1 + M2 D cd4 = cd3 + cd1; // M1 + M2 + M1 D cd5 = cd4 + cd3; // M1 + M2 + M1 + M1 + M2 } }

Daniel HERLEMONT

42

C#

Traitant d’événements

Générateur d’événements

Événement

registration callback Consommateur d’événements Traitant d’événements

43

43

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

44

44

Page 11 11

Événements

Espaces de noms



public delegate void EventHandler(object sender, EventArgs e);

Conteneur de classes ou d’espaces de nom 

public class Button: Control { public event EventHandler Click; protected void OnClick(EventArgs e) { if (Click != null) Click(this, e); } }



Organiser des classes hiérarchiquement

Structurer les assemblages

public class Form { Button Button1 = new Button(); public Form() { Button1.Click += new EventHandler(Button1_Click); } ~Form() { Button1.Click -= new EventHandler(Button1_Click); }

class A {} namespace X { class B { class C {} } namespace Y { class D {} } }

// A // X // X.B // X.B.C // X.Y // X.Y.D

Using tells the compiler what prefixes to try on stuff it can’t figure out: using System.Collections; ArrayList myList=new ArrayList()

void Button1_Click(object sender, EventArgs e) { Console.WriteLine("Button1 was clicked!"); } } .NET Framework, C# et .NET Remoting

C#

Daniel HERLEMONT

45

45

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

Nom



Attribut d’accessibilité  public  protected  private  internal

Interfaces de base (héritage multiple d’interfaces)



Membres    

46

parameter arrays ref and out parameters overflow checking foreach statement lock statement switch on string

Méthodes Propriétés Indexeurs Événements

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

     

non limité limité à la classe et aux classes dérivées limité à la classe limité à l’assemblage



46

Productivity features

Interfaces



C#

C#

47

47

Daniel HERLEMONT

48

Page 12 12

ref and out parameters

foreach statement

 Use “ref” for in/out parameter passing  Use “out” to return multiple values  Must repeat ref/out at call site

 Iteration of arrays

 Equivalent to &

public static void Main(string[] args) args) { foreach (string s in args) args) Console.WriteLine(s); Console.WriteLine(s); } Iteration of IEnumerable collections

static void Swap(ref Swap(ref int a, ref int b) {...} static void Divide(int dividend, int divisor, out int result, out int remainder) {...} ArrayList accounts = Bank.GetAccounts(...); Bank.GetAccounts(...); foreach (Account a in accounts) { if (a.Balance < 0) Console.WriteLine(a.CustName); Console.WriteLine(a.CustName); }

static void Main() { int x = 1, y = 2; Swap(ref Swap(ref x, ref y); }

Daniel HERLEMONT

49

50

Daniel HERLEMONT

Overflow checking

Switch on string

 Integer arithmetic operations

Color ColorFromFruit(string s) { switch(s.ToLower()) switch(s.ToLower()) { case "apple": return Color.Red; case "banana": return Color.Yellow; case "carrot": return Color.Orange; default: throw new InvalidArgumentException(); InvalidArgumentException(); } }

 C, C++, Java silently overflow

 checked vs. unchecked contexts  Default is unchecked, except for constants  Change with “/checked” compiler switch

int i = checked(x checked(x * y); checked { int i = x * y; }

Daniel HERLEMONT

51

Daniel HERLEMONT

52

Page 13 13

Polymorphism in C#

Error handling  System.Exception  Gets code information like:

public class Fruit { public virtual string Shape() {return "Not sure";} public string Colour() {return "You tell me";} }

 Stack trace  Line and file info  Detailed error message

 Use in try…catch block public class Orange : Fruit { public new string Colour() {return "Orange";} public override string Shape() {return "Round";} }

Fruit string string Orange string string

someFruit = new Orange(); a = someFruit.Shape(); // b = someFruit.Colour(); // anOrange = (Orange)someFruit; c = anOrange.Shape(); // d = anOrange.Colour(); //

… ArrayList myList; try { myList.Clear(); } catch (System.NullReferenceException e) { Console.WriteLine(“variable not initialized”); }

"Round" "You tell me"

To throw an error say: throw Or: throw new

"Round" "Orange"

Exceptions are very costly, don’ don’t throw them unless there is an error 53

Daniel HERLEMONT

Daniel HERLEMONT

Generics

Generics

public class List< List ItemType> { private ItemType[] object[] elements; elements; ItemType[] private int count;

 Why generics?  Compile-time type checking  Performance (no boxing, no downcasts)  Reduced code bloat (typed collections)

public void Add(ItemType Add(object element) element) { { Add(ItemType if (count == elements.Length) Resize(count * 2); elements[count++] = element; }

 C# generics vs. C++ templates  C# generics are checked at declaration  C# generics are instantiated at run-time

 C# generics vs. proposed Java generics

public ItemType object this[int this[int index] index] { { get { return elements[index]; } set { elements[index] = value; } } List List intList intList = new=List(); new List (); List();

}

public int Count { getintList.Add(1); { return count; } intList.Add(2); } intList.Add("Three"); intList.Add("Three"); int i = intList[0]; (int)intList[0];

Daniel HERLEMONT

54

// // //

 C# generics work over entire type system  C# generics preserve types at run-time

Argument No boxingis boxed Argument No boxingis boxed CompileShould be time an error Compile-

// No Cast cast required required 55

Daniel HERLEMONT

56

Page 14 14

Generics In VB

Generics In C++

Public Class List(Of T) Private elements() As T Private elementcount As Integer Public Sub Add(ByVal element As T) If elementcount = elements.Length Then Resize(elementcount * 2) elements(elementcount) = element count += 1 End Sub Public Default Property Item(ByVal index As Integer) As T Get Return elements(index) End Get Set (ByVal Value As T) Dim intList elements(index) As New List(Of = Value Integer) End Set intList.Add(1) // No boxing intList.Add(2) // No boxing End Property intList.Add("Three") // Compile-time error Dim i As Integer = intList(0) // No cast required Daniel HERLEMONT

57

generic public ref class List { array^ elements; int count; public: void Add(T element) { if (count == elements->Length) Resize(count * 2); elements[count++] = element; } property T default [int index] { T get() { return elements[index]; } void set(T value) { elements[index] = value; } } property int Count { intList = gcnew List(); intList^ get() { return count; } intList->Add(1); // No boxing } intList->Add(2); // No boxing }; intList->Add("Three"); // Compile-time error Daniel HERLEMONT

int i = intList[0];

Throwing an Exception

// No cast required

58

Exception Hierarchy (excerpt)

By an invalid operation (implicit exception)

Exception SystemException ArithmeticException DivideByZeroException OverflowException ... NullReferenceException IndexOutOfRangeException InvalidCastException ... ApplicationException ... user-defined exceptions ... IOException FileNotFoundException DirectoryNotFoundException ... WebException ...

Division by 0 Index overflow Acess via a null reference ...

By a throw statement (explicit exception) throw new FunnyException(10); class FunnyException : ApplicationException { public int errorCode; public FunnyException(int x) { errorCode = x; } }

(By calling a method that throws an exception but does not catch it) s = new FileStream(...);

Daniel HERLEMONT

59

Daniel HERLEMONT

60

Page 15 15

Traditional Collections  System.Collection namespace introduced in 1.0 version of .NET Framework  Useful container types

FileStream s = null; try { s = new FileStream(curName, FileMode.Open); ... } catch (FileNotFoundException e) { Console.WriteLine("file {0} not found", e.FileName); } catch (IOException) { Console.WriteLine("some IO exception occurred"); } catch { Console.WriteLine("some unknown error occurred"); } finally { if (s != null) s.Close(); }

   

Lists Dictionaries Hashtables CollectionBase

catch clauses are checked in sequential order. finally clause is always executed (if present). Exception parameter name can be omitted in a catch clause. Exception type must be derived from System.Exception. If exception parameter is missing, System.Exception is assumed.

61

Daniel HERLEMONT

Daniel HERLEMONT

Sample Class Definition

Sample ArrayList Use ArrayList bookList = new ArrayList();

class Book { private int bookNumber = 0; public int BookNumber { get { return this.bookNumber ; } set { this. bookNumber = value; } }

for( int i = 0; i < 20; i++) { bookList.Add( new Book(i) ); } IEnumerator listEnum = bookList.GetEnumerator(); while( listEnum.MoveNext() ) { Console.WriteLine(“{0}”, ((Book)(listEnum.Current)).BookNumber); }

public Book( int _bookNumber ) { this.bookNumber = _bookNumber; } }

Daniel HERLEMONT

62

63

Daniel HERLEMONT

64

Page 16 16

Drawbacks

VB.NET Generics Sample 1 Dim testCol As New List(Of int32)()

 No type checking enforcement at compile time

For i as int32 = 0 To 19 testCol.Add(i) Next

 Doesn’t prevent adding unwanted types  Can lead to difficult to troubleshoot issues  Runtime errors!

 All items are stored as objects

For each someInt As int32 in testCol Console.WriteLine(“{0}”, someInt) Next

 Must be cast going in and coming out  Performance overhead of boxing and unboxing specific types

Daniel HERLEMONT

65

Daniel HERLEMONT

C# Generics Sample 1

VB.NET Generics Sample 2 Dim bookList As New List(Of Book)()

ArrayList testCol = new ArrayList(); for (int i = 0; i < 20; i++) { testCol.Add(i); }

For i as int32 = 0 To 19 bookList.Add(New Book(i)) Next

foreach (int someInt in testCol) { Console.WriteLine(“{0}”, someInt); }

Daniel HERLEMONT

66

For each book As Book in bookList Console.WriteLine(“{0}”, book.BookNumber) Next

67

Daniel HERLEMONT

68

Page 17 17

C# Generics Sample 2

C++ Templates?

ArrayList bookList = new ArrayList(); for (int i = 0; i < 20; i++) { bookList.Add( new Book(i) ); }

 Generics are NOT equal to Templates  Compile-Time vs. Run-Time

foreach (Book book in bookList) { Console.WriteLine(“{0}”, book.BookNumber); }

 Code Bloat?  Pros and Cons for each

 Templates = Compile-Time  Generics = Run-Time

69

Daniel HERLEMONT

70

Daniel HERLEMONT

Streaming Framework 

System.IO contains types for input and output



Base class Stream defines an abstract protocol for byte-oriented input and output



Specialization for different media



Streams support synchronous and asynchronous protocol



Readers and Writers for formatting

Class Stream

public abstract class Stream : MarshalByRefObject, IDisposable { public abstract bool CanRead { get; } public abstract bool CanSeek { get; } public abstract bool CanWrite { get; }

Stream

FileStream

NetworkStream

MemoryStream

BufferedStream

CryptoStream DeflateStream GZipStream

• Elementary properties of stream

public public public public

abstract int Read(out byte[] buff, int offset, int count); abstract void Write(byte[] buff, int offset, int count); virtual int ReadByte(); virtual void WriteByte(byte value);

• Synchronous reading and writing

public public public public

virtual IAsyncResult BeginRead(…); virtual IAsyncResult BeginWrite(…); virtual int EndRead(…); virtual int EndWrite(…);

• Asynchronous reading and writing

public abstract long Length { get; } public abstract long Position { get; set; } public abstract long Seek(long offset, SeekOrigin origin);

• Length and actual position • Positioning

public abstract void Flush(); public virtual void Close(); ...

• Flush and close

} Daniel HERLEMONT

71

Daniel HERLEMONT

72

Page 18 18

Stream Classes

Readers and Writers

 

(Stream) long Length long Position bool CanRead bool CanWrite bool CanSeek int Read(byte[] buf, int pos, int len) int ReadByte() Write(byte[] buf, int pos, int len) WriteByte(byte x) long Seek(long pos, SeekOrigin org) SetLength(long len) Flush() Close()



Sequential byte streams on various media

TextReader

StreamReader

NetworkStream

BufferedStream

CryptoStream

string Name Lock(int pos, int len)

MemoryStream( byte[] )

bool DataAvailable

DeflateStream

GZipStream

StringReader

TextWriter

BinaryReader

MemoryStream

is buffered!

Readers and Writers overtake formatting tasks

namespace System.IO

FileStream

Unlock(int pos, int len)

BinaryReader and BinaryWriter for binary data TextReader and TextWriter for character data

Stream

BinaryWriter

StreamWriter

StringWriter



no Seek

FileStream

int Capacity

MemoryStream

NetworkStream

Decorators

byte[] GetBuffer() WriteTo(Stream s)

73

Daniel HERLEMONT

74

Daniel HERLEMONT

Reader Classes

Writer Classes

(TextReader)

BinaryReader

(TextWriter)

BinaryWriter

int Read() int ReadBlock(char[] buf, int pos, int len) int Peek() string ReadLine() string ReadToEnd() Close()

BinaryReader(Stream s) BinaryReader(Stream s, Encoding e) byte ReadByte() bool ReadBoolean() char ReadChar() short ReadInt16() int ReadInt32() ... Close()

string NewLine Write(bool b) Write(char c) Write(int i) ... Write(string format, params object[] arg) WriteLine() WriteLine(bool b) WriteLine(char c) WriteLine(int i) ... WriteLine(string format, params object[] arg) Flush() Close()

Stream BaseStream BinaryWriter(Stream s) BinaryWriter(Stream s, Encoding e) Write(bool b) Write(char c) Write(int i) ... long Seek(int pos, SeekOrigin org) Flush() Close()

StreamReader

StringReader

Stream BaseStream StreamReader(Stream s)

StringReader(string s)

TextReader BinaryReader

reads characters reads primitive types in binary form

Unfortunately, it is not possible to set multiple readers to a stream at the same time. There is no formatted input of numbers, words, etc.

Daniel HERLEMONT

StreamWriter

StringWriter

Stream BaseStream StreamWriter(Stream s)

StringWriter() string ToString()

Output of data of primitive types in binary form

Formatted text output (only sequentially; no Seek) 75

Daniel HERLEMONT

76

Page 19 19

Files and Directories

Class File

Namespaces System.IO.File and System.IO.Directory for working with files and directories

public sealed class File { public static FileStream Open(string path, FileMode mode); public static FileStream Open(string path, FileMode m, FileAccess a); public static FileStream Open(string p, FileMode m, FileAccess a, FileShare s); public static FileStream OpenRead(string path); public static FileStream OpenWrite(string path); public static StreamReader OpenText(string path); // returns Reader for reading text public static StreamWriter AppendText(string path); // returns Writer for appending text public static FileStream Create(string path); // create a new file public static FileStream Create(string path, int bufferSize); public static StreamWriter CreateText(string path); public static void Move(string src, string dest); public static void Copy(string src, string dest); // copies file src to dest public static void Copy(string src, string dest, bool overwrite); public static void Delete(string path); public static bool Exists(string path); public static FileAttributes GetAttributes(string path); public static DateTime GetCreationTime(string path); public static DateTime GetLastAccessTime(string path); public static DateTime GetLastWriteTime(string path); public static void SetAttributes(string path, FileAttributes fileAttributes); public static void SetCreationTime(string path, DateTime creationTime); public static void SetLastAccessTime(string path, DateTime lastAccessTime); public static void SetLastWriteTime(string path, DateTime lastWriteTime); } Daniel HERLEMONT 78

Directory:  static methods for manipulating directories File:  static methods for manipulating files DirectoryInfo:  represents a directory FileInfo:  represents a file

77

Daniel HERLEMONT

Parameter arrays

Fonctionnalités avancées



 Can write “printf” style methods  Type-safe, unlike C++

Section critique, exclusion mutuelle class Account { int balance; public Account(int initial) { balance = initial; } int Withdraw(int amount) { if (balance < 0) throw new Exception("Negative Balance"); lock (this) { if (balance >= amount) { balance = balance - amount; return amount; } else { return 0; } } } }

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

static void printf(string fmt, fmt, params object[] args) args) { foreach (object x in args) args) { ... } } printf("%s %i", s, i); object[] args = new object[2]; args[0] = s; args[1] = i; printf("%s %i", args); args);

79

79

Daniel HERLEMONT

80

Page 20 20

Fonctionnalités avancées



Fonctionnalités avancées

Contrôle de débordement lors d’opérations arithmétiques sur les entiers



Boxing / Unboxing Mécanisme de conversion entre un type valeur et un type référence



class OverFlowTest { static short x = 32767, y = 32767; public static int myMethodCheck() { int z = 0; try { z = checked((short)(x + y)); } catch (System.OverflowException e) { System.Console.WriteLine(e.ToString()); } return z; } public static int myMethodUncheck() { int z = unchecked((short)(x + y)); return z; } } .NET Framework, C# et .NET Remoting

C#

Daniel HERLEMONT

 

boxing :

type valeur  type référence

unboxing :

type référence  type valeur

int i = 123; object o = i; int j = (int)o;

81

81

.NET Framework, C# et .NET Remoting

Fonctionnalités avancées – Code Unsafe



82

82

Fonctionnalités avancées - Unsafe

Code unsafe     

C#

Daniel HERLEMONT



Manipulation de bas niveau (pointeurs) Autorise les conversions de types Autorise les opérations arithmétiques sur les pointeurs Semblable à du code C inline – permet de proter du code écrit en C Allocation sur la pile (stackalloc)

Code unsafe 

Fixer l’adresse mémoire d’une variable à l’exécution (fixed)

class Test { static int x; int y; unsafe static void F(int* F(int* p) { *p = 1; }

class Test { unsafe void Method() { char* buf = stackalloc char[256]; for(char* for(char* p = buf; buf; p < buf + 256; p++) *p = 0; ... } }

static void Main() { Test t = new Test(); int[] a = new int[10]; unsafe { fixed (int* p = &x) F(p); F(p); fixed (int* p = &t.y ) F(p); &t.y) F(p); fixed (int* p = &a[0]) F(p); F(p); fixed (int* p = a) F(p); F(p); } } }

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

83

83

.NET Framework, C# et .NET Remoting

Daniel HERLEMONT

C#

84

84

Page 21 21

Comparaison C# et VB.NET

C# Example (Syntax)

 C#

/* C Style comment */ // C++ Style comment

 Object oriented and strong typing  Described as a “...simple, modern, object-oriented, and type-safe programming language derived from C and C++”.  Bears many syntactic similarities to C++ and Java.  C# is a better programming language because it forces variables to be defined. C# code runs faster  for large applications where maintenance and performance are required

///Enhanced comment for Documentation Feature Void SampleProc() { int intCounter1=0; MessageBox.show(“Counter1=” + intCounter1.ToString()); } //end of SampleProc

 VB.Net    

is the latest release of Microsoft’s Visual Basic language. VB is an event driven programming language. Derived heavily from BASIC. VB enables Rapid Application Development (RAD) of graphical user interface (GUI) applications.

Daniel HERLEMONT

85

Daniel HERLEMONT

VB.Net Example (Syntax)

86

C# Example (Object Oriented) class App { static void Main(string [ ] args) { int intCounter=0;

‘Style of comments for VB.Net Sub SampleProc() Dim intCounter1 as Integer, intCounter2 as Integer MessageBox.show(“Counter1=” & intCounter1) End Sub ‘end of SampleProc

foreach (string arg in args) { System.Console.WriteLine(“Counter:” + intCounter.ToString() + “=“ + arg); } //end of foreach } //end of Main() } //end of App{}

Daniel HERLEMONT

87

Daniel HERLEMONT

88

Page 22 22

VB.Net Example (Object Oriented)

Language Converters

Class App Shared Sub Main(ByVal args as String( ) ) Dim arg as String Dim intCounter as Integer

C# to VB.NET  

For Each arg in args System.Console.Writeline(“Counter: ” & intCounter & “=“ & arg)

http://www.aspalliance.com/aldotnet/examples/translate.aspx http://www.kamalpatel.net/ConvertCSharp2VB.aspx

Next ‘For Each loop

VB.Net to C#

End Sub ‘end of Main()

 

End Class ‘end of App{}

http://www.e-iceblue.com http://www.vbconversions.com

C# & VB.NET Conversion Pocket Reference by Jose Mojica C# in a Nutshell By Peter Drayton, Ben Albahari, Ted Neward http://en.wikipedia.org/wiki/Visual_Basic_programming_language

89

Daniel HERLEMONT

Daniel HERLEMONT

90

Quelques références http://msdn.microsoft.com http://msdn.microsoft.com http://windows.oreilly.com/news/hejlsberg_0800.html http://www.csharphelp.com http://www.csharphelp.com// http://www.csharphttp://www.csharp-station.com/ station.com/ http://www.csharpindex.com http://www.csharpindex.com// http://www.hitmill.com/programming/dotNET/csharp.html http://www.hitmill.com/programming/dotNET/csharp.html http://www.chttp://www.c-sharpcorner.com/ sharpcorner.com/ http://msdn.microsoft.com/library/default.asp?URL =/library/dotnet/csspec/vclrfcsharpspec_Start.htm dotnet/csspec/vclrfcsharpspec_Start.htm http://msdn.microsoft.com/library/default.asp?URL=/library/ http://en.wikipedia.org/wiki/C_Sharp_(programming_language) http://fr.wikipedia.org/wiki/C_sharp Tutoriel en francais http://tahe.ftp-developpez.com/fichiers-archive/csharp2008.pdf http://tahe.developpez.com/dotnet/csharp/ Comparaisons entre langages http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp http://www.25hoursaday.com/CsharpVsJava.html http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET

Daniel HERLEMONT

91

Page 23 23