Last active
June 28, 2020 05:24
-
-
Save ufcpp/ca904a122d00daa61d866552941a6c6b to your computer and use it in GitHub Desktop.
Visual Studio 16.7 Preview 3 での C# 9.0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Top-level statements | |
// - Program.Main 書かなくていい | |
// - Main (相当の通常は書けない名前のメソッド) をコンパイラー生成 | |
// - 制限: | |
// - プロジェクト全体で1ファイルだけこの書き方ができる | |
// - ファイル内でも、名前空間とかクラスの宣言よりも前でないとダメ | |
using System; | |
var p = new Point(1, 2); | |
var (x, y) = p; | |
Console.WriteLine((x, y)); | |
// with で非破壊書き換え(クローン → 新インスタンスを書き換え) | |
var p1 = p with { X = 3 }; | |
Console.WriteLine((p1.X, p1.Y)); | |
var p2 = new Point2 | |
{ | |
// 初期化子中では set 可能 | |
X = 1, | |
Y = 2, | |
}; | |
// ここより下で | |
// p2.X = 3; | |
// とか書くとコンパイル エラー | |
FunctionPointer.M(); | |
// Records | |
// - record キーワード | |
// - 現状(VS 16.7 p3)ではプライマリコンストラクターを書けるのは record だけ | |
// - プライマリコンストラクターから、 init-only プロパティ、Deconstruct、Equals、GetHashCode、Clone とかをコンパイラー生成 | |
// - (Clone は通常は書けない名前のメソッドとして生成) | |
record Point(int X, int Y); | |
// init-only プロパティはクラス、構造体でも利用可能 | |
class Point2 | |
{ | |
public int X { get; init; } | |
public int Y { get; init; } | |
} | |
// Function pointers | |
// - delegate* <型引数> | |
// - 代入側にも & が必須 | |
// - 静的メソッドに対してしか使えない | |
// - 完全に Native Interop 用 | |
unsafe class FunctionPointer | |
{ | |
public static void M() | |
{ | |
delegate*<void> a = &Static; | |
a(); // OK | |
a = &local; | |
a(); // Method not found: 'Void FunctionPointer.local()'. | |
static void local() => System.Console.WriteLine("A.local"); | |
} | |
static void Static() => System.Console.WriteLine("A.Static"); | |
} | |
// init アクセッサー (init-only プロパティ/プライマリ コンストラクター)利用時に必要な属性 | |
// (.NET 5 で BCL に追加予定。 .NET 5 でなくても、見ての通り自前定義で代用可能) | |
namespace System.Runtime.CompilerServices | |
{ | |
internal class IsExternalInit : Attribute { } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment