1. インターフェースとは何ですか? 特徴? コードを実装しますか?
インターフェイスは、interface キーワードを使用して定義され、クラス メンバーの組み合わせと、いくつかの関数を説明する一連の仕様で構成されます。 C# でわかるように、システムの一部のインターフェイスには、IComparable (型比較方法)、ICloneable (クローン作成のサポート)、IDisposable (リソースの解放) などの名前が付けられています。I はインターフェイスを表し、able はインターフェイスの特性を反映します。インターフェイス: 「Can...」は、この仕様セットで何ができるかを示します。
(1)、インターフェイス実装
public interface IPrintAble { void PrintString(); void PrintInt(); void PrintBool(); } public interface IComputeAble { void HandlerString(); void HandlerInt(); void HandlerBool(); } public class MyInplementInterface : IPrintAble, IComputeAble { //隐式实现 public void PrintString() { Console.WriteLine(@"1"); } public void PrintInt() { Console.WriteLine(1); } public void PrintBool() { Console.WriteLine(true); } public void HandlerString() { Console.WriteLine(@"1" + "1"); } public void HandlerInt() { Console.WriteLine(1 + 1); } public void HandlerBool() { Console.WriteLine(true || false); } //显示实现 //void IComputeAble.HandlerString() //{ // throw new NotImplementedException(); //} //void IComputeAble.HandlerInt() //{ // throw new NotImplementedException(); //} //void IComputeAble.HandlerBool() //{ // throw new NotImplementedException(); //} } class Program { static void Main(string[] args) { MyInplementInterface imple = new MyInplementInterface(); imple.PrintString(); imple.PrintInt(); imple.PrintBool(); imple.HandlerString(); imple.HandlerInt(); imple.HandlerBool(); Console.ReadLine(); } }
結果:
(2) 専用インターフェイス、つまり C# で定義されたインターフェイスを実装します
例:
public class ImplementSysInterface : IComparable { public int CompareTo(object obj) { //可以根据需要实现自己的比较方法 return 0; } private void UsingMenthod() { //报错,因为NoIDisposeableClass没有实现IDisposable接口,所以不支持using //using (NoIDisposeableClass my = new NoIDisposeableClass()) //{ //} //实现IDisposable接口后,可以使用using using (IDisposeableClass my = new IDisposeableClass()) { } } } public class NoIDisposeableClass { } public class IDisposeableClass : IDisposable { #region IDisposable 成员 public void Dispose() { } #endregion }
インターフェイスには次の特性があります:
a。インターフェイスは抽象基本クラスに似ており、インターフェイスは直接インスタンス化できません。インターフェイス内のメソッドはすべて抽象メソッドであり、インターフェイスを実装する非抽象型はインターフェイスのすべてのメンバーを実装する必要があります。インターフェイスの一部が明示的に実装されている場合、実装されたメンバーはクラス インスタンスを介して渡すことはできません。アクセスにはインターフェイス インスタンスを介してのみアクセスできます。
例:
public class MyInplementInterface2 : IComputeAble { void IComputeAble.HandlerString() { Console.WriteLine(@"1" + "1"); } void IComputeAble.HandlerInt() { Console.WriteLine(true || false); } void IComputeAble.HandlerBool() { Console.WriteLine(true || false); } } class Program { static void Main(string[] args) { IComputeAble imple2 = new MyInplementInterface2(); imple2.HandlerString(); Console.ReadLine(); } }c. インターフェイスのメンバーが暗黙的に実装されている場合、実装されたメンバーにはクラス インスタンスまたはインターフェイス インスタンスを通じてアクセスできますが、実装されたメンバーはパブリックである必要があります。
d. インターフェイスには、定数、フィールド、演算子、インスタンス コンストラクター、デストラクター、または型を含めることはできず、静的メンバーを含めることもできません。
e. インターフェイスのメンバーは自動的にパブリックになり、アクセス修飾子を含めることはできません。
f. インターフェイス自体は複数のインターフェイスから継承でき、クラスと構造体は複数のインターフェイスから継承できますが、インターフェイスはクラスから継承できません。
2. ジェネリックとは何ですか? ジェネリック医薬品のメリットは何ですか?
いわゆるジェネリックは、型パラメーターの概念を .NET に導入し、パラメーター化された型を通じて同じコード上で複数のデータ型の操作を実現します。これは参照型であり、ヒープ オブジェクトです。 実際、私は Java を勉強していたときに初めてジェネリックについて学びました。当時はジェネリックは不要で、オブジェクトで実行できるといつも思っていました。たとえば、次のように、型の値を出力したいと考えた場合、オブジェクトが実装されます:
public class Test { private object model; public object Model { get { return model; } set { model = value; } } public Test(object model) { this.Model = model; } public void ShowRecord() { Console.WriteLine(model); } } class Program { static void Main(string[] args) { int recordI = 2; bool recordB = true; Test testI = new Test(recordI); testI.ShowRecord(); Test testB = new Test(recordB); testB.ShowRecord(); Console.ReadLine(); } }しかし、さらに詳しく学ぶと、まだ特定の問題があることがわかります。まず、ボックス化の問題があります。Int は値型です。オブジェクト型に値を割り当てる場合、ボックス化操作を完了する必要があります。クレートとは何ですか?これは、recordI 値を新しいオブジェクトによって割り当てられたスペースにコピーすることです。時間とパフォーマンスの無駄。したがって、ジェネリックにはまだ役割があるため、ジェネリックを使用して実装します:
public class TestGeneric<T> { private T model; public T Model { get { return model; } set { model = value; } } public TestGeneric(T model) { this.Model = model; } public void ShowRecord() { Console.WriteLine(model); } } class Program { static void Main(string[] args) { int recordI = 2; bool recordB = true; TestGeneric<int> testGI = new TestGeneric<int>(recordI); testGI.ShowRecord(); TestGeneric<bool> testGB = new TestGeneric<bool>(recordB); testGB.ShowRecord(); Console.ReadLine(); } }このように、TestGenericbd43222e33876353aff11e13a7dc75f6 testGI = new TestGenericbd43222e33876353aff11e13a7dc75f6(recordI) の場合、T は int なので、ボックス化する必要はありません。
もちろん、ジェネリックはボックス化の問題を解決するだけではなく、次のような機能的特徴があります: a. ボックス化とボックス化解除を回避し、パフォーマンスを向上させます
b. コンパイルされるため、型の安全性が向上します。
d. 独自の汎用インターフェイス、汎用クラス、汎用メソッド、汎用イベント、および汎用デリゲートを作成できます。
上記は C# の基礎知識をまとめたものです: C# のクラスと構造体 (4) さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。