c# 3.0 以降

76
C#3.0 以以 2014/04 小小 小小小 1

Upload: fujio-kojima

Post on 15-Jan-2015

3.259 views

Category:

Technology


4 download

DESCRIPTION

C# 3.0 以降の勉強会の資料。 2014年4月版。

TRANSCRIPT

Page 1: C# 3.0 以降

C#3.0 以降

2014/04小島 富治雄

1

Page 2: C# 3.0 以降

本日のゴール

• C# 3.0 以降について知っていただき、実務に活かしていただく

• 前提知識 : C# 1.0 ~ 2.0 辺り

2

Page 3: C# 3.0 以降

Agenda

1. はじめに

2. C# のこれから

3. C#1.0-2.0 で押さえておくこと

4. C#3.0 以降の新機能

5. Linq3

Page 4: C# 3.0 以降

1. はじめに

4

Page 5: C# 3.0 以降

C#1.0 ~ 3.0 について

•好きなところ

•関心のあるところ

•聞きたいところ

5

Page 6: C# 3.0 以降

2. C# のこれから

6

Page 7: C# 3.0 以降

.NET の進化

7

Page 8: C# 3.0 以降

.NET Framework の進化.NET

Framework 1.0 1.1 2.0 3.0 3.5 4.0 4.5

ランタイム (CLR) 1.0 1.1 2.0 4.0

トピック

ADO.NETASP.NETWinForm

ASP.NET 1.1 ADO.NET 2.0ASP.NET 2.0C# 2.0VB 8.0

WPFWFWCFCardSpace

ASP.NET AJAXLINQC# 3.0VB 9.0

F#動的言語ランタイム (DLR)並列プログラミング

ストア アプリ非同期プログラミング

Visual Studio

2002 2003 2005 2008 2010 2012

C# 1.0 1.2 2.0 3.0 4.0 5.0

Page 9: C# 3.0 以降

C# の進化

9

Page 10: C# 3.0 以降

C# の進化

10

C# 1.0 C# 2.0C# 3.0C# 4.0C# 5.0C# 6.0

オブジェクト指向

ジェネリック

関数型

dynamic

非同期

メタ プログラミング

Page 11: C# 3.0 以降

C#2.0• Generics

• 匿名メソッド

• イテレータ (yield)

• Partial Type

• Nullable 型

• アクセサのアクセスレベル

• static クラス

11

• namespace alias qualifier

• extern alias

• #pragma

• Conditional 属性

• 固定長配列

• デリゲートの Covariance/Contravariance

Page 12: C# 3.0 以降

C#3.0• 暗黙的型付け

• パーシャルメソッド

• 自動プロパティ

• オブジェクト イニシャライザ

• コレクション イニシャライザ

12

• 暗黙型付け配列

• 匿名型 (Anonymous Types)

• 拡張メソッド

• ラムダ式 (Lambda Expression)

• LINQ

Page 13: C# 3.0 以降

C#4.0

• dynamic

• オプション引数

• 名前付き引数

13

Page 14: C# 3.0 以降

C#5.0 以降

• Caller Info 属性

• 非同期

• Roslyn

14

Page 15: C# 3.0 以降

重要な視点

どんな問題を解こうとしてる ?

Page 16: C# 3.0 以降

Roslyn

• C# や Visual Basic のコンパイラーを再実装

• 内部の コード分析などの API 等を公開

• オープンソース– BUILD 2014

– The Future of C# | Build 2014 | Channel 9

– .NET Compiler Platform ("Roslyn") - CodePlex

16

Page 17: C# 3.0 以降

Roslyn

• Roslyn による構文解析

–Visual Studio アドインの作成

• Roslyn によるメタプログラミング

Demo17

Page 18: C# 3.0 以降

3. C#1.0-2.0 で押さえておくこと

18

Page 19: C# 3.0 以降

C#1.0 までで押さえておくところ

• .NET らしい Cool な書き方

–delegate と event

–データバインド– 属性 ( アノテーション )

19

Page 20: C# 3.0 以降

C#2.0 復習

C#3.0 への布石

• Generics

• 匿名メソッド

• イテレータ (yield)

• static クラス20

Page 21: C# 3.0 以降

Generics• C++ で言うところの template に似ている

• “ 型をパラメータに持つ型”を作る

21

class Stack<T>{ List<T> items = new List<T>();

public void Push(T item) { items.Insert(0, item); }

public T Pop() { T item = items[0]; items.RemoveAt(0); return item; }}

Page 22: C# 3.0 以降

匿名メソッド• インラインにメソッドを記述

• ブロック スコープをデリゲートに( =クロージャ )

22

static void Sample3(string captionText){ userInput.KeyInput += delegate(string inputText) { string text = “ ユーザー入力 : "; MessageBox.Show(text + inputText, captionText); };}

Page 23: C# 3.0 以降

イテレータ (yield)• Enumerable や IEnumerator インタフェー

ス (foreach などに必要 ) を簡単に作成

23

class 自然数{ readonly int max = 1;

public 自然数 (int max) { this.max = max; }

public IEnumerator<int> GetEnumerator() { for (int number = 1; number <= max; number++) yield return number; }}

Page 24: C# 3.0 以降

C#3.0 未満で終わったもの

• 非ジェネリック コレクション

–ArrayList

–一部に「負の遺産」が

• 匿名メソッド

–ラムダ式で置き換え

24

Page 25: C# 3.0 以降

4. C#3.0 以降 の新機能

25

Page 26: C# 3.0 以降

C#3.0• 暗黙的型付け

• パーシャルメソッド

• 自動プロパティ

• オブジェクト イニシャライザ

• コレクション イニシャライザ

26

• 暗黙型付け配列

• 匿名型 (Anonymous Types)

• 拡張メソッド

• ラムダ式 (Lambda Expression)

• LINQ

Page 27: C# 3.0 以降

C# 1.0 → 2.0 → 3.0

• どのように変化したか

–Demo

27

Page 28: C# 3.0 以降

・多くがシンタックス シュガー

・当たり前だが、使わなくてもプログラムは書ける

C#3.0 の新機能について

28

Page 29: C# 3.0 以降

C#3.0

•より簡潔に意図が記述できるようになった•Linq がメイン–ほとんどの新機能は Linq に通じる

29

Page 30: C# 3.0 以降

暗黙的型付け (var)

• 型がなくなるわけじゃない

• object で受けるのとは違う

–インテリセンスが利く

30

var point = new { X=100, Y=200 };

Page 31: C# 3.0 以降

パーシャルメソッド• メソッドの宣言と定義を分離

• 実装があれば実行、なければ何もしない

31

partial class PertialMethodSample{ static partial void DoSomething();

static void Main(string[] args) { DoSomething(); }}

partial class PertialMethodSample{ static partial void DoSomething() { Console.WriteLine("DoSomething"); }}

Page 32: C# 3.0 以降

自動プロパティ

32

// 1.0 ~ 2.0string name;

public string Name{ get { return name; } set { name = value; }}

// 3.0public string Name { get; set; }

Page 33: C# 3.0 以降

オブジェクト イニシャライザ• インスタンス化とプロパティ設定を一行で

33

// 1.0 ~ 2.0

// プロパティをひとつずつ設定Point point = new Point();point.X = 1;point.Y = 2;

// またはコンストラクタを作成してPoint point = new Point(1, 2);

// 3.0var point = new Point { X = 1, Y = 2 };

Page 34: C# 3.0 以降

コレクション イニシャライザ• ICollection<T> を配列感覚で初期

34

// 1.0 ~ 2.0List<Point> list = new List<Point>();list.Add(new Point(10, 20));list.Add(new Point( 0, 0));list.Add(new Point(30, 10));

// 3.0var list = new List<Point> { new Point { X = 10, Y = 20 }, new Point { X = 0, Y = 0 }, new Point { X = 30, Y = 10 },};

Page 35: C# 3.0 以降

暗黙型付け配列• new で配列を作成するときに型を省略

35

var array = new[] {1, 2, 3, 4};

Page 36: C# 3.0 以降

匿名型 (Anonymous Types)

•無名クラス

36

var book = new { タイトル = “C#3.0 入門” , 価格 = 2980};Console.WriteLine(book);

Page 37: C# 3.0 以降

拡張メソッド• 既存クラスにインスタンスメソッドを追加

37

public static void 回 (this int 回数 , Action やる ){ for (int カウント = 0; カウント < 回数 ; カウント++) やる ();}

// 使い方10. 回 ( 海に向かって叫ぶ );

Page 38: C# 3.0 以降

ラムダ式 (Lambda Expression)

•匿名メソッドの発展形

38

Func<int, int, int> funcA = delegate(int x, int y) { return x + y; };Func<int, int, int> funcL = (x, y) => x + y;

Action actionA = delegate { Console.WriteLine("Hello"); };Action actionL = () => Console.WriteLine("Hello");

Console.WriteLine(funcA(1, 2));Console.WriteLine(funcL(1, 2));actionA();actionL();

Page 39: C# 3.0 以降

C#4.0

• dynamic

• オプション引数

• 名前付き引数

39

Page 40: C# 3.0 以降

dynamic

• リフレクションとの違い

Demo

40

Page 41: C# 3.0 以降

COM の利用

• COM の利用が楽に

• COM のラッパークラスが C# 4.0 の「 dynamic 」や「オプション引数」、「名前付き引数」楽に使えるように

Demo41

Page 42: C# 3.0 以降

C#5.0 以降

• Caller Info 属性

• 非同期

• Roslyn

Demo

42

Page 43: C# 3.0 以降

5. Linq

43

Page 44: C# 3.0 以降

Linq 概要

• Linq

Language-INtegrated Query( 言語に統合されたクエリ )

44

Page 45: C# 3.0 以降

Linq とは

• データの集合から簡単な記述で『必要なオブジェクト』の『必要なメンバ』のみを『必要とする順序』で取り出せるようにしたシンタックスシュガー– 開発者は抽出条件、抽出するメンバ、抽出順序にのみ関

心を払う– 取り出すデータの型不要

– 繰り返し文不要

var query = from データ変数 in データの集合  where 抽出条件   orderby 抽出順序のキー項目   select 抽出するメンバ で構成される新しいクラ

ス ;

45

Page 46: C# 3.0 以降

Linq の種類

.NET LINQ

LINQ to Objects

LINQ to Datasets

LINQ to SQL

LINQ to Entities

LINQ to XML

C# VB その他の言語

ObjectData Base

XML

46

Page 47: C# 3.0 以降

データベース関連の Linq

• データベース周りの Linq

Data Base

.NET LINQ

LINQ to DataSets

LINQ to SQL

LINQ to Entities

ADO.NET Entity Client

Entity Framewor

k

Dataset

Table Adapter

Data Context

47

Page 48: C# 3.0 以降

Linq to Object

•IEnumerable<T> なオブジェクトをクエリ

48

var bookList = new[] { new { タイトル = "C# 入門 " , ISBN コード = "AAAAAAA", 価格 = 2980 }, new { タイトル = "VB 入門 " , ISBN コード = "BBBBBBB", 価格 = 3300 }, new { タイトル = ".NET Framework", ISBN コード = "CCCCCCC", 価格 = 7800 }};

var books = from aBook in bookList where aBook.ISBN コード == "BBBBBBB" select new { タイトル = aBook. タイトル ,

価格 = aBook. 価格 };

books.ToList().ForEach(item => Console.WriteLine(item));

Page 49: C# 3.0 以降

Linq to DataSet

•DataSet をクエリ

49

var ds = new DataSet();testTableAdapter.Fill(ds);var accounts = from aBook in ds.Book where aBook.ISBN コード == "BBBBBBB" select new { タイトル = aBook. タイトル , 価格 = aBook. 価格 };books.ForEach(item => Console.WriteLine(item));

Page 50: C# 3.0 以降

Linq to SQL

•SQL Server のデータベースをクエリ

50

using (var db = new DataClasses1DataContext()) { var accounts = from aBook in db.Book where aBook.ISBN コード == "BBBBBBB" select new { タイトル = aBook. タイトル , 価格 = aBook. 価格 }; books.ForEach(item =>

Console.WriteLine(item));}

Page 51: C# 3.0 以降

LINQ to SQL の特長

• 生成される SQL 文はパラメータクエリ

• 追加/更新/削除時には自動的にトランザクションになる

–DataContext.SubmitChanges()

–Linq ではなく DataContext クラスの機能

51

Page 52: C# 3.0 以降

Linq to SQL

Demo

52

Page 53: C# 3.0 以降

匿名メソッドとラムダ式の違い

• 型推論の有無

• デリゲートと式木

– IEnumerable<T> と IQueryable<T>

– Enumerable と Queryable

– 2種類のラムダ式

Demo

53

Page 54: C# 3.0 以降

Linq to Entities

• Entity Framework による概念エンティティをクエリ

var accounts = from aBook in textContext.Book where aBook.ISBN コード == "BBBBBBB" select new { タイトル = aBook. タイトル , 価格 = aBook. 価格 };books.ForEach(item => Console.WriteLine(item));

54

Page 55: C# 3.0 以降

Linq to XML

• XML の Xelement をクエリ

– RSS の読み込みなどに便利

55

var xElement = XElement.Load("../../Books.xml"); var books = from aBook in xElement.Elements() where aBook.Element("ISBN コード ").Value == "BBBBBBB" select new { タイトル = aBook.Attribute(" タイトル ").Value, 価格 = int.Parse(aBook.Element(" 価格 ").Value) }; books.ForEach(item => Console.WriteLine(item));

Page 56: C# 3.0 以降

Linq to XML

Demo

56

Page 57: C# 3.0 以降

ASP.NET での LINQ

• LinqDataSource コントロール–LINQ to SQL だけでなく各種オブジェクトが利用可能

57

Page 58: C# 3.0 以降

Linq とは何か

  IEnumerable<T> ベースのすべての情報ソースにクエリを適用する技術

58

Page 59: C# 3.0 以降

Linq とは何ではないか

「 SQL が C# や VB で書けるようになった」のではない

59

Page 60: C# 3.0 以降

C#3.0 と Linq の関係

C#3.0 の言語拡張の多くはLinq のため

60

Page 61: C# 3.0 以降

Linq の特長

• Expression Tree

–IQueryable<T>

–ラムダ式は式

•デリゲートは式ではない

61

Page 62: C# 3.0 以降

クエリ式• From 句からはじまる

• from 、 let 、 where 、 join 、 orderby を内部に記述

• Select 句または group 句で終わる

• add/update/delete は仕様として存在しない

–データを抽出することが目的

62

Page 63: C# 3.0 以降

クエリ式

• where (抽出条件 )– where book. タイトル .Contains(“.NET”)

– where book. 価格 < 2000

• orderby (抽出順序 )– orderby book. タイトル

– orderby book. 価格 descending

– orderby book. タイトル , book. 価格63

Page 64: C# 3.0 以降

LINQ によるデータ加工

64

IEnumerable な何か

Where(条件 )

Select( 変換 )

IEnumerable な何か

Page 65: C# 3.0 以降

LINQの仕組み

• クエリ式はラムダ式を引数にとる拡張メソッドが連結された形式に変換される

var query = from book in bookse

where book. タイトル .Contans(“C#”)

orderby book.タイトル select new { book. タイトル , book.価格 };

var query = books.Where(book => book. タイトル .Contans(“C#”))

.OrderBy(book => book. タイトル )

.Select(book => new {book. タイトル ,

book.価格});65

Page 66: C# 3.0 以降

LINQの仕組み

• System.LINQ.Enumerable.XXX

– LINQ to Object

• 配列や List<T> などは IEnumerable から派生

– LINQ to XML

• Xelement.Decentants() が IEnumerable を返す

– yieldによる実装 → 遅延実行

• System.LINQ.Queryable.XXX

– LINQ to SQL

• System.Data.Linq.Table<T> は IQueryable から派生

– ラムダ式の右辺を積んで式のツリー(Expression Tree)を作成

– IQuaryProviderによる実装 → 遅延実行

– 継承して独自のLINQ to XXX といった仕組みを構築可能 66

Page 67: C# 3.0 以降

LINQの仕組み

• 遅延実行– データが実際に必要となるタイミングまでクエリ条件が積み重ねられる• LINQ to SQL では最終的にデータを参照するタイミング

(DataBind 時など) にSQL文が生成される

var query1 = from book in db.書籍

orderby book.タイトル

select new { 出版社名 = book.出版社.名前, 書籍タイトル = book.タイトル };

var query2 = from book in query1

where book.出版社名.Contains("C")

select book;

query2.ToList().ForEach(book => Console.WriteLine(book));

SELECT [t1].[名前] AS [出版社名], [t0].[タイトル] AS [書籍タイトル]

FROM [dbo].[書籍] AS [t0]

LEFT OUTER JOIN [dbo].[出版社] AS [t1] ON [t1].[ID] = [t0].[出版社ID]

WHERE [t1].[名前] LIKE @p0

ORDER BY [t0].[タイトル]

67

Page 68: C# 3.0 以降

LINQによる異種データの結合

• Object 、 XML 、 SQL を JOIN可能

–IEnumerable ベースで結合

•データベース連携の部分では全データを取り出してから必要なものを抽出

–LINQ to SQL を IEnumerableベースで処理

68

Page 69: C# 3.0 以降

Linq と ADO.NET の関係

• ADO.NET の進化–ADO.NET 1.0

–ADO.NET 2.0

–ADO.NET 3.0

–ADO.NET 3.569

Page 70: C# 3.0 以降

ADO.NET

• 1.0

–Transaction Script

• SqlConnecion + SqlCommand

–Table Module

• SqlDataAdapter でDataSet や DataTable

70

Page 71: C# 3.0 以降

ADO.NET

• 2.0

–Table Module

• SqlDataSource

•ObjectDataSource で型付き DataSet と専用

TableAdapter

71

Page 72: C# 3.0 以降

ADO.NET• 3.0

–Domain Model

• Linq to SQL で O-R マッピング

データベース

オブジェクト

72

Page 73: C# 3.0 以降

ADO.NET

• 3.5

–Domain Model

• Linq to Entities で O-R マッピング物理データモデル

論理データモデル

概念データモデル

概念データクエリ73

Page 74: C# 3.0 以降

ADO.NET

• Entity Framework 4.0 ( ~ 6.1)

–コード ファースト

• POCO (plain-old CLR object) サポート

Page 75: C# 3.0 以降

本日お話したこと

1. はじめに

2. C# のこれから

3. C#1.0-2.0 で押さえておくこと

4. C#3.0 以降の新機能

5. Linq75

Page 76: C# 3.0 以降

参考情報

–C#3.0 の概要• http://

www.microsoft.com/japan/msdn/net/bb308966.aspx

– LINQ: .NET 統合言語クエリ• http://

www.microsoft.com/japan/msdn/net/bb308959.aspx

– .NET標準クエリ演算子• http://

www.microsoft.com/japan/msdn/net/bb394939.aspx76