Skip to content

Instantly share code, notes, and snippets.

@ufcpp
Last active June 28, 2020 05:24
Show Gist options
  • Save ufcpp/ca904a122d00daa61d866552941a6c6b to your computer and use it in GitHub Desktop.
Save ufcpp/ca904a122d00daa61d866552941a6c6b to your computer and use it in GitHub Desktop.
Visual Studio 16.7 Preview 3 での C# 9.0
// 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