Download - C# 3.0 以降
C#3.0 以降
2014/04小島 富治雄
1
本日のゴール
• C# 3.0 以降について知っていただき、実務に活かしていただく
• 前提知識 : C# 1.0 ~ 2.0 辺り
2
Agenda
1. はじめに
2. C# のこれから
3. C#1.0-2.0 で押さえておくこと
4. C#3.0 以降の新機能
5. Linq3
1. はじめに
4
C#1.0 ~ 3.0 について
•好きなところ
•関心のあるところ
•聞きたいところ
5
2. C# のこれから
6
.NET の進化
7
.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
C# の進化
9
C# の進化
10
C# 1.0 C# 2.0C# 3.0C# 4.0C# 5.0C# 6.0
オブジェクト指向
ジェネリック
関数型
dynamic
非同期
メタ プログラミング
C#2.0• Generics
• 匿名メソッド
• イテレータ (yield)
• Partial Type
• Nullable 型
• アクセサのアクセスレベル
• static クラス
11
• namespace alias qualifier
• extern alias
• #pragma
• Conditional 属性
• 固定長配列
• デリゲートの Covariance/Contravariance
C#3.0• 暗黙的型付け
• パーシャルメソッド
• 自動プロパティ
• オブジェクト イニシャライザ
• コレクション イニシャライザ
12
• 暗黙型付け配列
• 匿名型 (Anonymous Types)
• 拡張メソッド
• ラムダ式 (Lambda Expression)
• LINQ
C#4.0
• dynamic
• オプション引数
• 名前付き引数
13
C#5.0 以降
• Caller Info 属性
• 非同期
• Roslyn
14
重要な視点
どんな問題を解こうとしてる ?
Roslyn
• C# や Visual Basic のコンパイラーを再実装
• 内部の コード分析などの API 等を公開
• オープンソース– BUILD 2014
– The Future of C# | Build 2014 | Channel 9
– .NET Compiler Platform ("Roslyn") - CodePlex
16
Roslyn
• Roslyn による構文解析
–Visual Studio アドインの作成
• Roslyn によるメタプログラミング
Demo17
3. C#1.0-2.0 で押さえておくこと
18
C#1.0 までで押さえておくところ
• .NET らしい Cool な書き方
–delegate と event
–データバインド– 属性 ( アノテーション )
19
C#2.0 復習
C#3.0 への布石
• Generics
• 匿名メソッド
• イテレータ (yield)
• static クラス20
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; }}
匿名メソッド• インラインにメソッドを記述
• ブロック スコープをデリゲートに( =クロージャ )
22
static void Sample3(string captionText){ userInput.KeyInput += delegate(string inputText) { string text = “ ユーザー入力 : "; MessageBox.Show(text + inputText, captionText); };}
イテレータ (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; }}
C#3.0 未満で終わったもの
• 非ジェネリック コレクション
–ArrayList
–一部に「負の遺産」が
• 匿名メソッド
–ラムダ式で置き換え
24
4. C#3.0 以降 の新機能
25
C#3.0• 暗黙的型付け
• パーシャルメソッド
• 自動プロパティ
• オブジェクト イニシャライザ
• コレクション イニシャライザ
26
• 暗黙型付け配列
• 匿名型 (Anonymous Types)
• 拡張メソッド
• ラムダ式 (Lambda Expression)
• LINQ
C# 1.0 → 2.0 → 3.0
• どのように変化したか
–Demo
27
・多くがシンタックス シュガー
・当たり前だが、使わなくてもプログラムは書ける
C#3.0 の新機能について
28
C#3.0
•より簡潔に意図が記述できるようになった•Linq がメイン–ほとんどの新機能は Linq に通じる
29
暗黙的型付け (var)
• 型がなくなるわけじゃない
• object で受けるのとは違う
–インテリセンスが利く
30
var point = new { X=100, Y=200 };
パーシャルメソッド• メソッドの宣言と定義を分離
• 実装があれば実行、なければ何もしない
31
partial class PertialMethodSample{ static partial void DoSomething();
static void Main(string[] args) { DoSomething(); }}
partial class PertialMethodSample{ static partial void DoSomething() { Console.WriteLine("DoSomething"); }}
自動プロパティ
32
// 1.0 ~ 2.0string name;
public string Name{ get { return name; } set { name = value; }}
// 3.0public string Name { get; set; }
オブジェクト イニシャライザ• インスタンス化とプロパティ設定を一行で
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 };
コレクション イニシャライザ• 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 },};
暗黙型付け配列• new で配列を作成するときに型を省略
35
var array = new[] {1, 2, 3, 4};
匿名型 (Anonymous Types)
•無名クラス
36
var book = new { タイトル = “C#3.0 入門” , 価格 = 2980};Console.WriteLine(book);
拡張メソッド• 既存クラスにインスタンスメソッドを追加
37
public static void 回 (this int 回数 , Action やる ){ for (int カウント = 0; カウント < 回数 ; カウント++) やる ();}
// 使い方10. 回 ( 海に向かって叫ぶ );
ラムダ式 (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();
C#4.0
• dynamic
• オプション引数
• 名前付き引数
39
dynamic
• リフレクションとの違い
Demo
40
COM の利用
• COM の利用が楽に
• COM のラッパークラスが C# 4.0 の「 dynamic 」や「オプション引数」、「名前付き引数」楽に使えるように
Demo41
C#5.0 以降
• Caller Info 属性
• 非同期
• Roslyn
Demo
42
5. Linq
43
Linq 概要
• Linq
Language-INtegrated Query( 言語に統合されたクエリ )
44
Linq とは
• データの集合から簡単な記述で『必要なオブジェクト』の『必要なメンバ』のみを『必要とする順序』で取り出せるようにしたシンタックスシュガー– 開発者は抽出条件、抽出するメンバ、抽出順序にのみ関
心を払う– 取り出すデータの型不要
– 繰り返し文不要
var query = from データ変数 in データの集合 where 抽出条件 orderby 抽出順序のキー項目 select 抽出するメンバ で構成される新しいクラ
ス ;
45
Linq の種類
.NET LINQ
LINQ to Objects
LINQ to Datasets
LINQ to SQL
LINQ to Entities
LINQ to XML
C# VB その他の言語
ObjectData Base
XML
46
データベース関連の 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
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));
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));
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));}
LINQ to SQL の特長
• 生成される SQL 文はパラメータクエリ
• 追加/更新/削除時には自動的にトランザクションになる
–DataContext.SubmitChanges()
–Linq ではなく DataContext クラスの機能
51
Linq to SQL
Demo
52
匿名メソッドとラムダ式の違い
• 型推論の有無
• デリゲートと式木
– IEnumerable<T> と IQueryable<T>
– Enumerable と Queryable
– 2種類のラムダ式
Demo
53
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
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));
Linq to XML
Demo
56
ASP.NET での LINQ
• LinqDataSource コントロール–LINQ to SQL だけでなく各種オブジェクトが利用可能
57
Linq とは何か
IEnumerable<T> ベースのすべての情報ソースにクエリを適用する技術
58
Linq とは何ではないか
「 SQL が C# や VB で書けるようになった」のではない
59
C#3.0 と Linq の関係
C#3.0 の言語拡張の多くはLinq のため
60
Linq の特長
• Expression Tree
–IQueryable<T>
–ラムダ式は式
•デリゲートは式ではない
61
クエリ式• From 句からはじまる
• from 、 let 、 where 、 join 、 orderby を内部に記述
• Select 句または group 句で終わる
• add/update/delete は仕様として存在しない
–データを抽出することが目的
62
クエリ式
• where (抽出条件 )– where book. タイトル .Contains(“.NET”)
– where book. 価格 < 2000
• orderby (抽出順序 )– orderby book. タイトル
– orderby book. 価格 descending
– orderby book. タイトル , book. 価格63
LINQ によるデータ加工
64
IEnumerable な何か
Where(条件 )
Select( 変換 )
IEnumerable な何か
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
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
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
LINQによる異種データの結合
• Object 、 XML 、 SQL を JOIN可能
–IEnumerable ベースで結合
•データベース連携の部分では全データを取り出してから必要なものを抽出
–LINQ to SQL を IEnumerableベースで処理
68
Linq と ADO.NET の関係
• ADO.NET の進化–ADO.NET 1.0
–ADO.NET 2.0
–ADO.NET 3.0
–ADO.NET 3.569
ADO.NET
• 1.0
–Transaction Script
• SqlConnecion + SqlCommand
–Table Module
• SqlDataAdapter でDataSet や DataTable
70
ADO.NET
• 2.0
–Table Module
• SqlDataSource
•ObjectDataSource で型付き DataSet と専用
TableAdapter
71
ADO.NET• 3.0
–Domain Model
• Linq to SQL で O-R マッピング
データベース
オブジェクト
72
ADO.NET
• 3.5
–Domain Model
• Linq to Entities で O-R マッピング物理データモデル
論理データモデル
概念データモデル
概念データクエリ73
ADO.NET
• Entity Framework 4.0 ( ~ 6.1)
–コード ファースト
• POCO (plain-old CLR object) サポート
本日お話したこと
1. はじめに
2. C# のこれから
3. C#1.0-2.0 で押さえておくこと
4. C#3.0 以降の新機能
5. Linq75
参考情報
–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