C# 3.0 以降

5,173 views

Published on

C# 3.0 以降の勉強会の資料。

Published in: Technology
  • Be the first to comment

C# 3.0 以降

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

×