Movatterモバイル変換


[0]ホーム

URL:


信之 岩永, profile picture
Uploaded by信之 岩永
PPTX, PDF6,259 views

.NET Core 2.x 時代の C#

https://www.microsoft.com/ja-jp/events/decode/2018/de:code 2018セッションID: AD19日本の第一人者が語る! C# の現状と今後への展望 「.NET Core 2.x 時代の C#」

Embed presentation

Downloaded 19 times
日本の第一人者が語る!C# の現状と今後への展望「.NET Core 2.x 時代の C#」AD19
今日のテーマ去年のde:codeで話したこと
今日のテーマったすなわち、今年
その他、去年話したこと既存機能最近出たて将来の話
.NET Core.NET Coreも「生みの苦しみ」の時期を抜けた
.NET Core
昔: .NET Core 1.0の頃.NET Framework.NET Core移植済みWindows依存強•レジストリー•Drawing•ODBCマイナー機能移植しない•UWP XAML•WPF新規実装
今: .NET Core 2.0~2.1WindowsCompatibilityPackマイナー機能も大体移植.NET Framework移植しない•UWP XAML•WPF.NET Core移植済み新規実装• 残ってるのはGUIくらい• GUIは今後もクロスプラットフォームにはならない(でかすぎて無理)• でも、こっちにしかない機能がある限り、サポートは絶対
今: .NET Core 2.0~2.1WindowsCompatibilityPackマイナー機能も大体移植.NET Framework移植しない•UWP XAML•WPF.NET Core移植済み新規実装• 新機能はまず.NET Coreで実装• 今のところ.NET Frameworkに「移植」作業してる• 移植作業もしんどい• パフォーマンスはCoreだけが向上してたり• .NET Frameworkはside by sideじゃなくて
今: .NET Core 2.0~2.1WindowsCompatibilityPackマイナー機能も大体移植.NET Framework移植しない•UWP XAML•WPF.NET Core移植済み新規実装• Windows依存が強い機能も.NET Coreに移植• 一部はどのプラットフォームでも動く• 一部はWindows限定• APIだけがある。呼び出すと実行時例外https://blogs.msdn.microsoft.com/dotnet/2017/11/16/announcing-the-windows-compatibility-pack-for-net-core/• RuntimeInformation.IsOSPlatform でif分岐必要• コンパイル時に呼び出し可能かどうかを調べるアナライザーあり
将来: .NET Core 3.0WindowsCompatibilityPackGUIも.NET Core上に•UWP XAML•WPF.NET Core新規実装• あくまで.NET Core上にWindows限定機能が載ってるだけ(クロスプラットフォームでは動かない)• GUIでも.NET Coreの恩恵を受けたい• パフォーマンス向上• side by sideインストールML.NET•機械学習
将来: .NET Core 3.0
パフォーマンス
標準ライブラリの実装改善(1)if ((uint)x < length)元 後if (0 <= x && x < length)
標準ライブラリの実装改善(2)if (9割方true)短い処理else長い処理をメソッド抽出();元 後if (9割方true)短い処理else長い処理
JIT intrinsics (1)enum A { X = 1, Y = 2 }A a = A.X;a.HasFlag(A.Y);IL_0002: ldloc.0IL_0003: box AIL_0008: ldc.i4.2IL_0009: box AIL_000e: call HasFlagボックス化が起きて重たいので有名※ intrinsics: 「内在的な」って意味の単語。この場合「中に組み込まれてる処理」くらいの意味。
JIT intrinsics (2)interface I { void M(); }struct S : I { void I.M() { } }S s = default;((I)s).M();明示的実装その呼び出しIL_0002: initobj SIL_0008: ldloc.0IL_0009: box SIL_000e: callvirt Mこれもボックス化を起こす
Hardware intrinsicsif(X86.Sse.IsSupported){var c = X86.Sse.Add(a, b);}if(Arm64.Simd.IsSupported){var c = Arm64.Simd.Add(a, b);}現在の環境でこの命令セットが使えるかどうかx86 CPUのADDPS命令に展開ARM64のADD命令に展開
Hardware intrinsics
ランタイムの修正が必須な機能「需要があるのはわかる」「実装もそんなに難しくない」「でも、ランタイムに手を入れないといけないから無理」
ジェネリック属性class SomeAttribute<T> : Attribute { }[Some<string>]class Target { }
インターフェイスのデフォルト メソッドinterface I<T>{T this[int index] { get; }public T First() => this[0];}
C#マイナー リリース小さく、高頻度にリリース
C#の小数点リリース
スケジュール感de:codeVS 16.0(未定/推定)C# 8.0VS 15.8(未定/推定)build
マイナー リリース
小分けの例1: タプルvar (x, y) = (1, 2);• 複数の値をひとまとめに• 多値戻り値とかに使えるvar (x, y) = (1, 2);var t = (x, y);WriteLine(t.Item1);7.0時点では「Item1」に
小分けの例1: タプルvar (x, y) = (1, 2);var t = (x, y);WriteLine(t.x);タプル要素名を決定タプルを作るときに渡したx,yからvar (x, y) = (1, 2);WriteLine((x, y) == (1, 2)); • タプル同士を==で比較• メンバーごとに==を&&で繋いだのと同じ結果
小分けの例2: refref int M(ref int x){ref var r = ref x;return ref r;}参照でもらったものをローカルで参照して戻り値で返すunsafe struct Pointer{int* p;public ref int this[int i] => ref p[i];}nativeコード、unsafeコードとのつなぎに便利だったり
小分けの例2: refref readonly int M(in int x){ref readonly var r = ref x;// r = 1; みたいな書き換えができないreturn ref r;}• 書き換えはできない参照を作れる• ref readonly• 引数の場合はin (out引数との対比)
小分けの例2: refstruct Vector{public double W;public double X;public double Y;public double Z;public static Vector operator +(in Vector p, in Vector q)=> ...;}合計64バイトあってコピーするにはちょっと大きい• コピーを避けて使える• 不用意に書き換えられない保証あり• 演算子にも使える
小分けの例2: refint x = 1, y = 2;ref var r = ref x;r = 10; // x が書き換わるr = ref y;r = 20; // y が書き換わる「何を参照するか」自体を書き換え
リリースが早くなって楽に作れて需要の高いものだけ先に
バグの例1: defaultリテラル(C# 7.1)Dictionary<string, string> table= default(Dictionary<string, string>);Dictionary<string, string> table = default;
バグの例1: defaultリテラル(C# 7.1)void M(int? x = default) { }int?の規定値はnullなので、当然、nullであるべき• VS 15.3(リリース時点) : 0になってた• VS 15.4(修正版) : nullに
バグの例2: in引数(C# 7.2)// 2変数、既定値付きstatic void M(in int x = 0, in int y = 0) => WriteLine(y);// 1変数だけ値を渡すstatic void Main() => M(1);yには0が入ってほしい• VS 15.5(リリース時点) : なぜかnull参照例外発生• VS 15.6で修正
バグの例2: in引数(C# 7.2)class X{// クラスに対して in 引数static void S(in X x) => WriteLine(x.ToString());// in 引数相手に this を渡すvoid M() => S(this);}• VS 15.5(リリース時点) :ExecutionEngineException発生• VS 15.6(修正版)で修正
リリースが早くなっているので
パフォーマンスパフォーマンスを上げるためのライブラリ・言語機能
C#でパフォーマンス?
… 7B 0D 0A 20 20 22 69 64 22 3A 20 31 2C 0D 0A 20 20 22 6E 61 6D 65 22 3A 20 22 F0 9F 91 A6 F0 9F 8F BD 22 0D 0A 7D …7B 0D 0A 20 20 22 69 64 22 3A 20 31 2C 0D 0A 20 20 22 6E 61 6D 65 22 3A 20 22 F0 9F 91 A6 F0 9F 8F BD 22 0D 0A 7DStream.Read(byte[] buffer, int offset, int count)Encoding.GetString(byte[] bytes)… 22 00 69 00 64 00 22 00 3A 00 20 00 31 00 2C 00 0D 00 0A 00 20 00 20 00 22 00 6E 00 61 00 6D 00 65 00 22 00 3A 00 20 00 …string.Substring string.Substring31 00122 00 3D D8 66 DC 3C D8 FD DF 22 00"👦🏽"UTF-8UTF-16
… 7B 0D 0A 20 20 22 69 64 22 3A 20 31 2C 0D 0A 20 20 22 6E 61 6D 65 22 3A 20 22 F0 9F 91 A6 F0 9F 8F BD 22 0D 0A 7D …Utf8String Utf8String Utf8String1 "👦🏽"直接intにParseすればヒープ不要ToString時に初めてヒープ確保Substring
この辺りがまだちょっと道半ば
C# 7.0struct A{int[] array;ref int First => ref array[0];}unsafe struct B{int* pointer;ref int First => ref pointer[0];}戻り値を参照にできるunsafeなものも返せるref int M(ref int x) => ref x;ref int N(){int x = 0;return ref x;}外からもらったものは返せる中のものは返せない
C# 7.2Span<int> M(Span<int> x) => x;Span<int> N(){Span<int> x = stackallock int[4];return x;}外からもらったものは返せる中のものは返せないSpan<T>で受け取るなら、unsafeなしでstackallockが使える
C# 7.3Span<int> x = stackallock int[] { 1, 2, 3 };Span<int> y = stackallock[] { 1, 2, 3 };Span<int> x = stackallock[] { 1, 2, 3 };unsafe{fixed (int* p = x) { }}
System.IO.PipelinesSpan<T>を前提にしたI/Oint Read(byte[] buffer, int offset, int count)int Read(Span<int> buffer)
https://blogs.msdn.microsoft.com/dotnet/2018/04/18/performance-improvements-in-net-core-2-1/Span<T>による最適化
UTF-8を前提にした文字列処理
C# その他の機能C# 7.3: ここまでのテーマにもれた機能もいくつか紹介C# 8.0: 少し先の話も
C# 7.3: オーバーロード解決の改善static void M<T>(this T x) where T : class { }static void M<T>(this ref T x) where T : struct { }static void X(string s, int i){s.M();i.M();}前までは呼び分けできなかった型制約違い
C# 7.3: ジェネリック型制約の追加static void E<T>(this T x)where T : System.Enum { }static void D<T>(this T x)where T : System.Delegate { }static void U<T>(this T x)where T : unmanaged { }列挙型だけを受け付けるデリゲート型だけを受け付けるポインター化可能な型だけを受け付ける
マイナー/メジャー並行開発C# 7.0 C# 7.1 C# 7.2 C# 7.3null許容参照型再帰パターンrangeasync streamインターフェイスのデフォルト実装タプル改善 ref改善 タプル改善ref改善C# 8.0タプルrefパターン
https://github.com/dotnet/csharplang/wiki/Nullable-Reference-Types-Previewhttps://github.com/dotnet/csharplang/wiki/vNext-Preview8.0プレビュー、はじめました
C# 8.0: null許容参照型int M(string s){return s.Length;}int N(string? s){var x = s.Length;if (s == null) return -1;return s.Length;}単にこう書くと非null参照型でも、?でnull許容にnullチェックがないので警告nullチェックより後なのでOK既存コードを壊さないために• オプションでモード切替可能に• null、非null、「未指定」• 既存コードは「未指定」扱いでコード解析する
C# 8.0: 再帰パターンint M(object obj){switch (obj){case int i: return i;case string s: return s.Length;case Point (var x, var y): return x * y;case Point { X : var x, Y : var y }: return X * Y;}throw new IndexOutOfRangeException();}int M(object obj)=> obj switch{case int i => i,case string s => s.Length,case Point (var x, var y) => x * y,case Point { X : var x, Y : var y } => X * Y,_ => throw new IndexOutOfRangeException()};switch式
C# 8.0: Rangevar array = new[] { 1, 2, 3, 4, 5 };var x = array[1..3]; // 1以上、3未満var x = array[1..^1]; // 1~末尾から10 1 2 3 4{ 1, 2, 3, 4, 5 }0 1 2 3 4{ 1, 2, 3, 4, 5 }
C# 8.0: async streamasync IAsyncEnumerator<int> MAsync(){for (int i = 0; i < 5; i++){await Task.Delay(1);yield return i;}}foreach await (var x in MAsync()){}
まとめ
© 2018 Microsoft Corporation. All rights reserved.本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。

Recommended

PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PPTX
C# 9.0 / .NET 5.0
PPTX
C# 7.2 with .NET Core 2.1
PDF
今日からできる!簡単 .NET 高速化 Tips
PPTX
C#や.NET Frameworkがやっていること
PPTX
Orange Cube 自社フレームワーク 2015/3
PPTX
C#言語機能の作り方
PPTX
Deep Dive C# 6.0
PDF
Hello Dark-Side C# (Part. 1)
PPTX
C# 8.0 非同期ストリーム
PPTX
最速C# 7.x
KEY
Objc lambda
PDF
知って得するC#
PPTX
C#の書き方
PDF
Inside FastEnum
PDF
基礎からのCode Contracts
PPTX
広がる .Net
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PPTX
C#とILとネイティブと
PPTX
プログラミング .NET Framework 第4版
PDF
C++でCプリプロセッサを作ったり速くしたりしたお話
PPTX
C#/.NETがやっていること 第二版
PDF
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
PDF
動的なILの生成と編集
PDF
今からでも遅くないC#開発
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
PPTX
Code Contracts in .NET 4
PPTX
Sharing Deep Dive
PDF
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
PDF
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~

More Related Content

PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PPTX
C# 9.0 / .NET 5.0
PPTX
C# 7.2 with .NET Core 2.1
PDF
今日からできる!簡単 .NET 高速化 Tips
PPTX
C#や.NET Frameworkがやっていること
PPTX
Orange Cube 自社フレームワーク 2015/3
PPTX
C#言語機能の作り方
PPTX
Deep Dive C# 6.0
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 9.0 / .NET 5.0
C# 7.2 with .NET Core 2.1
今日からできる!簡単 .NET 高速化 Tips
C#や.NET Frameworkがやっていること
Orange Cube 自社フレームワーク 2015/3
C#言語機能の作り方
Deep Dive C# 6.0

What's hot

PDF
Hello Dark-Side C# (Part. 1)
PPTX
C# 8.0 非同期ストリーム
PPTX
最速C# 7.x
KEY
Objc lambda
PDF
知って得するC#
PPTX
C#の書き方
PDF
Inside FastEnum
PDF
基礎からのCode Contracts
PPTX
広がる .Net
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PPTX
C#とILとネイティブと
PPTX
プログラミング .NET Framework 第4版
PDF
C++でCプリプロセッサを作ったり速くしたりしたお話
PPTX
C#/.NETがやっていること 第二版
PDF
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
PDF
動的なILの生成と編集
PDF
今からでも遅くないC#開発
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
PPTX
Code Contracts in .NET 4
PPTX
Sharing Deep Dive
Hello Dark-Side C# (Part. 1)
C# 8.0 非同期ストリーム
最速C# 7.x
Objc lambda
知って得するC#
C#の書き方
Inside FastEnum
基礎からのCode Contracts
広がる .Net
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
C#とILとネイティブと
プログラミング .NET Framework 第4版
C++でCプリプロセッサを作ったり速くしたりしたお話
C#/.NETがやっていること 第二版
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
動的なILの生成と編集
今からでも遅くないC#開発
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
Code Contracts in .NET 4
Sharing Deep Dive

Similar to .NET Core 2.x 時代の C#

PDF
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
PDF
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
PDF
C#勉強会 ~ C#9の新機能 ~
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PPTX
C# 8
PPTX
C# design note sep 2014
PPTX
C# 8.0 null許容参照型
PPTX
.NET Compiler Platform
PPTX
(ゲームじゃない方の)switchで遊びたい話
PPTX
C#6.0の新機能紹介
PPTX
Live Coding で学ぶ C# 7
PDF
C#勉強会
PPTX
復習も兼ねて!C#6.0-7.0
PDF
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
PPTX
C# 7 Current Status
PPTX
.NET Core 3.0 で使える C# 8
PPTX
C# 7.2 の新機能
PDF
20141129-dotNet2015
PPTX
C# 7・8 の復習
PDF
プログラミングNet framework3のお題
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#勉強会 ~ C#9の新機能 ~
【Unite Tokyo 2019】Understanding C# Struct All Things
C# 8
C# design note sep 2014
C# 8.0 null許容参照型
.NET Compiler Platform
(ゲームじゃない方の)switchで遊びたい話
C#6.0の新機能紹介
Live Coding で学ぶ C# 7
C#勉強会
復習も兼ねて!C#6.0-7.0
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
C# 7 Current Status
.NET Core 3.0 で使える C# 8
C# 7.2 の新機能
20141129-dotNet2015
C# 7・8 の復習
プログラミングNet framework3のお題

More from 信之 岩永

PPTX
今から始める、Windows 10&新.NETへの移行戦略
PPTX
async/await のしくみ
PPTX
Unityで使える C# 6.0~と .NET 4.6
PPTX
非同期処理の基礎
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PPTX
Unicode文字列処理
PPTX
C# コンパイラーの書き換え作業の話
PPTX
Coding Interview
PPTX
C#マスコット(公開用)
PPTX
Modern .NET
PPTX
.NET vNext
PPTX
Anders Hejlsberg Q & A
PPTX
それっぽく、適当に
PPTX
YouTube ライブ配信するようになった話
今から始める、Windows 10&新.NETへの移行戦略
async/await のしくみ
Unityで使える C# 6.0~と .NET 4.6
非同期処理の基礎
今から始める、Windows 10&新.NETへの移行戦略
Unicode文字列処理
C# コンパイラーの書き換え作業の話
Coding Interview
C#マスコット(公開用)
Modern .NET
.NET vNext
Anders Hejlsberg Q & A
それっぽく、適当に
YouTube ライブ配信するようになった話

.NET Core 2.x 時代の C#

Editor's Notes

  • #8 そりゃまあ、出自がSilverlight→UWPなので。
  • #11 https://blogs.msdn.microsoft.com/dotnet/2017/11/16/announcing-the-windows-compatibility-pack-for-net-core/
  • #12 退役って言っても、既存のものをわざわざ移せというものでもない。サポートはまあ続いてる。
  • #13 実際、Paint.NETをバイナリそのままで動かしてみてるって。それで発見したスレッドのバグあり(Core 2.1で修正済み)。

[8]ページ先頭

©2009-2025 Movatter.jp