rksoftware

Visual Studio とか C# とかが好きです

C# 2.0 以降の新機能の確認 - C# 8.0 - 非同期の破棄可能

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

非同期の破棄可能

 https://docs.microsoft.com/ja-jp/dotnet/standard/garbage-collection/implementing-disposeasync
 インターフェイス System.IAsyncDisposable が追加された。await using で使う。using で使いたければ同時に System.IDisposable も実装することも可能。

// 非同期の破棄
await using var sample = new Sample();
// DisposeAsyncCore
// DisposeAsync
// と出力される

// IAsyncDisposable を実装したクラス
public class Sample : IAsyncDisposable
{
    // IAsyncDisposable インターフェイスで定義されているのメソッド
    public async ValueTask DisposeAsync()
    {
        await DisposeAsyncCore();
        Console.WriteLine("DisposeAsync");
    }

    // sealed クラスでない場合は派生クラスから読んでもらうためにこのメソッドを作っておく
    protected async virtual ValueTask DisposeAsyncCore()
    {
        Console.WriteLine("DisposeAsyncCore");
    }
}

Visual Studio Code で C# を書くための準備

Visual Studio Code で C# を書くための準備をしましょう。

まず .NET をインストールします。
rksoftware.hatenablog.com

↑の記事にもインストーラへのリンクが書かれていますが、Visual Studio Code をインストールします。
visualstudio.microsoft.com

Visual Studio は多彩な拡張機能で様々なプログラミング言語に対応します。当然 C# の拡張機能もあります。インストールした Visual Studio に C# の拡張機能をインストールします。

  1. Visual Studio Code を起動します
  2. F1 キーを押してコマンドパレットを開きます
  3. install extensions と入力し Enter キーを押します
  4. 拡張機能の検索ボックスにキーボードフォーカスが移るので、C# と入力します
  5. C# という発行者が Microsoft の拡張機能をインストールします
  6. インストール後、機能が有効になるまで少し時間がかかるので、おかしいなと思ったら少し待ちます

これで準備はできました。
簡単ですね。

C# 開発環境のアンインストール

開発環境はインストールはするものの意外とアンインストールはしないものです。
アンインストールする前に新しい PC を手にして新しい環境で作り直すのが常です。そんなレアな体験アンインストール方法のメモです。

Visual Studio

Windows の Visual Studio です。
インストーラでアンインストールします。インストーラを実行する方法はいくつかありますが、普通に

設定 > アプリ

から起動できるので、普通に。

.NET Framework

Windows の .NET Framework。 やはり普通に
設定 > アプリ

.NET Core (Windows)

Windows の .NET Core。
設定 > アプリ

Visual Studio Code (Windows)

設定 > アプリ

拡張機能や設定はディレクトリを消す必要があります。

Visual Studio for Mac

Applications ディレクトリから削除。
Xamarin 関係などはコマンドでポチポチ。

Visual Studio Code (mac)

Applications ディレクトリから削除。

拡張機能や設定はディレクトリを消す必要があります。

.NET Core (mac)

コマンドでポチポチと。

簡単ですね。

C# 2.0 以降の新機能の確認 - C# 8.0 - 入れ子になった式の stackalloc

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

入れ子になった式の stackalloc

 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/stackalloc
 SpanSystem.ReadOnlySpan が通ることろで stackalloc[ ] { } が書ける。stackalloc[ ] { }foreach 等に直接書くと SpanSystem.ReadOnlySpan になる。

Span<int> nums = stackalloc[] { 1, 2, 3, 4, 5, 6 };

foreach (var num in stackalloc[] { 1, 2, 3, 4, 5, 6 })
  Console.WriteLine(num);

C# 2.0 以降の新機能の確認 - C# 8.0 - 構築された構造体型もアンマネージド型

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

構築された構造体型もアンマネージド型

 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/unmanaged-types
 フィールド全てがアンマネージド型の場合、ジェネリック構造体がアンマネージドになる。

unsafe
{
    // エラーにならない
    Console.WriteLine(sizeof(MyType<int>));

    // エラー CS0208  マネージ型('MyType<object>') のアドレスの取得、サイズの取得、またはそのマネージ型へのポインターの宣言が実行できません
    Console.WriteLine(sizeof(MyType<Object>));
}

struct MyType<T>
{
    public T Value;
}

C# 2.0 以降の新機能の確認 - C# 8.0 - インデックスと範囲

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

インデックスと範囲

 https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/ranges-indexes
 二つの型(構造体)と二つの演算子が追加された。
 ・System.Index 型 インデックスを表す
 ・System.Range 型 範囲を表す
 ・^ 演算子 末尾からを表す
 ・.. 演算子 範囲を表す

 二つの型の関係は System.Range のコンストラクタを見るとわかりやすい。先頭のインデックスと末尾のインデックスを持つのが範囲だとわかる。

Range (System.Index start, System.Index end)

 インデックスもコンストラクタを見るとわかりやすい。何番目なのかを表す数値と先頭からなのか末尾なのかを表すフラグを持っている。

Index (int value, bool fromEnd = false)

 演算子はそれぞれ次のように使える。

// System.Index
System.Index index1 = 1;
System.Index index2 = ^1;  // 演算子 ^

// System.Range
System.Range range1 = index1..index2;  // 演算子 ..

 範囲の指定例

// System.Index と .. を使って
System.Range range1 = index1..index2;  // index1 から index2 まで
System.Range range2 = index1..;        // index1 から末尾まで
System.Range range3 = ..index2;        // 先頭から index2 まで

// ^ と .. を使って
System.Range range1 = 1..2;
System.Range range2 = ^1..1;
System.Range range3 = ^2..^1;

// 配列での使用例
var array = new[] { "1", "2", "3", "4" };
Console.WriteLine(string.Join(", ", array[1]));     // 2
Console.WriteLine(string.Join(", ", array[^1]));    // 4        (一番後方が ^1)
Console.WriteLine(string.Join(", ", array[1..^0])); // 2, 3, 4(一番後方が ^0)

C# 2.0 以降の新機能の確認 - C# 8.0 - null 合体割り当て

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

null 合体割り当て

 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-coalescing-operator
 ??=。左辺の変数が null の場合、左辺に右辺の値が代入される。左辺が null でない場合は何も起きない。

string text = null;
// text が "saitama" となり "saitama" が表示される
Console.WriteLine(text ??= "saitama");
// text は "saitama" なので ??= で値は変わらず "saitama" が表示される
Console.WriteLine(text ??= "gunma");