C# では、unsafe 修飾子でマークされた関数またはコード ブロック内でポインタ変数を使用できます。アンセーフ コードまたはアンマネージ コードとは、ポインタ変数を使用するコード ブロックのことです。 ポインタ ポインタとは、別の変数のアドレス、つまりメモリ位置の直接アドレスを値として持つ変数です。通常の変数や定数と同様に、ポインタを使用して変数のアドレスを格納する前に、ポインタを宣言する必要があります。 ポインタ宣言の一般的な形式は次のとおりです。 型 *変数名; 有効なポインタ宣言の例: int *ip; // 整数へのポインタ double *dp; // double へのポ
デリゲートは、デリゲートと同じシグネチャを持つあらゆるメソッドを参照するために使用されることを説明しました。つまり、デリゲート オブジェクトを使って、そのデリゲートで参照できるメソッドを呼び出せます。 匿名メソッドは、コード ブロックをデリゲート パラメータとして渡す技法を提供します。匿名メソッドとは、名前を持たず、本体だけを持つメソッドのことです。 匿名メソッドでは戻り値の型を指定する必要はありません。メソッド本体内の return 文から推論されます。 匿名メソッドの記述 匿名メソッドは、デリゲート インスタンスの作成時に delegate キーワードを使って宣言します。例: delega
ジェネリクスを使用すると、クラスやメソッド内でプログラミング要素のデータ型の仕様を、実際にプログラムで使用されるまで遅延定義できます。つまり、ジェネリクスを使えば、あらゆるデータ型で動作するクラスやメソッドを記述できます。 クラスやメソッドの仕様を、データ型のプレースホルダ(型パラメータ)を使って記述します。コンパイラがそのクラスのコンストラクタやメソッドの呼び出しに遭遇すると、特定のデータ型を扱うコードを生成します。シンプルな例で概念を理解しましょう。 ライブ デモ using System; using System.Collections.Generic; namespace Gene
コレクション クラスは、データの格納と取得に特化したクラスです。これらのクラスはスタック、キュー、リスト、ハッシュテーブルをサポートしています。ほとんどのコレクション クラスは共通のインターフェイスを実装しています。 コレクション クラスは、要素への動的なメモリ割り当てや、インデックスによるアイテム リストへのアクセスなど、さまざまな目的に利用されます。これらのクラスは、C# におけるすべてのデータ型の基底クラスである Object クラスのオブジェクト コレクションを作成します。 主要なコレクション クラスと用途 以下は System.Collections 名前空間でよく使用される代表的な
イベントとは、キー入力、クリック、マウス移動などのユーザー アクション、またはシステム生成の通知などの発生を指します。アプリケーションはイベントが発生したときにそれに応答する必要があります。たとえば割り込み処理などがこれに当たります。イベントはプロセス間通信にも使用されます。 デリゲートを用いたイベントの仕組み イベントはクラス内で宣言・発生(raise)され、デリゲートを通じてイベント ハンドラと関連付けられます。この関連付けは同じクラス内でも、別のクラスでも可能です。イベントを含むクラスはイベントを発行するため、パブリッシャー(発行者)クラスと呼ばれます。このイベントを受け取るクラスはサブ
C# のデリゲートは、C や C++ の関数ポインタに似ています。デリゲートはメソッドへの参照を保持する参照型の変数であり、その参照は実行時に変更可能です。 デリゲートは特にイベントやコールバック メソッドの実装に使用されます。すべてのデリゲートは暗黙的に System.Delegate クラスから派生します。 デリゲートの宣言 デリゲートの宣言によって、そのデリゲートが参照できるメソッドのシグネチャが決まります。デリゲートは、自分と同じシグネチャを持つメソッドを参照できます。 たとえば、次のようなデリゲートを考えます。 public delegate int MyDelegate(strin
インデクサーを使用すると、オブジェクトを配列のようにインデックス指定できます。クラスにインデクサーを定義すると、そのクラスは仮想配列のように振る舞います。その後、配列アクセス演算子([ ])を使用して、このクラスのインスタンスにアクセスできます。 構文 1次元インデクサーの構文は以下の通りです。 element-type this[int index] { // getアクセサー. get { // indexで指定された値を返す } // setアクセサー. set { // indexで指定された値を設定 } } インデクサーの使用 インデクサーの振る舞い宣言は、プロパティとある程度似
プロパティは、クラス、構造体、インターフェースの名前付きメンバーです。クラスや構造体のメンバー変数やメソッドはフィールドと呼ばれます。プロパティはフィールドの拡張であり、同じ構文でアクセスされます。アクセサーを通じて、プライベートフィールドの値を読み取り、書き込み、操作します。 プロパティはストレージの場所を命名しません。代わりに、値を読み取り、書き込み、計算するアクセサーを持ちます。 例えば、年齢、名前、コードのプライベートフィールドを持つStudentクラスを考えます。これらのフィールドをクラスの外部スコープから直接アクセスすることはできませんが、これらのプライベートフィールドにアクセスす
リフレクション(Reflection)オブジェクトは、実行時に型情報を取得するために使用されます。実行中のプログラムのメタデータにアクセスするクラスはSystem.Reflection名前空間にあります。 System.Reflection名前空間には、アプリケーションについての情報を取得し、型、値、オブジェクトを動的にアプリケーションに追加するクラスが含まれています。 リフレクションの用途 実行時に属性情報を表示 アセンブリ内のさまざまな型を調べ、それらをインスタンス化 メソッドとプロパティへの遅延バインディング 実行時に新しい型を作成し、それらを使用してタスクを実行 メタデータの表
属性(Attribute)とは、プログラム内のクラス、メソッド、構造体、列挙子、アセンブリなどのさまざまな要素の動作についてランタイムに情報を伝えるための宣言的なタグです。角括弧([ ])で要素の上に配置することで、プログラムに宣言的な情報を追加できます。 属性は、コンパイラへの指示、コメント、説明、メソッド、クラスなどのメタデータをプログラムに追加するために使用されます。.NET Frameworkには2種類の属性があります:定義済み属性とカスタム属性です。 属性の指定構文 [attribute(positional_parameters, name_parameter = value,
ファイルとは、特定の名前とディレクトリパスを持ってディスクに格納されたデータの集合です。ファイルが読み取りまたは書き込みのために開かれると、それはストリームになります。 ストリームは基本的に通信パスを通過するバイトのシーケンスです。主に2種類のストリームがあります:入力ストリームと出力ストリーム。入力ストリームはファイルからデータを読み取るため(読み取り操作)、出力ストリームはファイルに書き込むため(書き込み操作)に使用されます。 C# I/Oクラス System.IO名前空間には、ファイルの作成・削除、ファイルからの読み取り・書き込み、ファイルのクローズなど、ファイルに関する多数の操作を行
例外とは、プログラムの実行中に発生する問題のことです。C#の例外は、プログラム実行中に発生する例外的な状況(ゼロ除算の試みなど)への応答です。 例外は、プログラムのある部分から別の部分へ制御を移す手段を提供します。C#の例外処理は4つのキーワードに基づいて構築されています:try、catch、finally、throw。 try - 特定の例外が有効になるコードブロックを識別。1つ以上のcatchブロックが続く catch - プログラムで問題を処理したい場所で例外ハンドラを使用して例外をキャッチ。catchキーワードは例外の捕捉を示す finally - 例外がスローされるかどうかに関わ
正規表現(Regular Expression)とは、入力テキストに対してマッチングできるパターンのことです。.NET Frameworkには正規表現エンジンが用意されており、このようなマッチングを実行できます。パターンは1つ以上の文字リテラル、演算子、または構成要素で構成されます。 正規表現を定義するための構成要素 正規表現を定義するための文字、演算子、構成要素にはさまざまなカテゴリがあります。 文字エスケープ 文字クラス アンカー グループ化構成要素 量指定子 後方参照構成要素 選択構成要素 置換 その他の構成要素 Regexクラス Regexクラスは正規表現を表現するために使用さ
プリプロセッサディレクティブは、実際のコンパイルが始まる前に情報を前処理するようコンパイラに指示を与えます。 すべてのプリプロセッサディレクティブは#で始まり、1行にプリプロセッサディレクティブのみを記述できます(前には空白のみ可)。プリプロセッサディレクティブはステートメントではないため、セミコロン(;)で終了しません。 C#コンパイラには独立したプリプロセッサはありませんが、あたかもあるかのようにディレクティブが処理されます。C#ではプリプロセッサディレクティブは条件付きコンパイルの補助に使用されます。C/C++のディレクティブとは異なり、マクロの作成には使用されません。 C#のプリプロ
名前空間(namespace)は、1つの名前のセットを別の名前のセットから分離する方法を提供するために設計されています。ある名前空間で宣言されたクラス名は、別の名前空間で宣言された同じクラス名と競合しません。 名前空間の定義 名前空間の定義は、キーワードnamespaceに続けて名前空間名を指定します。 namespace namespace_name { // コード宣言 } 名前空間で修飾された関数や変数を呼び出すには、名前空間名を前置します。 namespace_name.item_name; 名前空間の使用例 using System; namespace FirstSp
インターフェースとは、インターフェースを継承するすべてのクラスが従うべき構文上の契約として定義されます。インターフェースは構文契約の「何(What)」の部分を定義し、派生クラスが「どう(How)」の部分を定義します。 インターフェースはプロパティ、メソッド、イベントを定義し、これらはインターフェースのメンバーとなります。インターフェースにはメンバーの宣言のみが含まれます。メンバーを定義するのは派生クラスの責任です。これにより、派生クラスが従うべき標準的な構造を提供することがよくあります。 抽象クラスも一定程度同じ目的を果たしますが、基底クラスでわずかなメソッドのみを宣言し、派生クラスで機能を実
C#で利用可能なほとんどの組み込み演算子を再定義またはオーバーロードできます。これにより、プログラマーはユーザー定義型でも演算子を使用できるようになります。オーバーロードされた演算子は、演算子を定義する記号にキーワードoperatorを続けた特殊な名前を持つ関数です。通常の関数と同様に、オーバーロード演算子には戻り値の型とパラメータリストがあります。 演算子オーバーロードの基本構文 public static 戻り値の型 operator 演算子記号(パラメータリスト) { // 実装 } 加算演算子(+)のオーバーロード例 public static Box operator+
ポリモーフィズム(多態性)とは「多くの形を持つ」という意味です。オブジェクト指向プログラミングパラダイムでは、「1つのインターフェース、複数の機能」として表現されることが多いです。 ポリモーフィズムは静的または動的に分類されます。静的ポリモーフィズムでは、関数への応答がコンパイル時に決定されます。動的ポリモーフィズムでは、実行時に決定されます。 静的ポリモーフィズム(コンパイル時多態性) コンパイル時に関数とオブジェクトをリンクするメカニズムを早期バインディングまたは静的バインディングと呼びます。C#では静的ポリモーフィズムを実装する2つの技術があります。 関数のオーバーロード(Funct
オブジェクト指向プログラミングにおいて最も重要な概念の1つが継承です。継承により、既存のクラスを用いて新しいクラスを定義できるため、アプリケーションの作成と保守が容易になります。これによりコード機能の再利用が可能になり、実装時間を短縮できます。 クラスを作成する際、完全に新しいデータメンバーとメンバ関数を書く代わりに、既存のクラスのメンバーを継承するように新しいクラスを指定できます。この既存のクラスを基底クラス(base class)、新しいクラスを派生クラス(derived class)と呼びます。 継承の考え方はIS-A関係を実装します。例えば、哺乳類IS A動物、犬IS-A哺乳類、したが
クラスを定義するとき、データ型の青写真(ブループリント)を定義します。これは実際のデータを定義するものではなく、クラス名が何を意味するか、つまりクラスのオブジェクトが何で構成され、そのオブジェクトで何の操作を実行できるかを定義します。オブジェクトはクラスのインスタンスです。クラスを構成するメソッドと変数は、クラスのメンバーと呼ばれます。 クラスの定義 クラス定義はclassキーワードで始まり、クラス名、波括弧で囲まれたクラス本体が続きます。 <access specifier> class class_name { // メンバ変数 <access spec
C言語