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