Movatterモバイル変換


[0]ホーム

URL:


Fujio Kojima, profile picture
Uploaded byFujio Kojima
847 views

C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~

2020/02/14「C#の新機能勉強会~ C#7、8の新機能を活用して速く安全なプログラムを書こう~」サンプル コード: https://github.com/Fujiwo/CSharp7_8NewFeatures最新版: https://github.com/Fujiwo/CSharp7_8NewFeatures/blob/master/20200214_CSharp78.pdf

Embed presentation

Download to read offline
C#の新機能勉強会~ C#7、8の新機能を活用して速く安全なプログラムを書こう ~2020/02/14小島 富治雄
前提条件とゴール2
開発環境3
Visual Studio でプロジェクトを新規作成4<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp3.1</TargetFramework><Nullable>enable</Nullable></PropertyGroup></Project>
https://github.com/Fujiwo/CSharp7_8NewFeaturesサンプル ソースコードや資料5
サンプル ソースコードや資料6https://github.com/Fujiwo/CSharp7_8NewFeatures
アジェンダ
1. C#/.NETの今と近未来8
C# の歴史C# Ver. 主な新機能 登場時期 .NET Visual Studio1.0, 1.1, 1.2 オブジェクト指向 2002年 .NET Framework1.0,1.1.NET, .NET20032.0 ジェネリック 2005年 .NET Framework 2.0 20053.0 関数型 2007年 .NET Framework 2.0,3.0, 3.52008, 20104.0 動的 2010年 .NET Framework 4 20105.0 非同期 2012年 .NET Framework 4.5 2012, 20136.0 Roslyn (コンパイラーをC#で実装しオープンソース化) 2015年 .NET Framework 4.6.NET Core 1.020157.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.220178.0 値型、参照型に関する改良 2019年 .NET Core 3.0 2019 Ver.16.3
C# 7~810C# Ver. Visual Studio7.0 Visual Studio 20177.1 Visual Studio 2017 バージョン 15.37.2 Visual Studio 2017 バージョン 15.57.3 Visual Studio 2017 バージョン 15.78.0 Visual Studio 2019 16.3
C# 7~811ターゲット フレーム バージョンC# 言語の既定のバージョン.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
プロジェクト ファイルでの C#のバージョン指定12<Project ……><PropertyGroup><OutputType>……</OutputType><TargetFramework>……</TargetFramework><!--……中略……--><LangVersion>8.0</LangVersion><Nullable>enable</Nullable></PropertyGroup><!--……中略……--></Project>LangVersion 説明preview 最新プレビュー バージョンlatest 最新リリース バージョン(マイナー バージョンを含む)latestMajor 最新リリースのメジャー バージョン8.0 C# 8.0
C# 8.013
参考: .NET Framework と .NET Core14
参考: 今の .NET (2019年9月以降)15.NET Core が WPF と Windows Forms をサポート (Windows 版のみ).NET Framework 4.8.X• WPF• Windows Forms• ASP.NET.NET Core 3.X• WPF (Windows)• Windows Forms(Windows)• ASP.NETXamarin• iOS• Android• Windows• MacOS.NET Standard Library
参考: 近未来の .NET (2020年11月予定)16.NET Core が WPF と Windows Forms をサポート (Windows 版のみ).NET Framework 4.8.X• WPF• Windows Forms• ASP.NET.NET 5.0• WPF (Windows)• Windows Forms(Windows)• UWP (Windows)• ASP.NETXamarin• iOS• Android• Windows• MacOS.NET Standard Library保守フェーズに
C# 7~8の新機能の例17タプル値型 (struct)パターン マッチング参照型 (class)その他
C# 7~8の新機能18
2. C# の値型と参照型19
C#に潜むstructの罠 – KAYAC engineers‘ blogC#に潜むstructの罠?20お急ぎの方のために結論を申しあげますと、そんなわけありません。なんで C# に値型があるかが分かっていない。
復習: structを使うときの注意点21• https://github.com/Fujiwo/CSharp7_8NewFeatures• サンプル コード
復習: スタック領域とヒープ領域22コード領域スタティック領域(静的変数)スタック領域(自動変数、メソッド コール)ヒープ領域(動的確保) データ領域
復習: スタック領域23int Add(int x, int y) // C++、x64、最適化なし{auto answer = x + y;return answer;64bits スタックポインター レジスター
復習: スタック領域とヒープ領域24スタック領域 ヒープ領域struct FooStruct { /* ...省略... */ }class FooClass { /* ...省略... */ }static void Main() {FooStruct fooStruct1;var fooStruct2 = new FooStruct();var fooClass = new FooClass ();}
復習: スタック領域とヒープ領域25
C#の参照型 (class)26class FooClass{public int Id { get; set; } = 0;public int Value { get; set; } = 1;}
C#の値型 (struct)27struct FooStruct{public int Id { get; set; }public int Value { get; set; }}
値型 (struct) と参照型 (class) の例28これからは原則値型(struct) の方を使おう!自作の型も同様。「struct 使うな」はあり得ない。
値型 (struct) を使うコツ29readonly struct Point {public readonly double X;public readonly double Y;public Point(double x, double y)=> (X, Y) = (x, y);}コピーせず参照で高速にアクセスしつつも、元の値を変更される危険を回避
いつのまにかヒープ領域が使われてしまう例30Enumerable.Range(minimum, maximum).ForEach(value => sum += value);
暗黙の new31
値型 (struct) はなるべく immutable に使う32readonly struct Point{public readonly double X;public readonly double Y;public Point(double x, double y) => (X, Y) = (x, y);public double AbsoluteValue => Math.Sqrt(X * X + Y * Y);public readonly double DotProduct(Point another) => X * another.X + Y * another.Y;}
3. C# プログラムの高速化33
• 時間の掛かる処理 (I/O、ネットワーク、重い計算) は非同期・別スレッドで高速化34
ツール: パフォーマンス プロファイラー35
ツール: BenchmarkDotNet36
ツール: BenchmarkDotNet37using BenchmarkDotNet.Attributes;using System.Linq;class Program{static void Main()=> BenchmarkRunner.Run<SampleBenchMark>();}[ShortRunJob][HtmlExporter][CsvExporter]public class SampleBenchMark{const int count = 10000;int[] array = new int[0];[GlobalSetup]public void Setup()=> array = Enumerable.Range(0, count).ToArray();[Benchmark]public int 配列をforして合計を求める(){var sum = 0;for (var index = 0; index < array.Length; index++)sum += array[index];return sum;}[Benchmark]public int 配列をforeachして合計を求める(){var sum = 0;foreach (var element in array)sum += element;return sum;}}
ツール: BenchmarkDotNet38• https://github.com/Fujiwo/CSharp7_8NewFeatures• サンプル コード測定結果1 (xlsx ファイル)測定結果2 (xlsxファイル)
struct を interface で受けると…39interface IValuable { int GetValue(); }struct FooStruct : IValuable {public int Value { get; set; }public int GetValue() => Value;}public int interfaceを渡す非ジェネリック版() {var item = new FooStruct { Value = 0 };var sum = 0;for (var count = 0; count < Size; count++)sum +=interfaceを受け取る非ジェネリック版(item);return sum;}static int interfaceを受け取る非ジェネリック版(IValuable item) => item.GetValue();public int interfaceを渡すジェネリック版() {var item = new FooStruct { Value = 0 };var sum = 0;for (var count = 0; count < Size; count++)sum +=interfaceを受け取るジェネリック版(item);return sum;}static int interfaceを受け取るジェネリック版<T>(Titem) where T : IValuable => item.GetValue();
ツール: BenchmarkDotNet40
非ジェネリック版のコレクションを使うと…41struct FooStruct {public int Value { get; set; }}public int 非ジェネリック版Collection(){var list = new ArrayList();for (var count = 0; count < Size; count++)list.Add(new FooStruct { Value = 0 });var sum = 0;for (var index = 0; index < list.Count;index++)sum += ((FooStruct)list[index]).Value;return sum;}public int ジェネリック版Collection(){var list = new List<FooStruct>();for (var count = 0; count < Size; count++)list.Add(new FooStruct { Value = 0 });var sum = 0;for (var index = 0; index < list.Count;index++)sum += list[index].Value;return sum;}
ツール: BenchmarkDotNet42
static intvarfor varreturnstatic int ListをCountを変数にしてからforする(List<Foo> foos){var sum = 0;var count = foos.Count;for (var index = 0; index < count; index++)sum += foos[index].Value;return sum;}static int Listをforeachする(List<Foo> foos){var sum = 0;foreach (var foo in foos)sum += foo.Value;return sum;}for/foreach の速度43
for/foreach の速度44
for/foreach の速度45// Enumerator が値型 (struct) の配列public struct ClassEnumeratorArray<T>: IEnumerable<T>{readonly T[] array;public StructEnumeratorArray(T[] array)=> this.array = array;public Enumerator GetEnumerator()=> new Enumerator(array);public class Enumerator : IEnumerator<T>{readonly T[] array;int index;internal Enumerator(T[] array)=> (this.array, index) = (array, -1);public T Current => array[index];object? IEnumerator.Current => Current;public bool MoveNext()=> ((uint)++index) < (uint)array.Length;public void Dispose() {}public void Reset() => index = -1;}}サンプル コード
for/foreach の速度46// Enumerator が値型 (struct) の配列public struct StructEnumeratorArray<T>{readonly T[] array;public StructEnumeratorArray(T[] array)=> this.array = array;public Enumerator GetEnumerator()=> new Enumerator(array);public struct Enumerator : IEnumerator<T>{readonly T[] array;int index;internal Enumerator(T[] array)=> (this.array, index) = (array, -1);public T Current => array[index];object? IEnumerator.Current => Current;public bool MoveNext()=> ((uint)++index) < (uint)array.Length;public void Dispose() {}public void Reset() => index = -1;}}サンプル コード
for/foreach の速度47
36倍!
ツール: ILSpy49
ツール: LINQPad50https://www.linqpad.net
https://sharplab.ioツール: SharpLab51
4. C# 7、8の新機能52
53C# 7、8の新機能もう「structを使うな」などと言わせない
安全に54C# 7、8の新機能
C# 7、8の新機能55• https://github.com/Fujiwo/CSharp7_8NewFeatures• サンプル コード
タプル (ValueTuple)56static int Compare(int? x, int? y){switch ((x, y)) {case (int value1, int value2):return value1.CompareTo(value2);case ({} , null ):case (null , {} ):case (null , null ):return 0;}}
分解と Deconstruct57var answer = (dividend / divisor, dividend % divisor);var (quotient, remainder) = answer;var staff = new Person(id: 100, name: "志垣太郎");var (id, name) = staff;
参照渡し/参照返し58
Span59unsafe {int* array = stackalloc int[size];for (var index = 0; index < size; index++)array[index] = index;}Span<int> array = stackalloc int[size];for (var index = 0; index < array.Length; index++)array[index] = index;
ローカル関数60static int ToDecimal(this IEnumerable<int> @this){var number = 0;// ローカル関数 (number をキャプチャー)void Add(int digit) => number = number * 10 + digit;@this.ForEach(Add);return number;}ラムダ式と違って…
null 許容参照型61#nullable enablepublic class Foo { }#nullable restore<Nullable>enable</Nullable>s ??= "default string";
パターンマッチング62static bool IsNullOrSpace(string? text)=> text switch {null => true ,string { Length: 0 } => true ,string s when s.Trim().Length == 0=> true ,_ => false};
インターフェイスのデフォルト実装63// インターフェイスのデフォルト実装interface IEnumerable改<TElement> : IEnumerable<TElement>{IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();}
非同期ストリーム64static async IAsyncEnumerable<TResult>SelectAsync<TElement, TResult>(// 非同期ストリームthis IAsyncEnumerable<TElement> @this,Func<TElement, TResult> selector){// 非同期foreachawait foreach (var item in @this)// 非同期イテレーターyield return selector(item);}
その他65
本日の内容
C# | WikipediaC# の歴史 - C# ガイド | Microsoft DocsC# 7 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 CC# 7.1 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 CC# 7.2 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 CC# 7.3 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 CC# 8.0 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C今日からできる! 簡単 .NET 高速化 Tips | slideshareforeach の掛け方いろいろ | ++C++; // 未確認飛行 C ブログ参考文献67

Recommended

PDF
C#勉強会 ~ C#9の新機能 ~
PDF
.NETラボ 勉強会 2021年1月 「C#で機械学習」
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PPTX
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
PDF
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
PPTX
機械学習入門
PDF
UnityでC#を勉強しはじめた私の主張
PPTX
メタプログラミング C#
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
PDF
Siv3Dで楽しむゲームとメディアアート開発
PDF
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
PDF
C++0x in programming competition
 
PDF
Boost.Coroutine
 
PDF
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
PDF
科学技術計算関連Pythonパッケージの概要
PPTX
C# LINQ ~深く知って、使いまくろう~
PDF
PDF
【GTMF2018TOKYO】ハードウェアの性能を活かす為の、Unityの新しい3つの機能
PDF
画像処理でのPythonの利用
ODP
コンピュータビジョン 1章
PPTX
Roslyn による Visual Studio のアドイン
PPTX
ぱっと見でわかるC++11
PDF
Twitter sphere of #twitter4j #twtr_hack
PPTX
Unity C#3からC#6に向けて
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PPTX
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
PDF
C++勉強会
PDF
[第2版]Python機械学習プログラミング 第8章
PPTX
C# 9.0 / .NET 5.0
PDF
今日からできる!簡単 .NET 高速化 Tips

More Related Content

PDF
C#勉強会 ~ C#9の新機能 ~
PDF
.NETラボ 勉強会 2021年1月 「C#で機械学習」
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PPTX
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
PDF
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
PPTX
機械学習入門
PDF
UnityでC#を勉強しはじめた私の主張
PPTX
メタプログラミング C#
C#勉強会 ~ C#9の新機能 ~
.NETラボ 勉強会 2021年1月 「C#で機械学習」
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
機械学習入門
UnityでC#を勉強しはじめた私の主張
メタプログラミング C#

What's hot

PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
PDF
Siv3Dで楽しむゲームとメディアアート開発
PDF
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
PDF
C++0x in programming competition
 
PDF
Boost.Coroutine
 
PDF
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
PDF
科学技術計算関連Pythonパッケージの概要
PPTX
C# LINQ ~深く知って、使いまくろう~
PDF
PDF
【GTMF2018TOKYO】ハードウェアの性能を活かす為の、Unityの新しい3つの機能
PDF
画像処理でのPythonの利用
ODP
コンピュータビジョン 1章
PPTX
Roslyn による Visual Studio のアドイン
PPTX
ぱっと見でわかるC++11
PDF
Twitter sphere of #twitter4j #twtr_hack
PPTX
Unity C#3からC#6に向けて
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PPTX
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
PDF
C++勉強会
PDF
[第2版]Python機械学習プログラミング 第8章
Javaセキュアコーディングセミナー東京第1回演習の解説
Siv3Dで楽しむゲームとメディアアート開発
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
C++0x in programming competition
 
Boost.Coroutine
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
科学技術計算関連Pythonパッケージの概要
C# LINQ ~深く知って、使いまくろう~
【GTMF2018TOKYO】ハードウェアの性能を活かす為の、Unityの新しい3つの機能
画像処理でのPythonの利用
コンピュータビジョン 1章
Roslyn による Visual Studio のアドイン
ぱっと見でわかるC++11
Twitter sphere of #twitter4j #twtr_hack
Unity C#3からC#6に向けて
LINQ 概要 + 結構便利な LINQ to XML
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
C++勉強会
[第2版]Python機械学習プログラミング 第8章

Similar to C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~

PPTX
C# 9.0 / .NET 5.0
PDF
今日からできる!簡単 .NET 高速化 Tips
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
知って得するC#
PPTX
C# 7.2 with .NET Core 2.1
PPTX
C# design note sep 2014
PPTX
C# 8
PPTX
最速C# 7.x
PDF
Inside FastEnum
PPTX
C#言語機能の作り方
PPTX
C#/.NETがやっていること 第二版
PPTX
.NET Core 2.x 時代の C#
PPTX
復習も兼ねて!C#6.0-7.0
PPTX
Live Coding で学ぶ C# 7
PPTX
Deep Dive C# 6.0
PDF
20141129-dotNet2015
PPTX
C# 7 Current Status
PPTX
.NET Core 3.0 で使える C# 8
PPTX
C# 7・8 の復習
C# 9.0 / .NET 5.0
今日からできる!簡単 .NET 高速化 Tips
C# 8.0 Preview in Visual Studio 2019 (16.0)
【Unite Tokyo 2019】Understanding C# Struct All Things
知って得するC#
C# 7.2 with .NET Core 2.1
C# design note sep 2014
C# 8
最速C# 7.x
Inside FastEnum
C#言語機能の作り方
C#/.NETがやっていること 第二版
.NET Core 2.x 時代の C#
復習も兼ねて!C#6.0-7.0
Live Coding で学ぶ C# 7
Deep Dive C# 6.0
20141129-dotNet2015
C# 7 Current Status
.NET Core 3.0 で使える C# 8
C# 7・8 の復習

More from Fujio Kojima

PPTX
C# 6.0 Preview
PDF
AIエージェント勉強会~マイクロソフトの最新技術発表を受けて~ (2025/07)
PDF
[C#/.NET] ITエンジニア (Developer) 向け AIエージェント開発ハンズオンセミナー
PDF
ITエンジニア (Developer) 向けAIエージェント勉強会 (2025/06/13)
PDF
機械学習 (AI/ML) 勉強会 #1 基本編
PDF
Burikaigi 2023「C# Live Coding!」 小島の分
PDF
.NET 5 勉強会 ~.NET Framework から .NET へ~
PDF
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
PPTX
HTML5 on ASP.NET
PDF
.NET 6 時代のデスクトップ アプリケーション開発
PPTX
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
PPTX
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
PPTX
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
PDF
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
PDF
機械学習 (AI/ML) 勉強会 #2 IoT編
PPTX
.NET MVP によるドキドキ・ライブコーディング! 小島の分
PDF
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
PPTX
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
PDF
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
PDF
BuriKaigi 2022 「C# Live Coding!」 小島の分
C# 6.0 Preview
AIエージェント勉強会~マイクロソフトの最新技術発表を受けて~ (2025/07)
[C#/.NET] ITエンジニア (Developer) 向け AIエージェント開発ハンズオンセミナー
ITエンジニア (Developer) 向けAIエージェント勉強会 (2025/06/13)
機械学習 (AI/ML) 勉強会 #1 基本編
Burikaigi 2023「C# Live Coding!」 小島の分
.NET 5 勉強会 ~.NET Framework から .NET へ~
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
HTML5 on ASP.NET
.NET 6 時代のデスクトップ アプリケーション開発
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
機械学習 (AI/ML) 勉強会 #2 IoT編
.NET MVP によるドキドキ・ライブコーディング! 小島の分
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分

C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~


[8]ページ先頭

©2009-2025 Movatter.jp