csharp in detail part2

139
© { JSL } 1 C# in Detail C# in Detail Jon Jagger Software Trainer, Designer, Consultant www.jaggersoft.com jon@ jaggersoft.com { JSL } Part 2 Part 2

Upload: mohamed-krar

Post on 10-May-2015

3.008 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Csharp In Detail Part2

© { JSL }11

C#

in D

etai

lC

# in

Det

ail Jon Jagger

Software Trainer, Designer, Consultant

www.jaggersoft.com

jon@ jaggersoft.com

{ JSL }

Part 2Part 2

Page 2: Csharp In Detail Part2

© { JSL }22

Bla

tan

t A

dve

rtB

lata

nt

Ad

vert

an interactive, friendly, expert instructoran interactive, friendly, expert instructor Jon has worked for Microsoft using C#Jon has worked for Microsoft using C#

lots of great exerciseslots of great exercises to make sure you understandto make sure you understand

even more slideseven more slides with detail, explanations, and rationaleswith detail, explanations, and rationales

full slide notesfull slide notes include careful comparisons with C++ and include careful comparisons with C++ and

JavaJava

C# in DetailC# in Detailis also available as anis also available as an

instructor led courseinstructor led course

Page 3: Csharp In Detail Part2

© { JSL }33

Ag

end

aA

gen

da

stringstring classclass constructorsconstructors fieldsfields parametersparameters arraysarrays boxingboxing exceptionsexceptions garbage collectiongarbage collection inheritance, interfaces, abstract classesinheritance, interfaces, abstract classes nested typesnested types delegates and eventsdelegates and events namespacesnamespaces assembliesassemblies attributesattributes reflectionreflection

Page 4: Csharp In Detail Part2

© { JSL }44

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

stri

ng

stri

ng

Page 5: Csharp In Detail Part2

© { JSL }55

stri

ng

Typ

est

rin

g T

ype

stringstring is a reference type is a reference type the only one with a literal syntaxthe only one with a literal syntax immutable; just like in Javaimmutable; just like in Java

s

stack heap

null

@t

static void Main(){ string s = null; string t = "Hiker"; ... t[0] = 'B';} Hiker

compile time error

Page 6: Csharp In Detail Part2

© { JSL }66

ind

exer

ind

exer

stringstring has a readonly indexer has a readonly indexer integer index is always bounds checkedinteger index is always bounds checked throws ArgumentOutOfRangeExceptionthrows ArgumentOutOfRangeException

static void Func(string s){ for (int i = 0; i != s.Length; i++) { char c = s[i]; Console.Write(c); }}

Page 7: Csharp In Detail Part2

© { JSL }77

Sys

tem

.Str

ing

Sys

tem

.Str

ing

stringstring is an alias for System.String is an alias for System.String

namespace System{ public sealed class String ... { ... // static methods public static int Compare(string, string); public static bool Equals(string, string); public static string Format(string, params object[]); ... // readonly property public int Length { get; } // readonly indexer public char this [int index] { get; } // instance methods public int CompareTo(string); public override bool Equals(object); public new bool Equals(string); ... }}

Page 8: Csharp In Detail Part2

© { JSL }88

Str

ing

Bu

ilder

Str

ing

Bu

ilder

System.Text.StringBuilder System.Text.StringBuilder

namespace System.Text{ public sealed class StringBuilder { public StringBuilder(); // read-write properties public int Length { get; set; } public int Capacity { get; set; } // read-write indexer public char this [int index] { get; set; } // instance methods public StringBuilder Append(...); public StringBuilder Insert(...); public StringBuilder Remove(int, int); public StringBuilder Replace(...); ... public override string ToString(); }}

Page 9: Csharp In Detail Part2

© { JSL }99

stri

ng

Lit

eral

sst

rin

g L

iter

als

usual syntaxusual syntax embedded escape chars, but no octalembedded escape chars, but no octal

unusual syntaxunusual syntax @ verbatim string literals@ verbatim string literals

"c:\temp"

@"c:\temp"

@"quote"" char"

@"MP: we got a slugJC: does it talk?MP: yupJC: I'll have it"

c: emp

c:\temp

quote"char

MP: we got a slugJC: does it talk?MP: yupJC: I'll have it

Page 10: Csharp In Detail Part2

© { JSL }1010

stri

ng

Op

erat

ors

stri

ng

Op

erat

ors

equality operators are overloadedequality operators are overloaded they compare the values not the referencesthey compare the values not the references relational operators are not overloadedrelational operators are not overloaded

binary + is overloaded, forwards to .Concatbinary + is overloaded, forwards to .Concat operator += toooperator += too

IsTrue(s == t);IsTrue(s.Equals(t));IsFalse((object)s == (object)t);

s

stack heap

@

@t Hiker

Hiker

IsTrue(s == t);IsTrue(s.Equals(t));IsTrue((object)s == (object)t);

s @

@t

Hiker

Page 11: Csharp In Detail Part2

© { JSL }1111

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

clas

scl

ass

Page 12: Csharp In Detail Part2

© { JSL }1212

clas

s D

ecla

rati

on

clas

s D

ecla

rati

on

a user-defined a user-defined referencereference type type

class Pair{ public int X, Y;};

optional semi-colon

by convention publicnames start with anuppercase letter(PascalCasing)

class Pair{ private int x, y;}

...and private names start with alowercase letter(camelCasing)

class Pair{ int x, y;}

default accessis private

Page 13: Csharp In Detail Part2

© { JSL }1313

ob

ject

Cre

atio

no

bje

ct C

reat

ion

a a classclass local variable lives on the stack local variable lives on the stack is not definitely assignedis not definitely assigned can be initialised with can be initialised with nullnull or a c'tor call or a c'tor call

p

stack

?

.X

.Y

heap

required

static void Main(){ Pair p;}

static void Main(){ Pair p = null;}

static void Main(){ Pair p = new Pair();}

p null

p @ 0

0

Page 14: Csharp In Detail Part2

© { JSL }1414

clas

s C

on

stru

cto

rcl

ass

Co

nst

ruct

or

usual usual classclass rules rules compiler declares a default c'torcompiler declares a default c'tor you can declare the default c'toryou can declare the default c'tor if you declare a c'tor the compiler doesn'tif you declare a c'tor the compiler doesn't

class Pair{}

you declare a default c'tor

class Pair{ public Pair(int x, int y) {...} }

compiler declares a default c'tor

class Pair{ public Pair() { ... }}

no one declares a default c'tor

Page 15: Csharp In Detail Part2

© { JSL }1515

: th

is(.

..):

this

(...)

a c'tor can call a sibling c'tora c'tor can call a sibling c'tor syntax is a cross between C++ and Javasyntax is a cross between C++ and Java no general member-init-list syntax thoughno general member-init-list syntax though

class Point{ public Point(int x, int y) : this(x, y, Colour.Red) { } public Point(int x, int y, Colour c) { ... } ... private int x, y; private Colour c;}

Page 16: Csharp In Detail Part2

© { JSL }1616

inst

ance

Fie

lds

inst

ance

Fie

lds

instance fields...instance fields... are default initialised by default in all c'torsare default initialised by default in all c'tors can be initialised in variable initialisercan be initialised in variable initialiser can be explicitly initialised in a c'torcan be explicitly initialised in a c'tor

class Point{ public Point(int x, int y) { this.x = x; y = y; } ... private int x; private int y = 42;}

no warning!

OKOK

OK

Page 17: Csharp In Detail Part2

© { JSL }1717

read

on

ly F

ield

sre

ado

nly

Fie

lds

readonlyreadonly instance fields... instance fields... are instance fields that cannot be assigned toare instance fields that cannot be assigned to

compile time errors

class Pair{ public Pair(int x, int y) { this.x = x; this.y = y; } public void Reset() { x = 0; y = 0; } private readonly int x, y;}

this declares Pair as an immutable object

Page 18: Csharp In Detail Part2

© { JSL }1818

con

st F

ield

sco

nst

Fie

lds

constconst fields are implicitly fields are implicitly staticstatic only simple types, only simple types, enumenums, & s, & stringstring can be can be constconst constconst fields require a variable initializer fields require a variable initializer

class Pair{ private const int x = 0, y = 0;}

class BadFields{... BadFields(...) { question = 9 * 6; }... static const int answer = 42;... const int question;... const Pair origin = new Pair();}

OK

compiletimeerrors

this declares Pair with no instance fields

Page 19: Csharp In Detail Part2

© { JSL }1919

stat

ic F

ield

sst

atic

Fie

lds

to declare to declare staticstatic fields of other types fields of other types useuse static static keyword keyword!! staticstatic fields are default initialised fields are default initialised staticstatic fields can use variable initialisers fields can use variable initialisers access is via typename onlyaccess is via typename only

class Pair{... static Pair origin;... static Pair topLeft = new Pair(10,20);... static AnyClass field;... static string both = "Arthur";}

Pair p = new Pair();...F(p.Origin); // compile-time errorF(Pair.Origin); // OK

Page 20: Csharp In Detail Part2

© { JSL }2020

stat

ic C

on

stru

cto

rst

atic

Co

nst

ruct

or

a a staticstatic c'tor initialises the type c'tor initialises the type can initialize can initialize staticstatic fields but not fields but not constconst fields fields called by VES when the type is loadedcalled by VES when the type is loaded cannot be called, no access modifier allowedcannot be called, no access modifier allowed

class GoodExample{ static GoodExample() { origin = new Pair(0,0); }...static readonly Pair origin;}

OK

class BadExample{ public static GoodExample() { x = 42; }...const int x;}

compile time errors

Page 21: Csharp In Detail Part2

© { JSL }2121

Co

py

Par

amet

ers

Co

py

Par

amet

ers

a plain parameter is a a plain parameter is a copycopy of the argument of the argument no frills bitwise copyno frills bitwise copy the argument must be definitely assignedthe argument must be definitely assigned argument can be an "rvalue"argument can be an "rvalue"

static void Method(Pair parameter){ parameter = new Pair(42,42);}

static void Main(){ Pair arg = new Pair(0,0); Console.WriteLine(arg.X); Method(arg); Console.WriteLine(arg.X);}

00

Page 22: Csharp In Detail Part2

© { JSL }2222

ref

Par

amet

ers

ref

Par

amet

ers

a a refref parameter is an parameter is an aliasalias for the argument for the argument no copy takes placeno copy takes place argument must be definitely assignedargument must be definitely assigned argument must be an "lvalue"argument must be an "lvalue" refref required on argument required on argument andand parameter parameter

static void Method(ref Pair parameter){ parameter = new Pair(42,42);}

static void Main(){ Pair arg = null; //Console.WriteLine(p.X); Method(ref arg); Console.WriteLine(arg.X);}

42

Method( ref type [ ] array ) allowed

Page 23: Csharp In Detail Part2

© { JSL }2323

ou

t P

aram

eter

so

ut

Par

amet

ers

an an outout parameter is an parameter is an aliasalias for the argument for the argument no copy takes placesno copy takes places argument need not be definitely assignedargument need not be definitely assigned parameter must be definitely assignedparameter must be definitely assigned argument must be an "lvalue"argument must be an "lvalue" outout required on argument required on argument andand parameter parameter

static void Method(out Pair parameter){ parameter = new Pair(42,42);}

static void Main(){ Pair arg; //Console.WriteLine(p.X); Method(out arg); Console.WriteLine(arg.X);}

42

Method( out type [ ] array ) allowed

Page 24: Csharp In Detail Part2

© { JSL }2424

in P

aram

eter

s?in

Par

amet

ers?

readonlyreadonly, , const,const, and and inin, are all C# keywords, are all C# keywords they cannot be applied to parametersthey cannot be applied to parameters reference types reference types alwaysalways grant write access grant write access

argument parameter

optional

required

Copy

ref

out

@

@

@

@

@@

@@

0 0initialize

Page 25: Csharp In Detail Part2

© { JSL }2525

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

[ ]

Arr

ays

[ ]

Arr

ays

Page 26: Csharp In Detail Part2

© { JSL }2626

Arr

ay V

aria

ble

sA

rray

Var

iab

les

C# supports rectangular arraysC# supports rectangular arrays rectangular arrays are reference typesrectangular arrays are reference types

int[] row = null;

int[,] grid = null;

int[,,] threeD = null;

row

stack heap

null

nullgrid

Page 27: Csharp In Detail Part2

© { JSL }2727

Arr

ay In

stan

ces

Arr

ay In

stan

ces

array instances are created using array instances are created using newnew rectangular arrays must specify rectangular arrays must specify allall dimensions dimensions array instance elements are default initialisedarray instance elements are default initialised

int[] row = new int[4];

int[,] grid = new int[2,3];

row

stack heap

@

@grid

0 0 0 0

0 0 0 0 0 0

array of structs

Page 28: Csharp In Detail Part2

© { JSL }2828

Arr

ay In

itia

lisat

ion

Arr

ay In

itia

lisat

ion

arrays can be initialisedarrays can be initialised omitted initialisers are not permittedomitted initialisers are not permitted array size may be omittedarray size may be omitted standard shortcut notationstandard shortcut notation

int[] row = new int[4] {1,2,3,4};

int[,] grid = new int[,] { {1,2,3}, {4,5,6,}, };

int[,] shortcut = { {1,2,3}, {4,5,6} };

row

stack heap

@

@grid

1 2 3 4

1 2 3 4 5 6

trailingcommasarepermitted

Page 29: Csharp In Detail Part2

© { JSL }2929

Sys

tem

.Arr

ayS

yste

m.A

rray

all array types inherit from System.Arrayall array types inherit from System.Array

namespace System{ public class Array { protected Array(); ... // readonly properties public int Length { get; } public int Rank { get; } // instance methods public int GetLength(int); // static methods public static void Clear(Array, int, int); ... }}

int[,] cosmic = { {1,2,3}, {4,5,6} };Console.Write(cosmic.Length);Console.Write(cosmic.Rank);Console.Write(cosmic.GetLength(0));Console.Write(cosmic.GetLength(1));

6223

Page 30: Csharp In Detail Part2

© { JSL }3030

Usi

ng

Arr

ays

Usi

ng

Arr

ays

all array access is bounds checkedall array access is bounds checked throws IndexOutOfRangeExceptionthrows IndexOutOfRangeException

class Example{ static void Use(int[,] grid) { int rowLength = grid.GetLength(0); int colLength = grid.GetLength(1); for (int row = 0; row != rowLength; row++) { for (int col = 0; col != colLength; col++) { Console.WriteLine(grid[row,col]); } } } static void Main() { Use(new int[,]{ {1,2,3}, {4,5,6} }); ... }}

there is no direct way to make rowLength constant

Page 31: Csharp In Detail Part2

© { JSL }3131

Rag

ged

Arr

ays

Rag

ged

Arr

ays

C# also supports ragged arrays C# also supports ragged arrays arrays of arraysarrays of arrays array instance still created using array instance still created using newnew

int[][] ragged = new int[3][ ];

int[][][] tatters = null;

ragged

stack heap

@ null null null

tatters null

Page 32: Csharp In Detail Part2

© { JSL }3232

Rag

ged

Init

ialis

atio

nR

agg

ed In

itia

lisat

ion

each sub array can be intialised as beforeeach sub array can be intialised as before you can only specify the first dimensionyou can only specify the first dimension

int[][] ragged = new int[3][4];

int[][] ragged = new int[3][] { new int[2], null, new int[4]{ 1, 2, 3, 4 } };

ragged

stack heap

@ @ null @

0 0 1 2 3 4

{ ... } shorthandallowed herebut not here

compile time error

Page 33: Csharp In Detail Part2

© { JSL }3333

par

ams

typ

e[ ]

par

ams

typ

e[ ]

C# supports variadic functionsC# supports variadic functions paramsparams keyword can be used on array parameter keyword can be used on array parameter only on a single dimension array parameteronly on a single dimension array parameter

static void GreyHole(params int[] row){ if (row != null) Console.WriteLine(row.Length); else Console.WriteLine("null");}

static void Main(){ GreyHole(null); GreyHole(); GreyHole(1); GreyHole(new int[]{1, 2}); GreyHole(1,2,3);}

null0123

params is not part of the signature

Page 34: Csharp In Detail Part2

© { JSL }3434

par

ams

ob

ject

[ ]

par

ams

ob

ject

[ ]

paramsparams with with objectobject as the element type as the element type creates a truly variadic functioncreates a truly variadic function thanks to boxingthanks to boxing

static void BlackHole(params object[] row){ if (row != null) Console.WriteLine(row.Length); else Console.WriteLine("null");}

static void Main(){ BlackHole(null); BlackHole(); BlackHole(1M); BlackHole(new int[]{1,2}); BlackHole(1, 2.0, "three");}

null0113

Page 35: Csharp In Detail Part2

© { JSL }3535

Arr

ay N

ote

sA

rray

No

tes

int[ ] illegal[ , ];

class Base {...}class Derived : Base {...}

Derived[] ds = new Derived[]{...};Base[] bs = ds;

unsafe { int * array = stackalloc int[42]; ...}

only one syntax

C# supportsarray covariance

you can createan array on thestack, but only in unsafe code

object o = new int[42]; arrays are reference types

int[ ][ , ] mixed; you can mix the two kinds of arrays

Page 36: Csharp In Detail Part2

© { JSL }3636

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Bo

xin

gB

oxi

ng

Page 37: Csharp In Detail Part2

© { JSL }3737

Rec

apR

ecap value typesvalue types

variables contain their own data directlyvariables contain their own data directly local variables always live on the stacklocal variables always live on the stack

reference typesreference types variables refer to their data indirectlyvariables refer to their data indirectly local variables refer to objects on the heaplocal variables refer to objects on the heap

object

valueenum

class

interface

[ ]array

delegate

struct value

object

object

object

@

@

@

@

Page 38: Csharp In Detail Part2

© { JSL }3838

stru

ct v

s cl

ass

stru

ct v

s cl

ass

struct Pair { int x, y; ...}

Pair p = new Pair(1,2);

Pair copy = p;

p.x

stack heap

class Pair { int x, y; ...}

Pair p = new Pair(1,2);

Pair copy = p;

1

2

@p

@copy

1

2

p.y

copy.x

copy.y

.x1

2 .y

Page 39: Csharp In Detail Part2

© { JSL }3939

Ob

ject

s E

very

wh

ere

Ob

ject

s E

very

wh

ere

everythingeverything implicitly inherits from implicitly inherits from objectobject arrays,arrays, class classes, es, interfaceinterfaces, s, delegatedelegatess structstructs, s, enumenums, as wells, as well!!

System.Int32«struct»

System.ValueType«class»

System.Enum«class»

Suit«enum»

Pair«struct»

System.Object«class»

int == System.Int32

Page 40: Csharp In Detail Part2

© { JSL }4040

Pro

ble

m?

Pro

ble

m?

a reference can bind to a valuea reference can bind to a value does the reference refer into the stack?does the reference refer into the stack? if so what happes when the scope ends?if so what happes when the scope ends?

struct Pair { public int X, Y; ...}

class Example{ static object Dangle() { Pair p = new Pair(1,2); object o = p; return o; }

static void Main() { object o = Dangle(); ... }}

p.X

stack

1

2

@o

p.Y

??

Page 41: Csharp In Detail Part2

© { JSL }4141

Bo

xed

So

luti

on

Bo

xed

So

luti

on

when a reference variable binds to a valuewhen a reference variable binds to a value the runtime copies the value onto the heapthe runtime copies the value onto the heap the reference refers to the copy on the heapthe reference refers to the copy on the heap this is called boxingthis is called boxing

the copy is the same plain bitwise copy used for value parameters/returns

struct Pair { public int X, Y; ...}

static void Function(){ Pair p = new Pair(1,2);

object o = p;}

p.X

stack heap

1

2p.Y

.X1

2 .Y

@o

boxbox

Page 42: Csharp In Detail Part2

© { JSL }4242

Un

bo

xin

gU

nb

oxi

ng

unboxing copies the boxed value back againunboxing copies the boxed value back again this requires an explicit cast to this requires an explicit cast to exactexact type type if the target type is wrong - InvalidCastExceptionif the target type is wrong - InvalidCastException

struct Pair { public int X, Y; ...}

static void Function(){ Pair p = new Pair(1,2);

object o = p;

p.X = p.Y = 0;

Pair q = (Pair)o;}

p.X

stack heap

0

0p.Y

.X1

2 .Y

@o

cast

q.X 1

2q.Y

boxbox

unboxunbox

Page 43: Csharp In Detail Part2

© { JSL }4343

Sys

tem

.Ob

ject

Sys

tem

.Ob

ject

objectobject is an alias for System.Object is an alias for System.Object

namespace System{ public class Object { public Object(); public virtual bool Equals(object); public virtual int GetHashCode(); public Type GetType(); public virtual string ToString(); ... }}

static void AnySingleArgument(object accepted){ ...}

any value variable (implicit boxing)any reference variable (implicit conversion)

Page 44: Csharp In Detail Part2

© { JSL }4444

No

Ove

rhea

dN

o O

verh

ead

in fact, value types do in fact, value types do notnot derive from derive from objectobject each value type has a hidden reference typeeach value type has a hidden reference type the hidden reference type holds the boxed valuethe hidden reference type holds the boxed value objectobject virtualvirtual method are not method are not overrideoverriden in valuesn in values they are they are overrideoverriden in the hidden reference typen in the hidden reference type

Pair« struct »

Object« class »

PairReference« class »

Int32Reference« class »

Int32« struct »

42.ToString() is not a virtual call

1 1

Page 45: Csharp In Detail Part2

© { JSL }4545

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Inh

erit

ance

Inh

erit

ance

Page 46: Csharp In Detail Part2

© { JSL }4646

Ext

ensi

on

Ext

ensi

on

like Java...like Java... a a classclass can inherit from a single can inherit from a single basebase classclass all inheritance is implicitly all inheritance is implicitly publicpublic

unlike Java...unlike Java... there is no extends keywordthere is no extends keyword by default methods are by default methods are notnot virtualvirtual a a structstruct cannot inherit from a cannot inherit from a structstruct or or class *class *

ViolinPlayer« class »

Musician« class »

class Musician{ public void NotVirtual()...}

class ViolinPlayer : Musician{ ...}

Page 47: Csharp In Detail Part2

© { JSL }4747

: b

ase(

...)

: b

ase(

...)

a a classclass can call a sibling constructor can call a sibling constructor a a struct struct can toocan too

a a classclass can call its can call its basebase classclass constructor constructor a a structstruct can't (since it can't have a can't (since it can't have a basebase classclass))

class Musician{ public Musician(string name)... public void NotVirtual()...}

class ViolinPlayer : Musician{ public ViolinPlayer(string name) : base(name) { ... }}

Page 48: Csharp In Detail Part2

© { JSL }4848

Met

ho

d A

cces

sM

eth

od

Acc

ess

two restrictionstwo restrictions a a privateprivate method cannot be method cannot be virtualvirtual a a structstruct can't declare a can't declare a protectedprotected member member

class GoodClass{ public virtual void Alpha()... protected virtual void Beta()... private void Gamma()...}class BadClass{ private virtual void Delta()...}struct GoodStruct{ public void Alpha()... private void Gamma()...}struct BadStruct{ protected void Beta()...}

Page 49: Csharp In Detail Part2

© { JSL }4949

virt

ual

virt

ual

Met

ho

ds

Met

ho

ds

a a virtualvirtual method... method... introducesintroduces a method implementation a method implementation cannot be declared in a cannot be declared in a structstruct

class Musician{ ... public virtual void TuneUp() { ... }}

class ViolinPlayer : Musician{ public virtual void TuneUp() { ... }}

this does notoverride TuneUp from the Musician class

Page 50: Csharp In Detail Part2

© { JSL }5050

ove

rrid

eo

verr

ide

Met

ho

ds

Met

ho

ds

an an overrideoverride method... method... specialisesspecialises an inherited identical an inherited identical virtualvirtual method method is implicitly is implicitly virtual virtual itselfitself cannot be declared in a cannot be declared in a struct struct **

class Musician{ ... public virtual void TuneUp() { ... }}

class ViolinPlayer : Musician{ public override void TuneUp() { ... }}

this does

same access too

Page 51: Csharp In Detail Part2

© { JSL }5151

seal

edse

aled

Met

ho

ds

Met

ho

ds

a a sealed overridesealed override method... method... specialises an inherited identical specialises an inherited identical virtualvirtual method method which cannot itself be which cannot itself be overrideoverridenn cannot be declared in a cannot be declared in a structstruct

class Musician{ ... public virtual void TuneUp() { ... }}class ViolinPlayer : Musician{ public sealed override void TuneUp() { ... }}

sealed is always used with override

Page 52: Csharp In Detail Part2

© { JSL }5252

new

Met

ho

ds

new

Met

ho

ds

a a newnew method... method... hides an identical inherited methodhides an identical inherited method can be used in combination with can be used in combination with virtualvirtual cannot be used in combination with cannot be used in combination with overrideoverride

class Musician{ ... public virtual void TuneUp() { ... }}

class ViolinPlayer : Musician{ public new virtual void TuneUp() { ... }}

Page 53: Csharp In Detail Part2

© { JSL }5353

Tab

leT

able method modifiersmethod modifiers

structclass

override no*yes

sealed noyes

new no*yes

public yesyes

protected noyes

private yesyes

virtual noyes only needed whenoverriding or hiding methods from System.ValueType

Page 54: Csharp In Detail Part2

© { JSL }5454

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Inte

rfac

esIn

terf

aces

Page 55: Csharp In Detail Part2

© { JSL }5555

inte

rfac

ein

terf

ace

interfaces contain method signaturesinterfaces contain method signatures no access modifier, implicitly no access modifier, implicitly publicpublic no fields, not even no fields, not even staticstatic ones ones

interface names should start with an I

interface ITuneable{ void TuneUp();}

interface IPluckable{ void Pluck();}

IPluckable« interface »

ITuneable« interface »

Page 56: Csharp In Detail Part2

© { JSL }5656

Mu

ltip

le In

terf

aces

Mu

ltip

le In

terf

aces

a a classclass can implement many can implement many interfaceinterfacess so can an so can an interfaceinterface so can a so can a struct struct (boxing)(boxing)

no implements keywordno implements keyword notation is positionalnotation is positional base base classclass first, then base first, then base interfaceinterfacess

class Violin : Instrument , IPluckable , ITuneable{ ...}

IPluckable« interface »

ITuneable« interface »

Violin« class »

Instrument« class »

Page 57: Csharp In Detail Part2

© { JSL }5757

I.I.I.

I.I.I.

"implicit" interface implementation"implicit" interface implementation methods must be explicitly declared methods must be explicitly declared publicpublic by default methods are by default methods are notnot virtualvirtual

a class must implement all inherited interface methods

interface ITuneable{ void TuneUp();}

interface IPluckable{ void Pluck();}

class Violin : IPluckable, ITuneable{ public void TuneUp() { ... } public virtual void Pluck() { ... } ...}

Page 58: Csharp In Detail Part2

© { JSL }5858

E.I.

I.E

.I.I. explicit interface implementationexplicit interface implementation

cannot have access modifier (cannot have access modifier (privateprivate-ish)-ish) cannot be cannot be virtualvirtual

interface ITuneable{ void TuneUp();}

interface IPluckable{ void Pluck();}

class Violin : Instrument , IPluckable, ITuneable{ void ITuneable.TuneUp() { ... } void IPluckable.Pluck() { ... } ...}

consider inheriting two operations with the same signature

you can mix III and EII

Page 59: Csharp In Detail Part2

© { JSL }5959

inte

rfac

e P

rop

erty

inte

rfac

e P

rop

erty

an an interfaceinterface can declare a property can declare a property readwrite, readonly, writeonlyreadwrite, readonly, writeonly

interface IButton{ string Caption { get; set; } ...}

class Button : IButton{ public virtual string Caption { get { ... } set { ... } } ... private string caption;}

Page 60: Csharp In Detail Part2

© { JSL }6060

inte

rfac

e In

dex

erin

terf

ace

Ind

exer

an an interfaceinterface can declare an indexer can declare an indexer readwrite, readonly, writeonlyreadwrite, readonly, writeonly indexers are not static operatorsindexers are not static operators

interface IDictionary{ string this [ string word ] { get; set; } ...}

class Dictionary : IDictionary{ public virtual string this [ string word ] { get { ... } set { ... } } ...}

Page 61: Csharp In Detail Part2

© { JSL }6161

isis use use isis operator to check for type support operator to check for type support

returns returns truetrue or or falsefalse a cast can a cast can throwthrow an InvalidCastException an InvalidCastException

static void GreyHole(object o){ if (o is IPluckable) { IPluckable ip = (IPluckable)o; ip.Pluck() ... }}

static void Main(){ GreyHole(new Violin()); GreyHole(42);}

check once

check twice

cast

Page 62: Csharp In Detail Part2

© { JSL }6262

asas

the the asas operator is similar operator is similar performs the conversion if the type is supportedperforms the conversion if the type is supported returns returns nullnull if its not if its not

static void GreyHole(object o){ IPluckable ip = o as IPluckable; if (ip != null) { ip.Pluck(); ... }}

static void Main(){ GreyHole(new Violin()); GreyHole(42);}

check once

Page 63: Csharp In Detail Part2

© { JSL }6363

typ

eof

typ

eof

retrieving the exact type of an objectretrieving the exact type of an object System.Object.GetType() for variablesSystem.Object.GetType() for variables typeoftypeof for types known at compile time for types known at compile time Type.GetType() for types known at runtimeType.GetType() for types known at runtime

static void Main(){ Violin stradi = new Violin(); IPluckable ip = stradi;

Type t1 = ip.GetType(); Type t2 = typeof(Violin); Type t3 = Type.GetType("Violin");

Console.WriteLine(t1 == t2); Console.WriteLine(t2 == t3); Console.WriteLine((object)t1 == (object)t2); Console.WriteLine((object)t2 == (object)t3);}

TrueTrueTrueTrue

Page 64: Csharp In Detail Part2

© { JSL }6464

ref

ou

tre

f o

ut

interfaceinterface parameters parameters can be can be refref qualified qualified can be can be outout qualified qualified

interface IPluckable{ void Pluck();}

static void Replace(ref IPluckable instrument){ instrument = new Guitar();}

static void Create(out IPluckable instrument){ instrument = new Banjo();}

Page 65: Csharp In Detail Part2

© { JSL }6565

Tab

leT

able method modifiersmethod modifiers

structclass

override no*yes

sealed noyes

new no*yes

public yesyes

protected noyes

private yesyes

virtual noyes

i'face

no

no

yes

no

no

no

no

Page 66: Csharp In Detail Part2

© { JSL }6666

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Ab

stra

ct C

lass

esA

bst

ract

Cla

sses

Page 67: Csharp In Detail Part2

© { JSL }6767

abst

ract

Cla

sses

abst

ract

Cla

sses

an an abstractabstract classclass...... cannot be instantiatedcannot be instantiated can extend an can extend an abstractabstract class class or a or a classclass otherwise the same as a otherwise the same as a classclass

abstract class Bar{ ... private int instanceMethod() { ... } private int instanceField;}

abstract class Foo : Bar{ ... public static int StaticMethod() { ... } public static int StaticField;}

Page 68: Csharp In Detail Part2

© { JSL }6868

abst

ract

Met

ho

ds

abst

ract

Met

ho

ds

an an abstractabstract method... method... can only be declared in an can only be declared in an abstractabstract classclass has no bodyhas no body cannot be cannot be privateprivate

abstract class Foo : Bar{ public abstract void Method(); ...}

Page 69: Csharp In Detail Part2

© { JSL }6969

abst

ract

No

tes

abst

ract

No

tes

an an abstractabstract method... method... can can overrideoverride a inherited a inherited virtualvirtual method method must be implemented with the must be implemented with the samesame access access

abstract class Bar{ protected virtual void Method() { ... } ...}

abstract class Foo : Bar{ protected abstract override void Method(); ...}

Page 70: Csharp In Detail Part2

© { JSL }7070

seal

ed C

lass

esse

aled

Cla

sses

a a sealedsealed classclass cannot be derived fromcannot be derived from cannot declare cannot declare virtual virtual methodsmethods cannot declare cannot declare abstractabstract methods methods structstructs and s and enumenums are implicitly s are implicitly sealedsealed

abstract class Foo : Bar{ protected abstract Method();}

sealed class Wibble : Foo{ protected override void Method() { ... } ...}

Page 71: Csharp In Detail Part2

© { JSL }7171

Tab

leT

able method modifiersmethod modifiers

structclass

override no*yes

sealed noyes

new no*yes

public yesyes

protected noyes

private yesyes

virtual noyes

i'face

no

no

yes

no

no

no

no

abstract

yes

yes

yes

yes

yes

no

yes

sealed

yes

yes

yes

yes

yes

yes

no

abstract nonono yes no

Page 72: Csharp In Detail Part2

© { JSL }7272

An

oth

er T

able

An

oth

er T

able

method modifier combinationsmethod modifier combinations

override

new

sealed

virtual

1

2

N

N

abstract •

ab

stra

ct

N

3

N

vir

tua

l

N

4

ov

erri

de

N

ne

w

sea

led

modifier order isnot significant

Page 73: Csharp In Detail Part2

© { JSL }7373

C# ProgrammingC# Programming

Exc

epti

on

sE

xcep

tio

ns

Fundamentals

Objects

Relationships

Systems

Page 74: Csharp In Detail Part2

© { JSL }7474

Sys

tem

.Exc

epti

on

Sys

tem

.Exc

epti

on

the root of all Exception clasasesthe root of all Exception clasases

namespace System{ public class Exception ... { public Exception(); public Exception(string); public Exception(string, Exception); ... public Exception InnerException { get; } public virtual string Message { get; } public virtual string StackTrace { get; } ... public override string ToString(); ... }}

Page 75: Csharp In Detail Part2

© { JSL }7575

Hie

rarc

hy

Hie

rarc

hy

Exception

ArithmeticException

InvalidCastException

DivideByZeroException

OutOfMemoryException

NullReferenceException

OverflowException

SystemException

...

ExecutionEngineException

IndexOutOfRangeException

Page 76: Csharp In Detail Part2

© { JSL }7676

thro

wth

row

you can you can throwthrow any object you like any object you like as long as it's derived from System.Exceptionas long as it's derived from System.Exception

class Matrix { public Matrix(int rowSize, int colSize) { ... }

public Row this [ int index ] { get { BoundsCheck(index); ... } set { BoundsCheck(index); ... } } // validation private void BoundsCheck(int index) { if (index < 0 || index >= rows.Length) throw new IndexOutOfRangeException(); } // representation private Row[] rows;}

don't forget the new

Page 77: Csharp In Detail Part2

© { JSL }7777

try

catc

htr

y ca

tch

you can separate out error handling codeyou can separate out error handling code in a in a catchcatch { block } after a { block } after a trytry { block } { block } goodbye HRESULTgoodbye HRESULT

try { FileInfo source = new FileInfo(filename); int length = (int)source.Length; char[] contents = new char[length]; ...}catch (SecurityException caught) { ... }catch (IOException caught) { ... }catch (OutOfMemoryException) { ... }catch { ... throw; }

name isoptional

generalcatchblock

Page 78: Csharp In Detail Part2

© { JSL }7878

fin

ally

fin

ally

you can ensure code always runsyou can ensure code always runs in a in a finallyfinally { block } { block } exception in exception in finallyfinally block dominates block dominates you cannot jump out of a you cannot jump out of a finallyfinally block block

TextReader reader = null;try { FileInfo source = new FileInfo(filename); int length = (int)source.Length; char[] contents = new char[length]; reader = source.OpenText(); reader.Read(contents, 0, length); ...}...finally { if (reader != null) { reader.Close(); } }

definite assignment rules, OK

Page 79: Csharp In Detail Part2

© { JSL }7979

Lo

cal R

eso

urc

esL

oca

l Res

ou

rces

deterministic finalisation via deterministic finalisation via finallyfinally...... is exception safe, but...is exception safe, but... is repetitive and doesn't scaleis repetitive and doesn't scale is complex and fails to abstractis complex and fails to abstract

TextReader reader = null;try { FileInfo source = new FileInfo(filename); int length = (int)source.Length; char[] contents = new char[length]; reader = source.OpenText(); reader.Read(contents, 0, length); ...}...finally { if (reader != null) { reader.Close(); } }

Page 80: Csharp In Detail Part2

© { JSL }8080

usi

ng

Sta

tem

ents

usi

ng

Sta

tem

ents

after discussions on the .NET reflectorafter discussions on the .NET reflector M'Soft provided a solution consisting of...M'Soft provided a solution consisting of... the IDisposable the IDisposable interfaceinterface in combination with... in combination with... the the usingusing statement statement

using (type variable = init) embedded-statement

{ type variable = init; try { embedded-statement } finally { if (variable != null) { ((IDisposable)variable).Dispose(); } }}

precisely equivalent to

Page 81: Csharp In Detail Part2

© { JSL }8181

IDis

po

sab

leID

isp

osa

ble

struct AutoClosing : IDisposable{ public AutoClosing(TextReader reader) { if (reader == null) { throw new ArgumentNullException(); } target = reader; } public void Dispose() { target.Close(); } private readonly TextReader target;}

interface IDisposable{ void Dispose();}

Page 82: Csharp In Detail Part2

© { JSL }8282

Pre

fere

nce

?P

refe

ren

ce?

...TextReader reader = source.OpenText();using (new AutoClosing(reader)){ reader.Read(contents, 0, length); ...}

TextReader reader = null;try { ... reader = source.OpenText(); reader.Read(contents, 0, length); ...}finally { if (reader != null) { reader.Close(); } }

Before...

...After

Page 83: Csharp In Detail Part2

© { JSL }8383

lock

lock

C# does not have a synchronize keywordC# does not have a synchronize keyword it has it has locklock statements statements

public class Monitor{ public static void Enter(object); public static void Exit(object); ...}

lock (expression) embedded-statement

System.Threading.Monitor.Enter(expression);try { embedded-statement}finally { System.Threading.Monitor.Exit(expression);}

precisely equivalent to (expression is evaluated once)

Page 84: Csharp In Detail Part2

© { JSL }8484

Exc

epti

on

No

tes

Exc

epti

on

No

tes

throw specifications - NOthrow specifications - NO checked/unchecked distinction - NOchecked/unchecked distinction - NO compile time exceptions - NOcompile time exceptions - NO

Page 85: Csharp In Detail Part2

© { JSL }8585

C# ProgrammingC# Programming

Gar

bag

e C

olle

ctio

nG

arb

age

Co

llect

ion

Fundamentals

Objects

Relationships

Systems

Page 86: Csharp In Detail Part2

© { JSL }8686

Th

e M

irac

le o

f B

irth

Th

e M

irac

le o

f B

irth

objectobject birth is a two phase process birth is a two phase process allocate the raw memoryallocate the raw memory

using operator using operator newnew { 1,2,3,4 } is an [ ]array shorthand{ 1,2,3,4 } is an [ ]array shorthand "literal" is a "literal" is a stringstring shorthand shorthand

initialise an object in the memoryinitialise an object in the memory using a constructorusing a constructor you can't use a constructor without you can't use a constructor without newnew

Get that would you, Deidre....

Page 87: Csharp In Detail Part2

© { JSL }8787

Dea

thD

eath objectobject death is a two phase process death is a two phase process

finalise the object back to raw memoryfinalise the object back to raw memory deallocate the raw memory back to the heapdeallocate the raw memory back to the heap

C++ – deterministicC++ – deterministic user calls destructoruser calls destructor user calls operator deleteuser calls operator delete

C# – non deterministic (like Java)C# – non deterministic (like Java) GC calls FinalizeGC calls Finalize GC reclaims heap memory GC reclaims heap memory

Shall we take our cars?

Page 88: Csharp In Detail Part2

© { JSL }8888

Fin

aliz

eF

inal

ize

garbage collector finalizes objectsgarbage collector finalizes objects when they become unreachablewhen they become unreachable by calling Finalize( )by calling Finalize( ) but you cannot but you cannot overrideoverride Object.Finalize!! Object.Finalize!! or call itor call it

public class Resource { ... public void Dispose() { this.Finalize(); }

protected override void Finalize() { ... }}

compile time errors

Page 89: Csharp In Detail Part2

© { JSL }8989

Des

tru

cto

rD

estr

uct

or

instead you write a destructorinstead you write a destructor which the compiler translates into Finalizewhich the compiler translates into Finalize can be declared in a can be declared in a classclass but not a but not a structstruct automatically calls its automatically calls its basebase class Finalize class Finalize can can onlyonly be called by garbage collector be called by garbage collector

public class Resource { ... ~Resource() { //... } ...}

public class Resource { ... protected override void Finalize() { //... base.Finalize(); } ...}

Page 90: Csharp In Detail Part2

© { JSL }9090

GC

No

tes

GC

No

tes

Beta-2Beta-2 destructors destructors areare called when program exits :-) called when program exits :-) API to toggle this behavior :-)API to toggle this behavior :-) Finalize can make Finalize can make thisthis known again known again

complex resurrection issues, slows GC :-(complex resurrection issues, slows GC :-( what happens if Finalize throws ?what happens if Finalize throws ?

specification doesn't say :-(specification doesn't say :-(

Page 91: Csharp In Detail Part2

© { JSL }9191

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Nes

ted

Typ

esN

este

d T

ypes

Page 92: Csharp In Detail Part2

© { JSL }9292

Nes

ted

Typ

esN

este

d T

ypes

a a classclass or or structstruct can declare nested types can declare nested types nested types default to nested types default to private private accessaccess non-nested types default to non-nested types default to internalinternal access access

class Outer{ interface Space { } abstract class Reaches { } class Limits { } sealed class Hebrides { } struct Mongolia { }}

internal access

private access

Page 93: Csharp In Detail Part2

© { JSL }9393

Nes

ted

Acc

ess

Nes

ted

Acc

ess

a nested type...a nested type... has access to all members of outer typeshas access to all members of outer types but not vice versabut not vice versa C# follows Java access modelC# follows Java access model

class Outer{ public class Inner { private void peek(Outer can) { can.peek(this); } } private void peek(Inner cannot) { cannot.peek(this); }}

OKFails

Outer.peek(Inner cannot)Inner.peek(Outer can)

Page 94: Csharp In Detail Part2

© { JSL }9494

Acc

ess

Mo

dif

iers

Acc

ess

Mo

dif

iers

there are five kinds of accessthere are five kinds of access nested types can have any access modifiernested types can have any access modifier non-nested types can be non-nested types can be publicpublic or or internalinternal

internal

protected internal

private

protected

Y

public Y

no

n-n

es

ted

Y

Y

Y

Y

ne

ste

d

Y

protectedORinternal

Page 95: Csharp In Detail Part2

© { JSL }9595

Sem

anti

csS

eman

tics

C# nested types are implicitly C# nested types are implicitly staticstatic C# does not have Java inner classes C# does not have Java inner classes C# does not have Java local classesC# does not have Java local classes C# does not have Java anonymous classesC# does not have Java anonymous classes

class Outer{ ... class Nested { ... } ... }

Outer.Nested« class »

Outer« class »

Outer$Inner« class »

Outer« class » Outer.this

1

C#, C++

Java

Page 96: Csharp In Detail Part2

© { JSL }9696

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Del

egat

esD

eleg

ates

Page 97: Csharp In Detail Part2

© { JSL }9797

del

egat

e T

ype

del

egat

e T

ype

a a delegatedelegate is the last C# type... is the last C# type... declares a named signature including return typedeclares a named signature including return type like a C++ function pointer/objectlike a C++ function pointer/object similar to a Delphi closuresimilar to a Delphi closure

delegate void Func(string s);

class Eg{ public static void ForAll(string[] args, Func call) { foreach (string arg in args) { call(arg); } }}

Func is a type name

Page 98: Csharp In Detail Part2

© { JSL }9898

stat

ic M

eth

od

stat

ic M

eth

od

a a delegatedelegate instance... instance... can hold and call a can hold and call a staticstatic method method

delegate void Func(string s);...class Test{ static void Display(string s) { ... }

static void Main(string[] args) { Eg.ForAll(args, new Func(Test.Display)); Eg.ForAll(args, new Func(Display)); }}

note no ( )

create a delegate instance

Page 99: Csharp In Detail Part2

© { JSL }9999

Inst

ance

Met

ho

dIn

stan

ce M

eth

od

a a delegatedelegate instance... instance... can hold and call an instance methodcan hold and call an instance method

delegate void Func(string s);...class Test{ void Stash(string s) { ... }

void NotMain(string[] args) { Eg.ForAll(args, new Func(this.Stash)); Eg.ForAll(args, new Func(Stash)); }}

Page 100: Csharp In Detail Part2

© { JSL }100100R

emem

ber

Th

is?

Rem

emb

er T

his

?

delegate void Method();...TextReader reader = source.OpenText();using (new Finally(new Method(reader.Close))){ reader.Read(contents, 0, length); ...}

TextReader reader = null;try { ... reader = source.OpenText(); reader.Read(contents, 0, length); ...}finally { if (reader != null) { reader.Close(); } }

...After

Before...

Page 101: Csharp In Detail Part2

© { JSL }101101F

inal

lyF

inal

ly

public delegate void Method();

public struct Finally : IDisposable{ public Finally(Method call) { if (call == null) { throw new ArgumentNullException(); } this.call = call; } public override void Dispose() { call(); } private readonly Method call;}

Page 102: Csharp In Detail Part2

© { JSL }102102M

ulit

cast

del

egat

eM

ulit

cast

del

egat

e a a voidvoid return type return type delegatedelegate... ...

can hold multiple callback in its invocation listcan hold multiple callback in its invocation list first in, first calledfirst in, first called

delegate void Pred(string s);...class Test{ void DoThis(string s) { ... }

static void ThenThat(string s) { ... }

void Method(string arg) { Pred call = null; call += new Pred(this.DoThis); call += new Pred(Test.ThenThat); ... call(arg); }}

Page 103: Csharp In Detail Part2

© { JSL }103103d

eleg

ate

No

tes

del

egat

e N

ote

s delegatesdelegates

are called directly from invokers threadare called directly from invokers thread can be compared for equalitycan be compared for equality can be can be refref and and outout parameters parameters are implicitly sealed typesare implicitly sealed types

combinable delegatecombinable delegate voidvoid return type return type implicitly derive from System.Delegateimplicitly derive from System.Delegate

non-combinable delegatenon-combinable delegate non non voidvoid return type return type no no outout parameters parameters implicitly derive from System.MultiCastDelegateimplicitly derive from System.MultiCastDelegate

Page 104: Csharp In Detail Part2

© { JSL }104104

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Eve

nts

Eve

nts

Page 105: Csharp In Detail Part2

© { JSL }105105ev

ent

Del

egat

esev

ent

Del

egat

es a a delegatedelegate field can be marked as an field can be marked as an eventevent

onlyonly += and += and -=-= can be performed on the field can be performed on the field used widely in GUI classesused widely in GUI classes

namespace System.Windows.Forms{ public class Button : ... { ... public event EventHandler Click; ... ... protected void OnClick(EventArgs e) { if (Click != null) { Click(this, e); } } ... }}

Page 106: Csharp In Detail Part2

© { JSL }106106E

ven

t D

eleg

ates

Eve

nt

Del

egat

es .NET framework has many .NET framework has many eventevent delegatesdelegates

by convention first parameter is event senderby convention first parameter is event sender and second parameter derives from EventArgsand second parameter derives from EventArgs

namespace System{ public delegate void EventHandler ( object sender, EventArgs e ); ... public class EventArgs { ... }}

Page 107: Csharp In Detail Part2

© { JSL }107107E

ven

t E

xam

ple

Eve

nt

Exa

mp

le easy to imagine this in Java...easy to imagine this in Java...

using an anonymous classusing an anonymous class

using System;using System.Windows.Forms;

class MyForm : Form{ private void InitializeComponent() { openFile = new Button(); ... openFile.Click += new EventHandler(OpenFile); }

protected void OpenFile(object sender, EventArgs e) { ... }

private Button openFile;}

Note case difference: openFile vs OpenFile

Page 108: Csharp In Detail Part2

© { JSL }108108E

ven

t P

rop

erti

esE

ven

t P

rop

erti

es eventevent fields can be exposed as properties fields can be exposed as properties

consider a consider a classclass with lots of with lots of eventeventss lazy creation might be usefullazy creation might be useful += forwards to += forwards to addadd -=-= forwards to forwards to removeremove

namespace System.Windows.Forms{ public class Button : ... { ... public event EventHandler Click { add { ... } remove { ... } } ... }}

Page 109: Csharp In Detail Part2

© { JSL }109109

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Nam

esp

aces

Nam

esp

aces

Page 110: Csharp In Detail Part2

© { JSL }110110n

ames

pac

en

ames

pac

e a namespace is a logical naming mechanisma namespace is a logical naming mechanism

no relation to directory names or assembliesno relation to directory names or assemblies a single .cs file can declare several namespacesa single .cs file can declare several namespaces implicitly implicitly publicpublic handy shorthandhandy shorthand no anonymous namespaceno anonymous namespace

namespace Accu{ namespace Conference { ... }}namespace Informant{ ...}

namespace Accu.Conference{ ... ... ... ...}namespace Informant{ ...}

Page 111: Csharp In Detail Part2

© { JSL }111111u

sin

g D

irec

tive

usi

ng

Dir

ecti

ve only allowed at the start of namespaceonly allowed at the start of namespace

respect scope, not recursive, no clash if no userespect scope, not recursive, no clash if no use never affect other never affect other usingusing directives directives

using System;

class Bar { ... }

namespace Accu.Conference{ using System.Collections; ... class Foo : Bar { static void Main(String[] args) { Console.Write(args[0]); } ... private Hashtable store; } }

Page 112: Csharp In Detail Part2

© { JSL }112112u

sin

g A

lias

usi

ng

Alia

s a a usingusing alias creates alias for... alias creates alias for...

a namespace, ora namespace, or a typea type

namespace CSharp{ using Vector = System.Collections.ArrayList; class SourceFile { ... Vector tokens; }}

Page 113: Csharp In Detail Part2

© { JSL }113113N

ames

pac

e N

ote

sN

ames

pac

e N

ote

s usingusing

only at start of namespaceonly at start of namespace respects scoperespects scope never affect subsequent using directivesnever affect subsequent using directives never affect subsequent using aliasesnever affect subsequent using aliases

namespacenamespace top level, non nested classestop level, non nested classes publicpublic or or internalinternal, default to , default to internalinternal cannot be cannot be protectedprotected or or privateprivate

Page 114: Csharp In Detail Part2

© { JSL }114114

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Ass

emb

lies

Ass

emb

lies

Page 115: Csharp In Detail Part2

© { JSL }115115M

od

ule

sM

od

ule

s a physical .NET .DLL a physical .NET .DLL

contains types and MSIL codecontains types and MSIL code unit of dynamic downloadunit of dynamic download

a PE (portable executable) file written usinga PE (portable executable) file written using C#, VB.NET, managed C++, raw MSIL, others...C#, VB.NET, managed C++, raw MSIL, others... but not a mixturebut not a mixture

C:\> csc ... /target:module ...

Page 116: Csharp In Detail Part2

© { JSL }116116A

ssem

bly

Ass

emb

ly a logical .NET .DLL containing...a logical .NET .DLL containing...

manifest containing metadatamanifest containing metadata name, version#, file-listname, version#, file-list referenced assembliesreferenced assemblies type-list type-list containing module containing module security permissionssecurity permissions

one or more modules containing typesone or more modules containing types one containing assembly entry pointone containing assembly entry point

zero or more resourceszero or more resources bitmaps, icons, etcbitmaps, icons, etc

physically or logicallycontaining

C:\> csc ... /target:library ...C:\> csc ... /addmodule:... C:\> csc ... /target:exe /reference:...

Page 117: Csharp In Detail Part2

© { JSL }117117D

eplo

ymen

tD

eplo

ymen

t to deploy an assembly...to deploy an assembly...

drop it and its linked files into a drop it and its linked files into a singlesingle directory directory goodbye registrygoodbye registry

private assemblies...private assemblies... live in their application's directorylive in their application's directory are not versionedare not versioned

shared assemblies...shared assemblies... live in a shared directory (Global Assembly Cache)live in a shared directory (Global Assembly Cache) are versionedare versioned need a shared name (aka strong name)need a shared name (aka strong name)

textual nametextual name public keypublic key digital signaturedigital signature

Page 118: Csharp In Detail Part2

© { JSL }118118V

ersi

on

ing

Ver

sio

nin

g assemblies with different versions co-existassemblies with different versions co-exist

allows assembly evolution managementallows assembly evolution management never modify an existing assemblynever modify an existing assembly instead, create a new assembly with a new versioninstead, create a new assembly with a new version

<major>.<minor>.<build>.<revision>

incompatible maybecompatible

QuickFixEngineering

Page 119: Csharp In Detail Part2

© { JSL }119119V

ersi

on

Po

licy

Ver

sio

n P

olic

y update policy controlled via .XML text fileupdate policy controlled via .XML text file

defaultdefault major.minor as builtmajor.minor as built

specificspecific major.minor as specifiedmajor.minor as specified

QFEQFE latest build.revision?latest build.revision?

safesafe exactly as builtexactly as built

...<BindingPolicy> <BindingRedir Name="Wibble" Originator="32ab4ba45e0a69a1" Version="*" VersionNew="6.1.1212.14" UseLatestBuildRevision="no"/></BindingPolicy>

Page 120: Csharp In Detail Part2

© { JSL }120120in

tern

al a

cces

sin

tern

al a

cces

s logical access controllogical access control

public, protected, privatepublic, protected, private

physical access controlphysical access control internal internal access is within assemblyaccess is within assembly

public

internal

private

an assemblyof four classes

Page 121: Csharp In Detail Part2

© { JSL }121121

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

[Att

rib

ute

s][A

ttri

bu

tes]

Page 122: Csharp In Detail Part2

© { JSL }122122W

hat

Are

Th

ey?

Wh

at A

re T

hey

? attributes allow code elements to...attributes allow code elements to...

be tagged with declarative informationbe tagged with declarative information which is then added to the metadatawhich is then added to the metadata which can queried using reflectionwhich can queried using reflection

for example...for example... suppose you wanted to record which developers suppose you wanted to record which developers

implemented which typesimplemented which types ...... create a class to represent the developer infocreate a class to represent the developer info tag types with the developer attributetag types with the developer attribute specify developer attribute is only for typesspecify developer attribute is only for types decide whether to allow multiple tagsdecide whether to allow multiple tags

Page 123: Csharp In Detail Part2

© { JSL }123123A

ttri

bu

te C

lass

Att

rib

ute

Cla

ss create attribute classcreate attribute class

must derive from System.Attributemust derive from System.Attribute recommedation – use Attribute suffix in namerecommedation – use Attribute suffix in name

...public sealed class DeveloperAttribute : System.Attribute{ ... public DeveloperAttribute(string name) { ... } ...}

Page 124: Csharp In Detail Part2

© { JSL }124124[

tag

]

[ ta

g ]

tag code elements with [attribute]'stag code elements with [attribute]'s

ConstInt struct is tagged [ DeveloperAttribute ]ConstInt struct is tagged [ DeveloperAttribute ]

[DeveloperAttribute("Jon Jagger")]

public struct ConstInt{ public ConstInt(int value) { this.value = value; }

public static implicit operator int(ConstInt from) { return from.value; }

private readonly int value;}

Page 125: Csharp In Detail Part2

© { JSL }125125P

rob

lem

Pro

ble

m how can you specify which kind of code how can you specify which kind of code

elements the attribute is to be used with?elements the attribute is to be used with? Assembly, ModuleAssembly, Module Interface, Class, Struct, Enum, DelegateInterface, Class, Struct, Enum, Delegate Constructor, Method, Property, Field, EventConstructor, Method, Property, Field, Event Parameter, ReturnValueParameter, ReturnValue AllAll

Page 126: Csharp In Detail Part2

© { JSL }126126A

ttri

bu

teU

sag

eA

ttri

bu

teU

sag

e use a predefined AttributeUsage attribute!use a predefined AttributeUsage attribute!

with AttributeTarget enumwith AttributeTarget enum

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface)]

public sealed class DeveloperAttribute : System.Attribute{ ... public DeveloperAttribute(string name) { ... } ...}

Page 127: Csharp In Detail Part2

© { JSL }127127M

ult

iple

Tag

sM

ult

iple

Tag

s decide whether to allow multiple tagsdecide whether to allow multiple tags

use named parameter, AllowMultiple = true use named parameter, AllowMultiple = true

[AttributeUsage(AttributeTargets.Class | ..., AllowMultiple = true)]

public sealed class DeveloperAttribute : System.Attribute{ ... public DeveloperAttribute(string name) { ... } ...}

[DeveloperAttribute("Jon Jagger")][DeveloperAttribute("Patrick Jagger")]public struct ConstInt{ ...}

Page 128: Csharp In Detail Part2

© { JSL }128128P

osi

tio

nal

Po

siti

on

al positional parameterspositional parameters

must be specified in the attribution must be specified in the attribution correspond to constructor argumentscorrespond to constructor arguments

...public sealed class DeveloperAttribute : System.Attribute{ public DeveloperAttribute(string name) { ... } ...}

[DeveloperAttribute("Jon Jagger")]

public struct ConstInt{ ...}

Page 129: Csharp In Detail Part2

© { JSL }129129N

amed

Nam

ed named parametersnamed parameters

optionally specified in the attribution optionally specified in the attribution must correspond to fields/propertiesmust correspond to fields/properties

(non-(non-staticstatic, , publicpublic, read-write), read-write)

...public sealed class DeveloperAttribute : System.Attribute{ public DeveloperAttribute(string name) ... ... public string TelExt { get {...} set {...} }}

[DeveloperAttribute("Patrick Jagger")][DeveloperAttribute("Jon Jagger", TelExt="4263")]

public struct ConstInt { ... }

Page 130: Csharp In Detail Part2

© { JSL }130130m

etad

ata

met

adat

a attributes are added to assembly metadataattributes are added to assembly metadata

visible though ILDASM or reflectionvisible though ILDASM or reflection

Page 131: Csharp In Detail Part2

© { JSL }131131N

ote

sN

ote

s attributes are checked at compile timeattributes are checked at compile time

incorrect usage causes compile time error incorrect usage causes compile time error predefined attribute classes includepredefined attribute classes include

[Conditional][Conditional] [Obsolete][Obsolete] [CLSCompliant][CLSCompliant] [Serializable][Serializable]

attribute parameter types limited toattribute parameter types limited to bool, byte, char, double, float, int, long, shortbool, byte, char, double, float, int, long, short string, objectstring, object public enumspublic enums TypeType

CLS attribute based templates CLS attribute based templates check out check out www.newtelligence.comwww.newtelligence.com

Page 132: Csharp In Detail Part2

© { JSL }132132

C# ProgrammingC# Programming

Fundamentals

Objects

Relationships

Systems

Ref

lect

ion

Ref

lect

ion

Page 133: Csharp In Detail Part2

© { JSL }133133T

erm

ino

log

yT

erm

ino

log

y .NET has almost perfect reflection.NET has almost perfect reflection

reflection API's even allow dynamic creationreflection API's even allow dynamic creation

Reflection is the ability of a program to manipulate as data something representing the state of the program during its own execution. There are two apects to such manipulation:

Introspection is the ability of a program to observe and therefore reason about its own state.

Intercession is the ability of a program to modify its own execution state or alter its own interpretation or meaning. Both apects require a mechanism for encoding execution state as data; providing such an encoding is called reification

Richard Gabriel, et al

Page 134: Csharp In Detail Part2

© { JSL }134134A

ttri

bu

tes

Att

rib

ute

s retrieving custom attributesretrieving custom attributes

public sealed class DeveloperAttribute ...{ ... public override string ToString() { ... } ...}

public class Example{ static void Main() { string typename = "ConstInt"; Type t = Type.GetType(typename); object[] atts = t.GetCustomAttributes(true); foreach (object att in atts) { Console.WriteLine(att); } } }

Page 135: Csharp In Detail Part2

© { JSL }135135R

emem

ber

Th

is?

Rem

emb

er T

his

?

TextReader reader = source.OpenText();using (new Finally(reader, "Close")){ reader.Read(contents, 0, length); ...}

TextReader reader = null;try { ... reader = source.OpenText(); reader.Read(contents, 0, length); ...}finally { if (reader != null) { reader.Close(); } }

...After

Page 136: Csharp In Detail Part2

© { JSL }136136F

inal

lyF

inal

lyusing System;using System.Reflection;

public struct Finally : IDisposable{ public Finally(object target, string methodName) { this.target = target; this.methodName = methodName; } public void Dispose() { Type t = target.GetType(); MethodInfo method = t.GetMethod(methodName); if (method != null) { t.InvokeMember( methodName, BindingFlags.InvokeMethod, target, new object[0] ); } } private readonly object target; private readonly string methodName;}

Page 137: Csharp In Detail Part2

© { JSL }137137S

um

mar

yS

um

mar

y arrays: rectangular, ragged, paramsarrays: rectangular, ragged, params string: immutable, readonly[], verbatimstring: immutable, readonly[], verbatim class: ref/out, static c'tor, boxingclass: ref/out, static c'tor, boxing exceptions: lock, no throw-specsexceptions: lock, no throw-specs GC: d'tor, using statement, IDisposableGC: d'tor, using statement, IDisposable inheritance: positional, virtual/overrideinheritance: positional, virtual/override interfaces: no fields, EII, properties, indexersinterfaces: no fields, EII, properties, indexers nested types: Java access, C++ semanticsnested types: Java access, C++ semantics delegates: function pointers, single and multicastdelegates: function pointers, single and multicast events: restricted multicast delegateevents: restricted multicast delegate assemblies: logical DLL, no registry, versioningassemblies: logical DLL, no registry, versioning namespaces: shorthand syntaxnamespaces: shorthand syntax reflection: metadata, introspection, intercessionreflection: metadata, introspection, intercession attributes: add to metadata, reflectattributes: add to metadata, reflect

Page 138: Csharp In Detail Part2

© { JSL }138138S

tan

dar

ds

Sta

nd

ard

s ECMA/TC39/2000-2ECMA/TC39/2000-2

Standard 1, C#Standard 1, C# Standard 2, Common Language InfrastructureStandard 2, Common Language Infrastructure

TimelineTimeline March 2001 – draft submissionMarch 2001 – draft submission Sept 2001 – final submissionSept 2001 – final submission Dec 2001 – Version 1 adopted by GADec 2001 – Version 1 adopted by GA Jan 2002 – submit to ISO for fast track processJan 2002 – submit to ISO for fast track process

Page 139: Csharp In Detail Part2

© { JSL }139139B

iblio

gra

ph

yB

iblio

gra

ph

y Presenting C#Presenting C#

Christophe Wille; SAMSChristophe Wille; SAMS

A Programmer's Introduction to C#A Programmer's Introduction to C# Eric Gunnerson; ApressEric Gunnerson; Apress

Programming C# with the public BetaProgramming C# with the public Beta Harvey, Robinson,Templeman, Watson; WroxHarvey, Robinson,Templeman, Watson; Wrox

C# EssentialsC# Essentials Albahari, Drayton, Merrill; O'ReillyAlbahari, Drayton, Merrill; O'Reilly

Inside C#Inside C# Tom Archer; MS PressTom Archer; MS Press