SlideShare une entreprise Scribd logo
1  sur  60
日本の第一人者が語る!
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.1
Windows
Compatibility
Pack
マイナー機能も大体移植
.NET Framework
移植しない
•UWP XAML
•WPF
.NET Core
移植済み
新規実装
• 残ってるのはGUIくらい
• GUIは今後もクロスプラット
フォームにはならない(でか
すぎて無理)
• でも、こっちにしかない機能
がある限り、サポートは絶対
今: .NET Core 2.0~2.1
Windows
Compatibility
Pack
マイナー機能も大体移植
.NET Framework
移植しない
•UWP XAML
•WPF
.NET Core
移植済み
新規実装
• 新機能はまず.NET Coreで実装
• 今のところ.NET Frameworkに「移植」作
業してる
• 移植作業もしんどい
• パフォーマンスはCoreだけが向上して
たり
• .NET Frameworkはside by sideじゃなくて
今: .NET Core 2.0~2.1
Windows
Compatibility
Pack
マイナー機能も大体移植
.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.0
Windows
Compatibility
Pack
GUIも.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.0
IL_0003: box A
IL_0008: ldc.i4.2
IL_0009: box A
IL_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 S
IL_0008: ldloc.0
IL_0009: box S
IL_000e: callvirt M
これもボックス化を
起こす
Hardware intrinsics
if(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:code
VS 16.0
(未定/推定)
C# 8.0
VS 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: ref
ref 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: ref
ref readonly int M(in int x)
{
ref readonly var r = ref x;
// r = 1; みたいな書き換えができ
ない
return ref r;
}
• 書き換えはできない参照を作れ
る
• ref readonly
• 引数の場合はin (out引数との対
比)
小分けの例2: ref
struct 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: ref
int 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 7D
Stream.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.Substring
31 00
1
22 00 3D D8 66 DC 3C D8 FD DF 22 00
"👦🏽"
UTF-8
UTF-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 Utf8String
1 "👦🏽"
直接intにParse
すればヒープ不
要
ToString時に
初めてヒープ確
保
Substring
この辺りがま
だ
ちょっと道半
ば
C# 7.0
struct 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.2
Span<int> M(Span<int> x) => x;
Span<int> N()
{
Span<int> x = stackallock int[4];
return x;
}
外からもらったものは返
せる
中のものは返せ
ない
Span<T>で受け取るなら、
unsafeなしでstackallockが使え
る
C# 7.3
Span<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.Pipelines
Span<T>を前提にしたI/O
int 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.3
null許容参照型
再帰パターン
range
async stream
インターフェイスのデフォルト実装
タプル改善 ref改善 タプル改善
ref改善
C# 8.0
タプル
ref
パターン
https://github.com/dotnet/csharplang/wiki/Nullable-Reference-Types-Preview
https://github.com/dotnet/csharplang/wiki/vNext-Preview
8.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: Range
var array = new[] { 1, 2, 3, 4, 5 };
var x = array[1..3]; // 1以上、3未満
var x = array[1..^1]; // 1~末尾から1
0 1 2 3 4
{ 1, 2, 3, 4, 5 }
0 1 2 3 4
{ 1, 2, 3, 4, 5 }
C# 8.0: async stream
async 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.
本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。

Contenu connexe

Tendances

知って得するC#
知って得するC#知って得するC#
知って得するC#
Shota Baba
 
Code Contracts in .NET 4
Code Contracts in .NET 4Code Contracts in .NET 4
Code Contracts in .NET 4
信之 岩永
 

Tendances (20)

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

Similaire à .NET Core 2.x 時代の C#

T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
 

Similaire à .NET Core 2.x 時代の C# (20)

C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
20010901
2001090120010901
20010901
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 

Plus de 信之 岩永

Plus de 信之 岩永 (17)

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

Dernier

Dernier (10)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

.NET Core 2.x 時代の C#

Notes de l'éditeur

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