C# で型エイリアスを定義する

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. using alias ディレクティブを使用して C# で型エイリアスを定義する
  2. namespace キーワードを使用して C# で型エイリアスを定義する
  3. 継承を使用して C# で型エイリアスを定義する
  4. C#NuGet パッケージを使用して型エイリアスを定義する
C# で型エイリアスを定義する

型エイリアスは、型安全なプログラミングに不可欠な typedefs のようなもので、既存の型と意味的に同一の新しい型を作成します。 C# は組み込みの型エイリアスを提供しません。 ただし、C# ディレクティブ、クラス、および継承を使用して、カスタム型を構成できます。

このチュートリアルでは、C# で型エイリアスを作成および定義する 4つの主な方法を学習します。

型エイリアスを作成するために継承を使用すると、プリミティブ型では機能しないなど、各メソッドには制限があります。 その結果、シールされたクラスから派生することはできず、ほとんどの .NET クラスはシールされています。

using alias ディレクティブを使用して C# で型エイリアスを定義する

using キーワードは、C# または .NET の型エイリアス関連機能の中心です。 エイリアシング プロパティを利用し、コードを柔軟にし、可読性を高める方法をプログラマーに明確にします。

オブジェクトのスコープを自由に定義できるため、非常に効率的です。 これは、ネームスペースのエイリアスを作成する上で重要な部分です。 これにより、プログラマーは static ディレクティブを使用して単一のクラスのメンバーをインポートしたり、他の名前空間から特定の型をインポートしたりすることができます。

最も重要なことは、型エイリアスが名前空間全体のインポートを回避することであいまいさを解決し、複数の型を簡単に操作できるようにすることです。 さらに、using alias を使用すると、C# プロジェクト全体で機能するグローバル エイリアスを作成できます。 パラメーターの型を渡すと、ジェネリック型のエイリアスを作成できます (例: using type_alias = System.IO.StreamWriter)。型のジェネリック エイリアスの場合:

using type_generic = System.Nullable<System.Int32>

コード例:

using System;
using System.Windows.Forms;

using stream_writer = System.IO.StreamWriter;  // custom type

namespace type_alias {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      string[] type_data = { "Name: Widow's Sorrow", "Assignment: APK-1229-C", "Success Ratio: 78%",
                             "Charisma: 11%", "Style: Professional" };

      using (stream_writer type_alias = new stream_writer(@"C:\Temp\MyFile.txt")) {
        foreach (string line in type_data) {
          type_alias.WriteLine(line);
          // for compile purposes; MessageBox.Show(line);
        }
        MessageBox.Show("Process completed!");
      }
    }
  }
}

出力:

Name: Widow's Sorrow
Assignment: APK-1229-C
Success Ratio: 78%
Charisma: 11%
Style: Professional

C# 型エイリアス - エイリアス ディレクティブの使用

typedef を使用して型エイリアスを作成する方法もありますが、プロセスが非常に複雑になります。 単純化するには、Curiously Recurring Template パターンを使用する必要があります。

ラムダ構文typedef などの複雑で状況に応じたメソッドを無視して、Visual Studio で GenericHandler EventHandler<EventData> または gcInt.MyEvent += を使用してデリゲート型を定義できます。 IntelliSense イベント処理シグネチャ。

// you can define a type alias for specific types as follows:

using stream_writer = System.IO.StreamWriter                    // create stream writer object
                      using file_stream = System.IO.FileStream  // create file stream object

                                          // you can define generic alias for a type as follows:

                                          using alias_int = System.Nullable<System.Int32>;
using alias_double = System.Nullable<System.Double>;

C# では、using Console = System.Console; などの短い名前を導入する方法が提供されています。 これらのショートカットには独自の ID がなく、エイリアスと呼ぶことができるため、既存のタイプを別の名前にすることができます。

エイリアスは新しい型を導入しません。そのため、デバッガーで元の名前で装飾されたシンボルが表示されます。これは混乱を招く可能性がありますが、適切で効率的です。

using ディレクティブは typedef と完全に同等です。 ただし、型を開いたままにしておくと非常に有害であるため、操作が成功した後にジェネリック型を閉じるエイリアスを作成することが重要です。 using NullableThing<T> = System.Nullable<T>; などを試みる前に、using ディレクティブ内で型パラメーターを解決することが重要です。

namespace キーワードを使用して C# で型エイリアスを定義する

名前空間はクラスを使用するため、型エイリアスを定義するのに最適な方法です。 タイプまたは名前空間エイリアスは、using Project = style.custom.myproject; のように、using alias ディレクティブと呼ばれます。

名前空間はユーザー定義またはシステム定義にすることができ、using ディレクティブでは、指定した名前空間にネストされた名前空間へのアクセスは許可されません。 名前空間は、using example = Innerclass; のように public で型エイリアスを定義することにより、クラスのプライベート メンバーを簡単に使用できるようにします。 Outerclass::example inner; のようにアウトラインを宣言します。

コード例:

using System;
using System.Windows.Forms;

using class_alias = type_newClass.custom_class;
using typealias_using = namespace_alias.custom_class<int>;

namespace type_newClass {
  public class custom_class {
    public override string ToString() {
      return "You are in type_newClass.custom_class.";
    }
  }

}

namespace namespace_alias {
  class custom_class<T> {
    public override string ToString() {
      return "You are in namespace_alias.custom_class.";
    }
  }
}

namespace type_alias {
  using type_newClass;    // use directive for namespace `type_newClass`
  using namespace_alias;  // use the directive for namespace `namespace_alias`
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      class_alias inst_typealias_one = new class_alias();
      MessageBox.Show(inst_typealias_one.ToString());

      typealias_using inst_typealias_two = new typealias_using();
      MessageBox.Show(inst_typealias_two.ToString());
    }
  }
}

出力:

You are in type_newClass.custom_class.

C# 型エイリアス - 名前空間キーワード

継承を使用して C# で型エイリアスを定義する

継承の使用も同様の概念です。たとえば、class ComplexList : List<Tuple<int, string, int>> {}namespace エイリアシングは、衝突のない C# コードを実現する方法です。 継承は、別の型のインスタンスである新しい型を作成するためのオプションです。

継承は、サブクラスの機能を使用する利点がありますが、それ以外の場合は、オーバーヘッド、間接性、速度、および信頼性の低下が追加されます。 継承はエイリアシングではありませんが、いくつかの条件付きのケースでは同様の結果が得られます。

名前のエイリアシング アプローチでは、あらゆる場所で再定義を余儀なくされる可能性があり、その結果、コードが読みにくくなります。 次のような機能を基本クラスに追加する場合は、継承の方が適しています。

public class SoldierList : System.Collections.Generic.List<Soldier> {...}

さらに、IEnumerable からの継承により、クラスを列挙可能な操作で使用できるようになり、すべてのクラスの動作を完全に定義できます。

コード例:

using System;
using System.Windows.Forms;
using System.Collections.Generic;

namespace type_alias {
  // a simple approach
  class ComplexList : List<Tuple<int, string, int>> {}

  // more complex approach - enhances its usability
  public class Person {
    public string Name { get; set; }
    public int Age { get; set; }
    public int FavoriteNumber { get; set; }

    public Person() {}

    public Person(string name, int age, int favoriteNumber) {
      this.Name = name;
      this.Age = age;
      this.FavoriteNumber = favoriteNumber;
    }
  }

  public class PersonList : List<Person> {}  // most-refined

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      var complexList = new ComplexList();  // for first approach
      var personList = new PersonList();    // for second approach

      /*
       type your code or program something based on the
       new types you created
       */

      MessageBox.Show(
          "Some function is performed successfully by creating a type alias using inheritance!",
          "Type Alias", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
    }
  }
}

出力:

Some function is performed successfully by creating a type alias using inheritance!

C# 型エイリアス - 継承

C#NuGet パッケージを使用して型エイリアスを定義する

型エイリアスは、単一のソース コード ファイルまたは名前空間ブロックに限定されません。一般に、グローバルおよびクラス メンバーとしてヘッダー ファイルで宣言できるためです。 型の冗長性を避けるために、特に HashMap<TKey, TValue> などの汎用コードを使用する場合は、関数で簡潔な名前を宣言できます。

これらのエイリアスは、一度作成してプロジェクト全体で共有することができ、そのテンプレートはさらに拡張され、具象型に解決されないエイリアスを作成できます。

NuGet パッケージを使用してエイリアスを型付けすると、多くのコードの重複を防ぎ、非常に一般的な HashMap<TKey, TValue> と非常に具体的な LocationMap の間に存在する map などの中間ステップに名前を付けることができます。

LikeType は、GenericClass<int> の動作をオープン ソース ライブラリとして提供し、C# の型エイリアスに利用できる NuGet パッケージを提供します。 最も重要なことは、Kleinware.LikeType 3.00NuGet パッケージを Visual Studio の C# プロジェクトに追加することを忘れないことです。 このパッケージに属し、C# プロジェクトに一種の typedef 機能を提供します。

コード例:

// install `Kleinware.LikeType 3.00` NuGet Package before the program's execution

using System;
using System.Windows.Forms;
using System.Collections.Generic;

using Kleinware.LikeType;  // belongs to the `Kleinware.LikeType 3.00`

namespace type_alias {
  // type_alias creation
  public class SomeInt : LikeType<int>  // inherits the integer properties
  {
    public SomeInt(int value) : base(value) {}  // represents the base value
  }

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      /*
       some example C# code that benefits from `Kleinware.LikeType 3.00`
       */
      MessageBox.Show("Successful! Requires self-obervation.", "Type Alias",
                      MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
    }
  }
}

出力:

Successful! Requires self-observation.

C# 型エイリアス - NuGet パッケージ

このチュートリアルでは、C# でエイリアシングを最適化するさまざまな方法について説明しました。 これらのアプローチを使用して、より堅牢でクリーンな C# アプリケーションを構築できます。

型エイリアスのコア ユース ケースと、それがアプリケーションにどのように役立つかを示す 4つの技術的な例から、多くのことを学ぶことができます。

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub