C# 4.0 - Cairo Code Camp 2010

65
Productivity in C# 4.0 1

Transcript of C# 4.0 - Cairo Code Camp 2010

Page 1: C# 4.0 - Cairo Code Camp 2010

1

Productivity in C# 4.0

Page 2: C# 4.0 - Cairo Code Camp 2010

2

Mohammad Tayseer

Page 3: C# 4.0 - Cairo Code Camp 2010

3

Productivity

Page 4: C# 4.0 - Cairo Code Camp 2010

4

Productivity=

Value

Page 5: C# 4.0 - Cairo Code Camp 2010

5

C#

Object-Oriented Programming

Generics

Expression Trees

Nullable

Lambda Expressions

Anonymous Types

Extension Methods

LINQ

Delegates

Partial Classes

Page 6: C# 4.0 - Cairo Code Camp 2010

6

C# 4.0

Page 7: C# 4.0 - Cairo Code Camp 2010

7

1. Dynamic capabilities

2. Optional and named arguments

3. Co-variant and contra-variant

4. Better COM interoperability

Page 8: C# 4.0 - Cairo Code Camp 2010

8

Dynamic?

Page 9: C# 4.0 - Cairo Code Camp 2010

9

int x = …;x.GetType(); // Safex.SomeMethod(); // Compilation

// error

dynamic d = x;d.GetType(); // Safe

d.SomeMethod(); // Dispatched // at runtime

Page 10: C# 4.0 - Cairo Code Camp 2010

10

x.SomeMethod()

x has SomeMethod

x.TryInvokeMember(“SomeMethod”, …)

Page 11: C# 4.0 - Cairo Code Camp 2010

11

interface IDynamicMetaObjectProvider{

bool TryGetMember(…); bool TrySetMember(…); bool TryDeleteMember(…);  bool TryInvoke(…); bool TryInvokeMember(…); bool TryCreateInstance(…);  bool TryGetIndex(…); bool TrySetIndex(); bool TryDeleteIndex(…);… }

Page 12: C# 4.0 - Cairo Code Camp 2010

12

PythonBinder

COMBinder

ObjectBinder

Dynamic Language Runtime

IronPython

IronRuby C# VB.NET Others…

Page 13: C# 4.0 - Cairo Code Camp 2010

13

C# 4.0 Dynamic

?

Page 14: C# 4.0 - Cairo Code Camp 2010

14

C# 4.0

Static

Optional dynamic

Page 15: C# 4.0 - Cairo Code Camp 2010

15

When?

Page 16: C# 4.0 - Cairo Code Camp 2010

16

Productivity

Page 17: C# 4.0 - Cairo Code Camp 2010

17

int x = …;

dynamic d = x;

d.SomeMethod(); // Runtime // error

Page 18: C# 4.0 - Cairo Code Camp 2010

18

Page 19: C# 4.0 - Cairo Code Camp 2010

19

((MyCompany.MyClient.MyProject.Workflow.Activities.SqlSelect)

this.GetActivityByName(“SqlSelect1”)).RowsAffected > 1

Page 20: C# 4.0 - Cairo Code Camp 2010

20

((MyCompany.MyClient.MyProject.Workflow.Activities.SqlSelect)

this.GetActivityByName(“SqlSelect1”)).RowsAffected > 1

Page 21: C# 4.0 - Cairo Code Camp 2010

21

((MyCompany.MyClient.MyProject.Workflow.Activities.SqlSelect)

this.GetActivityByName(“SqlSelect1”)).RowsAffected > 1

Page 22: C# 4.0 - Cairo Code Camp 2010

22

This is too

complex

Page 23: C# 4.0 - Cairo Code Camp 2010

23

this.SqlSelect1.RowsAffected > 1

Runtime Lookup Recursive

Page 24: C# 4.0 - Cairo Code Camp 2010

24

((MyCompany.MyClient.MyProject.Workflow.Activities.SqlSelect)

this.GetActivityByName(“SqlSelect1”)).RowsAffected > 1

this.SqlSelect1.RowsAffected > 1

Page 25: C# 4.0 - Cairo Code Camp 2010

25

dynamic x = …;x.GetType();x.Property1 = x.Property2;x[“1”] = x[“value 2”];x(1, 2, 3)x++;

x.ExtensionMethod() // Runtime error

Page 26: C# 4.0 - Cairo Code Camp 2010

26

Dynamic Dispatch

Demo

Page 27: C# 4.0 - Cairo Code Camp 2010

27

Named & optional

parameters

Page 28: C# 4.0 - Cairo Code Camp 2010

28

chart.ChartWizard(range.CurrentRegion,MissingValue,MissingValue,MissingValue,MissingValue,MissingValue,MissingValue,"Memory Usage in " + Environment.MachineName,MissingValue,MissingValue,MissingValue);

Page 29: C# 4.0 - Cairo Code Camp 2010

29

Page 30: C# 4.0 - Cairo Code Camp 2010

30

chart.ChartWizard(range.CurrentRegion, // SourceMissingValue, // GalleryMissingValue, // FormatMissingValue, // PlotByMissingValue, // CategoryLabelsMissingValue, // SeriesLabelsMissingValue, // HasLegend// Title"Memory Usage in " + Environment.MachineName,MissingValue, // CategoryTitleMissingValue, // ValueTitleMissingValue); // ExtraTitle

Page 31: C# 4.0 - Cairo Code Camp 2010

31

Strongly-typednamed

parameters

Page 32: C# 4.0 - Cairo Code Camp 2010

32

chart.ChartWizard(Source: range.CurrentRegion,Gallery: MissingValue,Format: MissingValue,PlotBy: MissingValue,CategoryLabels: MissingValue,SeriesLabels: MissingValue,HasLegend: MissingValue,Title: "Memory Usage in " + Environment.MachineName,CategoryTitle: MissingValue,ValueTitle: MissingValue,ExtraTitle: MissingValue);

Page 33: C# 4.0 - Cairo Code Camp 2010

33

chart.ChartWizard(Source: range.CurrentRegion,Gallery: MissingValue,Format: MissingValue,PlotBy: MissingValue,CategoryLabels: MissingValue,SeriesLabels: MissingValue,HasLegend: MissingValue,Title: "Memory Usage in " + Environment.MachineName,CategoryTitle: MissingValue,ValueTitle: MissingValue,ExtraTitle: MissingValue);

Page 34: C# 4.0 - Cairo Code Camp 2010

34

Page 35: C# 4.0 - Cairo Code Camp 2010

35

Optional parameters

Page 36: C# 4.0 - Cairo Code Camp 2010

36

chart.ChartWizard(Source: range.CurrentRegion,Gallery: MissingValue,Format: MissingValue,PlotBy: MissingValue,CategoryLabels: MissingValue,SeriesLabels: MissingValue,HasLegend: MissingValue,Title: "Memory Usage in " + Environment.MachineName,CategoryTitle: MissingValue,ValueTitle: MissingValue,ExtraTitle: MissingValue);

Page 37: C# 4.0 - Cairo Code Camp 2010

37

chart.ChartWizard(Source: range.CurrentRegion,Title: "Memory Usage in " + Environment.MachineName);

Page 38: C# 4.0 - Cairo Code Camp 2010

38

public void ChartWizard(Source = null,Gallery = null,Format = null,PlotBy = null,CategoryLabels = null,SeriesLabels = null,HasLegend = null,Title = “”,CategoryTitle = null,ValueTitle = null,ExtraTitle = null)

Page 39: C# 4.0 - Cairo Code Camp 2010

39

Co-variance & Contra-variance

Page 40: C# 4.0 - Cairo Code Camp 2010

40

Back to Basics

Page 41: C# 4.0 - Cairo Code Camp 2010

41

Lion is-a Animal

Camel is-a Animal

Page 42: C# 4.0 - Cairo Code Camp 2010

42

public static string CleanAnimal(Animal a)

{…}

CleanAnimal(camel);CleanAnimal(lion);

Page 43: C# 4.0 - Cairo Code Camp 2010

43

Thus

Stack<Lion>is-a

Stack<Animal>

Page 44: C# 4.0 - Cairo Code Camp 2010

44

No

Page 45: C# 4.0 - Cairo Code Camp 2010

45

public static string CleanAll(Stack<Animal> animals)

{ … }

Stack<Lion> lions = { … };

CleanAll(lions);

Page 46: C# 4.0 - Cairo Code Camp 2010

46

public static string CleanAll(Stack<Animal> animals)

{animals.Push(new Camel());

…}

Page 47: C# 4.0 - Cairo Code Camp 2010

47

Stack<Lion> is-not

Stack<Animal>

Page 48: C# 4.0 - Cairo Code Camp 2010

48

IEnumerable<Lion> should-be

IEnumerable<Animal>

Page 49: C# 4.0 - Cairo Code Camp 2010

49

IEnumerable<Lion>,IEnumerator<Lion>

are read-only

Page 50: C# 4.0 - Cairo Code Camp 2010

50

Only in C# 4

Page 51: C# 4.0 - Cairo Code Camp 2010

51

interface IEnumerator<out T>// T only in output position{T Current { get; }}

Page 52: C# 4.0 - Cairo Code Camp 2010

52

interface IEnumerable<out T>{IEnumerator<T> GetEnumerator();}

Page 53: C# 4.0 - Cairo Code Camp 2010

53

Co-variance

Page 54: C# 4.0 - Cairo Code Camp 2010

54

Now Contra-variance

Page 55: C# 4.0 - Cairo Code Camp 2010

55

interface IPushable<in T>{void Push(T element);}

Page 56: C# 4.0 - Cairo Code Camp 2010

56

IPushable<Animal>is-a

IPushable<Lion>

Page 57: C# 4.0 - Cairo Code Camp 2010

57

IPushable<Lion> lions = animals;lions.Push(new Lion());

IPushable<Camel> camels = animals;

camels.Push(new Camel());

Page 58: C# 4.0 - Cairo Code Camp 2010

58

Limitations

Page 59: C# 4.0 - Cairo Code Camp 2010

59

1.Interfaces

2.Delegates

3.Reference types

Page 60: C# 4.0 - Cairo Code Camp 2010

60

Co-variance & Contra-variance

Demo

Page 61: C# 4.0 - Cairo Code Camp 2010

61

BetterCOM

Interoperability

Page 62: C# 4.0 - Cairo Code Camp 2010

62

1. Dynamic

2. Optional & named params

3. No PIA

4. Omitting ref

Page 63: C# 4.0 - Cairo Code Camp 2010

63

Demos

Page 64: C# 4.0 - Cairo Code Camp 2010

64

?

Page 65: C# 4.0 - Cairo Code Camp 2010

65

twitter.com/m_tayseer

http://spellcoder.com/blogs/tayseer

[email protected]