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

従来の書き方だと以下のように書く内容を・・・

public class User
{
    private string FirstName { get; set; }
    private string LastName { get; set; }

    public User(string firstName, string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
    }
}

コンストラクタの引数の情報をクラスのところに移動し
そこに記載している変数を初期化に設定に使えることで短くかけるという話

public class User(string firstName, string lastName)
{
    private string FirstName { get; set; } = firstName;
    private string LastName { get; set; } = lastName;
}

なかなか独特な感じがしますね・・。
複数のコンストラクターがある場合はNGです

投稿日時: 2025-06-24 12:30:24

複数のデータをやりとりする場合、クラスや構造体を使う必要であったけど、

複数のデータを扱うことができるのがタプル型

例えば、二つの整数値から商と余りを求める場合

Math.DivRemを使うと以下のようにかけます

using System;

public class Sample
{
    public static void Main(string[] args)
    {
        var dividend = 10;
        var divisor = 3;

        // Math.DivRem メソッドで商と余りを取得
        var quotient = Math.DivRem(dividend, divisor, out var remainder);
    }
}

これを自作関数でタプルを使って表現すると

public class Sample 
{
    public static void Main(string[] args)
    {
        var dividend = 10;
        var divisor = 3;

        // Math.DivRem メソッドで商と余りを取得
        var (quotient, remainder) = DivRim(dividend, divisor);
    }

    static (int, int) DivRim(int dividend, int divisor)
    {
        var quotient = dividend / divisor;
        var remainder = dividend % divisor;

        return (quotient, remainder);
    }
}

戻り値で、構造体、クラス定義せずに複数の異なる値を返せるのは楽でよいですね

変数宣言して利用する場合は、以下のように記述する

using System;

public class Sample
{
    public static void Main(string[] args)
    {
        // ■タプルのリテラル(Item1, Item2でアクセスできる)
        var data = (10, 3);
        Console.WriteLine($"値1:{data.Item1}, 値2:{data.Item2}");

        // ■タプルの要素に名前をつけることもできる
        var data2 = (a: 10, b: 3);
        Console.WriteLine($"値1:{data2.a}, 値2:{data2.b}");

        // ■型を指定して受ける場合
        (float, float) data3 = (2, 3);
        Console.WriteLine($"値1:{data3.Item1}, 値2:{data3.Item2}");
    }
}

XYZの座標をもつ点の情報を扱うのであれば、今まで構造体やクラスを用意していたものがお手軽に扱えるのはよいですね

using System;

public class Sample
{
    public static void Main(string[] args)
    {
        // 構造体の場合
        var data1 = new XYZ { X=1, Y=2, Z=3};

        // タプルの場合
        var data2 = (x: 1, y: 2, z: 3);
    }

    struct XYZ
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int Z { get; set; }
    }
}
投稿日時: 2025-06-23 14:36:23
更新日時: 2025-06-23 14:59:23

最近の投稿

最近のコメント

タグ

アーカイブ

その他