この記事は次から転送されます:https : //www.cnblogs.com/yubinfeng/p/4550628.html
C#オブジェクト指向コアに入る前に、修飾子を理解する必要があります実際、変数と定数について説明するときは、修飾子を使用して、変数と定数の修飾子を説明しました。
まず、修飾子は何ですか?
修飾子は、型と型メンバーの宣言を修飾するために使用されます
定義により、機能によってアクセス修飾子と宣言修飾子の2つのカテゴリに分かれていることがわかります。
1.アクセス修飾子(5)
アクセス修飾子 |
解説 |
公衆 |
パブリックアクセス。制限なし。 |
民間 |
プライベートアクセス。アクセスはこのクラスのメンバーに制限されており、サブクラスとインスタンスにはアクセスできません。 |
保護された |
アクセスを保護します。アクセスはこのクラスとサブクラスに制限されており、インスタンスにはアクセスできません。 |
内部 |
内部アクセス。アクセスはこのプロジェクトに限定され、他のプロジェクトにはアクセスできません。 |
保護された内部 |
内部で保護されたアクセス。アクセスはこのプロジェクトまたはサブカテゴリに制限されており、他の人はアクセスできません |
C#メンバー型の変更可能なデフォルトの修飾子は次のとおりです。
会員タイプ |
デフォルトの修飾子 |
変更可能 |
列挙型 |
公衆 |
無し |
クラス |
民間 |
パブリック、保護、内部、プライベート、 |
インターフェース |
公衆 |
無し |
構造 |
民間 |
パブリック、内部、プライベート |
2.宣言修飾子(10)
部分的:同じアセンブリ全体で部分的なクラスと構造を定義する
Static:特定のオブジェクトのメンバーではなく、タイプ自体に属していることを宣言します。
抽象:抽象クラス。他のクラスの基本クラスにしかできません。クラスのメソッドは実装されていないと宣言され、メソッドの実装は彼の派生クラスで行われます。
Sealed:指定されたクラスは継承できません。
Virtual:メソッド、プロパティ、インデクサー、またはイベント宣言を装飾し、これらのオブジェクトを派生クラスでオーバーライドできるようにするために使用されます
オーバーライド:基本クラスから継承されたメンバーの新しい実装を提供します
新規:基本クラスのメンバーから継承されたメンバーを非表示にする修飾子として使用されます。新しい修飾子を使用せずにメンバーを非表示にすることができますが、警告が生成されます。演算子として、オブジェクトの作成とコンストラクターの呼び出しに使用されます。
Extern:外部で実装されたメソッドを宣言するために使用されます。extern修飾子の一般的な用途は、Interopサービスを使用してアンマネージコードを呼び出すときにDllImport機能を使用することです。この場合、メソッドも静的として宣言する必要があります
Readonly:変更されたフィールドで、フィールドが読み取り専用であることを示します。
注:readonlyが参照タイプを変更すると、不適切な操作が原因で、読み取り専用オブジェクトの状態が変更される場合があります。例:読み取り専用リスト<Person> Persons =…;;
一部の場所で変更された可能性があります。persons.add(新しいPerson());
Const:変更されたフィールド。フィールドが読み取り専用であることを示します。また、コンパイル時にこのフィールドの値を明確に認識できる必要があり、その値はプログラムにハードコードされています。この型メンバーを変更した後、変更を有効にするために再コンパイルする必要があります。
また、readonlyは実行時に読み取り専用であり、コンテンツは実行時に決定されるため、readonlyタイプのメンバーを変更した後、再コンパイルせずに有効になります。
読み取り専用ではローカル変数を変更できませんが、constでは変更できます。
重要なポイント:
Virtual、override、newの違い
virtualは親クラスで使用され、メソッドをオーバーライドできることを宣言し、メソッドを静的にすることはできません。
オーバーライド(継承のオーバーライド)はサブクラスで使用され、キーワードvirtual / override / abstractを使用して親クラスで宣言されたメソッドをオーバーライドします。
new(非表示の継承)はサブクラスで使用され、親クラスでの仮想宣言の有無にかかわらずメソッドを変更できます。
親クラスに同じ名前と同じパラメーターのメソッドがある場合、C#はサブクラスの前に新しいキーワードを暗黙的に追加します。
【違い】オーバーライドと新
サブクラスインスタンスを親クラスインスタンスに割り当て、それぞれサブクラスインスタンスと親クラスインスタンスのメソッドを呼び出す場合:オーバーライドで変更されたものはサブクラスメソッドを呼び出し、newで修飾されたものはサブクラスメソッドを呼び出し、親メソッド。
キーワードNewとOverrideは相互に排他的です。同時に使用することはできません。
【違い】バーチャルとアブストラクト
virtual:このメソッドをオーバーライドできることを宣言するために親クラスで使用されます。
抽象:抽象クラスで抽象メソッドを宣言するためにのみ使用できます。関数自体を実装することはできないため(サブクラスでオーバーライドする必要があります)、インスタンス化することはできません。
サブクラスのオーバーライドでオーバーライドできることを除いて、2つの間に他の関係はありません。