usingステートメントは、C#1.0から使えるリソース管理の便利な仕組みですが
C#8.0からはusing 宣言として、ローカル変数のスコープを抜けたらDisposeする仕組みが追加されました

using ステートメントは、今日のリソース管理に効果的なツールですが、かなりの形式的な処理が必要です。 管理するリソースが多数あるメソッドでは、一連の using ステートメントでは構文的に行き詰まる可能性があります。 このような構文上の負担が大きいため、ほとんどのコーディング スタイル ガイドラインでは、このシナリオに対して中括弧に関する例外を明示的に規定しています。

using 宣言はここでの形式的な処理の多くを削除し、リソース管理ブロックを含む他の言語と同等の C# を取得します。 さらに、パターンベースの using を使用すると、開発者はここで参加できる型のセットを拡張できます。 多くの場合、using ステートメントで値を使用できるようにするためにのみ存在するラッパー型を作成する必要がなくなります。

これらの機能を組み合わせることで、開発者は using を適用できるシナリオを簡素化および拡張できます。 "パターン ベースの using" と "using 宣言"

using System;

public class Program
{
    public static void Main(string[] args)
    {


        // ブロックで囲われている間がスコープでブロックを出るとDisposeが呼ばれる
        using (var obj1 = new SampleCode())
        {
            Console.WriteLine("usingステートメントは、C#1.0から使える");
        }

        if (true)
        {
            // using宣言は、ローカル変数のスコープがusingのスコープになる(if文抜けたらDisposeする)
            using var obj2 = new SampleCode();

            Console.WriteLine("using宣言は、C#8.0から使える");
        }

        Console.WriteLine("範囲のわかりやすさでは、usingステートメント");
        Console.WriteLine("ネストを嫌うのであれば、using宣言が良いかも?");
    }
}

public class SampleCode : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("Dispose!!");
    }
}
投稿日時: 2025-06-24 13:10:24

関数の中に関数を書くと、ローカル関数と呼ばれます

あまり現実的な例ではないですが、こういう感じで書けます

class SampleCode
{
    public void Sample()
    {
        void Output(string msg)
        {
            Console.WriteLine(msg);
        }

        Output("Hello C#");
    }
}

ローカル関数の外で宣言している変数名をローカル関数内で使用すると参照することができます

var obj = new SampleCode();
obj.Sample();

class SampleCode
{
    public void Sample()
    {
        var msg = "Hello C#!!";

        void Output()
        {
            Console.WriteLine(msg);
        }

        Output();
    }
}

本当は、ローカル関数の外側を参照させる意図がなかったのにうっかり参照してしまうケースを避けるために
staticをつけることで、静的ローカル関数が定義でき、この場合は外側で宣言した変数を参照することができなくなります

静的ローカル関数

var obj = new SampleCode();
obj.Sample();

class SampleCode
{
    public void Sample()
    {
        var msg = "Hello C#!!";

        static void Output()
        {
            Console.WriteLine(msg); // エラーになる
        }

        Output();
    }
}
投稿日時: 2025-06-23 12:59:23

タプルを使用すると複数の値を一度に受け取ることができますが
そのうちの一部の値は使わない場合、使いもしないのに変数に格納すると
この変数はどこで使うのだろうか?と疑問に思わせてしまうためよくないです

使う気がない値は明確に使わないという風に示せた方がよいのでその場合に _ をつかいます

例えば3つの値を返す関数があり、すべて使いたい場合と2つ名の値が不要な場合だと以下のように記載できます

var (a, b, c) = Hogehoge();
var (x, _, y) = Hogehoge();

static (string a, string b, string c) Hogehoge()
{
    return ("a", "b", "c");
}
投稿日時: 2025-06-14 02:03:14

配列の要素を指定する方法、後ろから何番目と指定するときに使用するのIndex演算子

一番最後の要素が1であることに注意

var data = new[] { "a", "b", "c", "d", "e" };

// a
Console.WriteLine(data[0]);
Console.WriteLine(data[^5]); // 最後から5番目の要素

// b
Console.WriteLine(data[1]);
Console.WriteLine(data[^4]); // 最後から4番目の要素

// c
Console.WriteLine(data[2]);
Console.WriteLine(data[^3]); // 最後から3番目の要素

// d
Console.WriteLine(data[3]);
Console.WriteLine(data[^2]); // 最後から2番目の要素

// e
Console.WriteLine(data[4]);
Console.WriteLine(data[^1]); // 最後の要素

.. は範囲演算子
範囲演算子の前に指定するのは含む要素
範囲演算子の後ろに指定するのは、含まない要素を指定


var data = new[] { "日", "月", "火", "水", "木", "金", "土" };

// 含む要素番号..含まない要素番号
Console.WriteLine("平日は、{0}", string.Join(",", data[1..6])); // 月,火,水,木

// 同じ結果 含む要素番号..後ろから1番目の要素の前まで取得
Console.WriteLine("平日は、{0}", string.Join(",", data[1..^1])); // 月,火,水,木

// 木,金,土を出力
Console.WriteLine(string.Join(",", data[4..]));
Console.WriteLine(string.Join(",", data[^3..])); // 範囲演算子の前は含む要素、後ろは指定した要素の一つ前まで取得


// 日,月,火を出力
Console.WriteLine(string.Join(",", data[..3]));
Console.WriteLine(string.Join(",", data[..^4])); // 範囲演算子の前は含む要素、後ろは指定した要素の一つ前まで取得
投稿日時: 2025-05-22 12:12:22
更新日時: 2025-05-22 12:26:22

??の左側がnullだったら右側の値を設定するといった場合に使うもの

string user = null;

user = user ?? "サンプル太郎"; // userがnullならサンプル太郎が設定される

Console.WriteLine(user); // サンプル大老

user = user ?? "サンプル次郎"; // userがnullでなければuserの値が設定される

Console.WriteLine(user); // サンプル太郎

これは、C#2.0の機能

user = user ?? "サンプル太郎"; と書くと

??= と書きたくなるもので・・・

それがC#8.0で導入されましたという話

string user = null;

user ??= "サンプル太郎"; // userがnullならサンプル太郎が設定される

Console.WriteLine(user); // サンプル大老

user ??= "サンプル次郎"; // userがnullでなければuserの値が設定される

Console.WriteLine(user); // サンプル太郎
投稿日時: 2025-05-19 12:03:19

最近の投稿

最近のコメント

タグ

アーカイブ

その他