Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C#勉強会 ~ C#9の新機能 ~

2021/03/22
「C#勉強会 ~ C#9の新機能 ~」

サンプル コード: https://github.com/Fujiwo/20210322CSharp

Related Books

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

C#勉強会 ~ C#9の新機能 ~

  1. 1. C#勉強会 ~ C#9の新機能 ~ 2021/03/22 小島 富治雄
  2. 2. 前提条件とゴール 2
  3. 3. 『C#の新機能勉強会 ~C#7、8の新機能を活用して速く安全なプログラムを書こう~』 前回は C#7、8 3
  4. 4. 【参考】 C# 7~8の新機能の例 4 タプル 値型 (struct) パターン マッチング 参照型 (class) その他
  5. 5. アジェンダ
  6. 6. 1. C# の歴史と C# 9.0 6
  7. 7. C# の歴史 C# Ver. 主な新機能 登場時期 .NET Visual Studio 1.0, 1.1, 1.2 オブジェクト指向 2002年 .NET Framework 1.0,1.1 .NET, .NET 2003 2.0 ジェネリック 2005年 .NET Framework 2.0 2005 3.0 関数型 2007年 .NET Framework 2.0, 3.0, 3.5 2008, 2010 4.0 動的 2010年 .NET Framework 4 2010 5.0 非同期 2012年 .NET Framework 4.5 2012, 2013 6.0 Roslyn (コンパイラーをC#で実装しオープンソース化) 2015年 .NET Framework 4.6 .NET Core 1.0 2015 7.0, 7.1, 7.2, 7.3 パターン マッチング、値型に関する改良 2017年 .NET Framework 4.6.2, 4.7, 4.7.1, 4.7.2 .NET Core 2.0, 2.1, 2.2 2017 8.0 値型、参照型に関する改良 2019年 .NET Core 3.0 2019 Ver.16.3 9.0 パターン マッチングの改良、record 型、 ソースコード ジェネレーター 2020年 .NET 5.0 2019 Ver.16.8
  8. 8. C# 7~9 8 C# Ver. Visual Studio 7.0 Visual Studio 2017 7.1 Visual Studio 2017 バージョン 15.3 7.2 Visual Studio 2017 バージョン 15.5 7.3 Visual Studio 2017 バージョン 15.7 8.0 Visual Studio 2019 16.3 9.0 Visual Studio 2019 16.8
  9. 9. .NET と C# の既定のバージョン 9 ターゲット フレーム バージョン C#の既定のバージョン .NET 5.x C# 9.0 .NET Core 3.x C# 8.0 .NET Core 2.x C# 7.3 .NET Standard 2.1 C# 8.0 .NET Standard 2.0 C# 7.3 .NET Standard 1.x C# 7.3 .NET Framework all C# 7.3
  10. 10. プロジェクト ファイルでの C#のバージョン指定 10 <Project ……> <PropertyGroup> <OutputType>……</OutputType> <TargetFramework>……</TargetFramework> <!--……中略……--> <LangVersion>latest</LangVersion> <Nullable>enable</Nullable> </PropertyGroup> <!--……中略……--> </Project> LangVersion 説明 preview 最新プレビュー バージョン latest 最新リリース バージョン (マイナー バージョンを含む) latestMajor 最新リリースの メジャー バージョン 9.0 C# 9.0
  11. 11. C# 9.0 11
  12. 12. https://dotnet.microsoft.com/download/dotnet/5.0 https://dotnet.microsoft.com/download/dotnet/thank-you/sdk-5.0.200-windows-x64-installer 開発環境 12
  13. 13. 2. C# 9.0 の新機能 13
  14. 14. C# 9.0 の新機能 14 ※ 目玉
  15. 15. サンプル コード C# 9.0 の新機能 15
  16. 16. 【準備】 Visual Studio でプロジェクトを新規作成 16
  17. 17. 17 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <Nullable>enable</Nullable> </PropertyGroup> </Project> 【準備】 Visual Studio でプロジェクトを新規作成
  18. 18. トップ レベル ステートメント 18 using System.Linq; using static System.Console; Enumerable.Range(1, 100) .Select(i => (i % 3, i % 5) switch { (0, 0) => "FizzBuzz" , (0, _) => "Fizz" , (_, 0) => "Buzz" , _ => i.ToString() }) .ToList() .ForEach(WriteLine); トップレベルステートメントサンプル.cs | GitHub
  19. 19. record 19 public record RStaff(int Id, string Name); public record RStaff2 { public int Id { get; init; } public string Name { get; init; } = ""; } public record RStaff3 { public int Id { get; private set; } public string Name { get; private set; } = ""; public RStaff3(int id, string name) => (Id, Name) = (id, name); } recordサンプル.cs | GitHub
  20. 20. record 20
  21. 21. init-only プロパティ 21 class Point3 { public double X { get; init; } = 0.0; public double Y { get; init; } = 0.0; public Point3() {} public Point3(double x, double y) => (X, Y) = (x, y); } initプロパティサンプル.cs | GitHub
  22. 22. ラムダ式の改良 22 button.Click += static (_, _) => ShowOK(); ラムダ式サンプル.cs | GitHub
  23. 23. パターンマッチングの追加 23 static bool IsLeapYear(int year) => (year % 400, year % 100, year % 4) is (0, _, _) or (_, not 0, 0); パターンマッチングサンプル.cs | GitHub
  24. 24. new式で型を省略 24 // フィールド List<Staff> staffs = new(); // プロパティ public Staff Staff { get; set; } = new(); new式で型を省略サンプル.cs | GitHub
  25. 25. 拡張メソッド GetEnumerator 25 static class StaffListExtensions { public static IEnumerator<Staff> GetEnumerator(this StaffList @this) { for (var index = 0; index < @this.Count; index++) yield return @this[index]; } } 拡張メソッドGetEnumeratorサンプル.cs | GitHub
  26. 26. ネイティブサイズ整数 26 nint n1 = -1; nuint n2 = 1U; ネイティブサイズ整数サンプル.cs | GitHub
  27. 27. 共変の戻り値の型の改良 27 class Base { public virtual IEnumerable<int> GetCollection() { return null; } } interface IBase { IEnumerable<int> GetCollection() { return null; } } class Derived : Base, IBase { // 共変の戻り値の型が使用可 public override List<int> GetCollection() { return new List<int>(); } // C#9 } 共変の戻り値の型サンプル.cs | GitHub
  28. 28. 3. ソースコード ジェネレーターを体験してみよう 28
  29. 29. ソースコード ジェネレーター 29
  30. 30. パーシャル メソッドの改良 30 // 手書きのクラス partial class PartialClass { private partial string GetMessage(); // not implemented here. public void ShowMessage() => Console.WriteLine(GetMessage()); } // ソースコード ジェネレーターで作成されるクラス partial class PartialClass { private partial string GetMessage() => "Hello source generator!"; } Partialメソッドサンプル.cs | GitHub
  31. 31. ソースコード ジェネレーターの作成 31
  32. 32. Visual Studio でプロジェクトを新規作成 32
  33. 33. Visual Studio でプロジェクトを新規作成 33
  34. 34. プロジェクトにパッケージを追加 34
  35. 35. プロジェクトにパッケージを追加 35
  36. 36. プロジェクトにパッケージを追加 36
  37. 37. HelloSourceGenerator.csproj プロジェクト ファイルを変更 37 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <LangVersion>latest</LangVersion> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" PrivateAssets="all" /> <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2" PrivateAssets="all" /> </ItemGroup> </Project>
  38. 38. クラス名変更 38
  39. 39. HelloSourceGenerator.cs | GitHub ソースコード ジェネレーターの作成 39 using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; using System.Text; namespace HelloSourceGenerator { [Generator] public class HelloSourceGenerator : ISourceGenerator { public void Execute(GeneratorExecutionContext context) { context.AddSource("generated.cs", SourceText.From(text: @" namespace HelloSourceGeneratorSample { public class Sample { public const int Id = 1; } partial class PartialClass { private partial string GetMessage() => ""Hello source generator!""; } }", encoding: Encoding.UTF8)); } public void Initialize(GeneratorInitializationContext context) { } } }
  40. 40. ソースコード ジェネレーターを利用する側 40
  41. 41. ソースコード ジェネレーターを利用する側 41
  42. 42. ソースコード ジェネレーターを利用する側 42
  43. 43. ソースコード ジェネレーターを利用する側 43
  44. 44. HelloSourceGeneratorSample.csproj プロジェクト ファイルを変更 44 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> </PropertyGroup> <ItemGroup> <Analyzer Include="$(SolutionDir)/HelloSourceGenerator/bin/Debug/netstandard2.0/HelloSourceGenerator.dll" /> </ItemGroup> </Project>
  45. 45. Program.cs を書き換え 45 using System; namespace HelloSourceGeneratorSample { class Program { static void Main(string[] args) { var id = Sample.Id; // not implemented here. Console.WriteLine(id); PartialClass partialClass = new(); partialClass.ShowMessage(); } } partial class PartialClass { private partial string GetMessage(); // not implemented here. public void ShowMessage() => Console.WriteLine(GetMessage()); } }
  46. 46. 実行結果 46 1 Hello source generator!!
  47. 47. リビルド SourceTreeSourceGenerator.cs | GitHub roslyn-sdk/samples/CSharp/SourceGenerators | GitHub.com) ソースコード ジェネレーターへの追加 47
  48. 48. HelloSourceGeneratorSample の Main() を書き換え 48 using System; namespace HelloSourceGeneratorSample { class Program { static void Main(string[] args) { SourceTreeGenerated.SourceTree.Show(); } } partial class PartialClass { private partial string GetMessage(); // not implemented here. public void ShowMessage() => Console.WriteLine(GetMessage()); } }
  49. 49. 実行結果 49 This is generated code! The following syntax trees existed in the compilation that created this program: - Program.cs - .NETCoreApp,Version=v5.0.AssemblyAttributes.cs - HelloSourceGeneratorSample.AssemblyInfo.cs
  50. 50. リビルド AutoNotifyGenerator. cs | GitHub roslyn-sdk/samples/CSharp/SourceGenerators | GitHub.com) ソースコード ジェネレーターへの追加 50
  51. 51. HelloSourceGeneratorSample の Main() を書き換え 51 using System; using AutoNotify; namespace HelloSourceGeneratorSample { class Program { static void Main(string[] args) { Point point = new(); point.PropertyChanged += (point, _) => { var p = point as Point; Console.WriteLine($"The point has changed: {p?.X}"); }; point.X = 100; point.X = 200; } } partial class PartialClass { private partial string GetMessage(); // not implemented here. public void ShowMessage() => Console.WriteLine(GetMessage()); } partial class Point { [AutoNotify] private int _x; } }
  52. 52. 実行結果 52 The point has changed: 100 The point has changed: 200
  53. 53. 本日の内容
  54. 54. C# 9.0 の新機能 - C# ガイド | Microsoft Docs C# 9.0 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C (ufcpp.net) C# 9.0 on the record | .NET Blog #145 Mads Torgersen, C# 9, Part 1 | no dogma podcast (bryanhogan.net) #146 Mads Torgersen, C# 9, Part 2 – Listener Questions | no dogma podcast (bryanhogan.net) The Future of C# | YouTube 参考文献 54

×