一緒にc#の基礎を補う

11456 ワード

1:コンストラクション関数のbase


コンストラクション関数はbaseキーワードを使用してベースクラスのコンストラクション関数を呼び出すことができます.例:
public class Manager : Employee
    {
        public Manager(int annualSalary)
            : base(annualSalary)
        {
            //Add further instructions here.
        }
    }
	 ,  base  , ( )。 :
public Manager(int initialdata)
    {
        //Add further instructions here.
    }

    public Manager(int initialdata)
        : base()
    {
        //Add further instructions here.
}

2:コンストラクション関数のthis


コンストラクション関数は、thisキーを使用して同じオブジェクト内の別のコンストラクション関数を呼び出すことができます.baseと同様に、thisはパラメータなしで使用できます.コンストラクション関数の任意のパラメータはthisのパラメータとして使用できます.または、式の一部として使用できます.

3:staticコンストラクタ


staticキーワードを使用して、コンストラクション関数を静的コンストラクション関数として宣言します.静的クラスメンバーの初期化に使用される静的構造関数は、静的フィールドにアクセスする前に自動的に呼び出されます.new式を使用してクラスのオブジェクトを作成する場合、インスタンスコンストラクション関数を使用してすべてのインスタンスメンバー変数を作成および初期化します.静的クラスまたは非静的クラスの静的変数を初期化するには、静的構造関数を定義する必要があります.最初のインスタンスを作成するか、静的メンバーを参照する前に、静的コンストラクション関数が自動的に呼び出されます.スタティックコンストラクション関数には、•スタティックコンストラクション関数にはアクセス修飾子もパラメータもありません.•最初のインスタンスを作成するか、静的メンバーを参照する前に、クラスを初期化するために静的コンストラクタが自動的に呼び出されます.•静的コンストラクタを直接呼び出すことはできません.•プログラムでは、静的コンストラクタがいつ実行されるかを制御できません.•静的コンストラクタの一般的な用途は、クラスがログ・ファイルを使用する場合、このコンストラクタを使用してログ・ファイルにアイテムを書き込むことです.•静的コンストラクタは、管理されていないコードのパッケージクラスを作成するときにも役立ちます.このコンストラクタは、LoadLibraryメソッドを呼び出すことができます.•静的コンストラクション関数に異常が発生した場合、実行時にコンストラクション関数が再び呼び出されず、プログラムが実行されているアプリケーションドメインの生存期間中、タイプは初期化されません.

4:privateコンストラクション関数


コンストラクション関数をプライベートコンストラクション関数に設定することで、クラスのインスタンス化を阻止できます.プライベートコンストラクション関数は、特殊なインスタンスコンストラクション関数です.通常、静的メンバーのみを含むクラスで使用されます.クラスに共通のコンストラクタがなく、1つ以上のプライベートコンストラクタがある場合、他のクラス(ネストされたクラスを除く)はクラスのインスタンスを作成できません.
•構造内で構造関数を定義できません.クラスに対してのみ構造関数を使用できます.•クラスには1つの構造関数しかありません.•構造関数を継承または再ロードできません.•構造関数を呼び出すことができません.自動的に呼び出されます.•構造関数には修飾子もパラメータもありません.

5:構造関数


次に、クラスCarの構造関数の宣言を示します.
class Car
    {
        ~Car()  // destructor
        {
            // cleanup statements...
        }
    }

この構造関数は、オブジェクトのベースクラスに対して暗黙的にFinalizeを呼び出します.このようにして、前の解析関数コードは、以下のコードに暗黙的に変換される.
protected override void Finalize()
    {
        try
        {
            // Cleanup statements...}
        finally
        {
            base.Finalize();
        }
    }

これは、継承チェーン内のすべてのインスタンスに対してFinalizeメソッド(派生度が最大から派生度が最小)を再帰的に呼び出すことを意味する.空の構造関数は使用しないでください.クラスに構造関数が含まれている場合、Finalizeキューにアイテムが作成されます.構造関数を呼び出すと、キューを処理するためにゴミ回収器が呼び出されます.構造関数が空の場合、不要なパフォーマンス損失のみが発生します.

6:リソースの解放(Disposeメソッドの実装)


構造関数によって実行されるリソースの解放は,ゴミ回収器によって決定される.アプリケーションが高価な外部リソースを使用している場合は、ゴミ回収器でオブジェクトを解放する前に、リソースを明示的に解放する方法もお勧めします.これは、オブジェクトに必要なクリーンアップを実行するIDisposableインタフェースからのDisposeメソッドを実装することによって達成することができる.これにより、アプリケーションのパフォーマンスが大幅に向上します.タイプのDisposeメソッドは、所有するすべてのリソースを解放する必要があります.また、親タイプのDisposeメソッドを呼び出すことで、ベースタイプが所有するすべてのリソースを解放する必要があります.親タイプのDisposeメソッドは、所有するすべてのリソースを解放し、親タイプのDisposeメソッドを呼び出して、ベースタイプ階層全体でこのモードを伝播する必要があります.Disposeメソッドは、常にリソースを正しくクリーンアップするために、例外を起こさずに複数回呼び出すことができるはずです.

7:Disposeメソッドの実装時期


配列などの管理リソースのみを使用するタイプのDisposeメソッドでは、ゴミ回収機によって自動的に回収されるため、パフォーマンスが向上しません.主に本機の資源を使用する管理対象と方向に対して.NET Frameworkで公開されているCOMオブジェクトはDisposeメソッドを使用します.方法はIDisposableインタフェースを実現することである.次のコード例は、管理されていないリソースをカプセル化するクラスのDisposeメソッドを実装するための推奨設計モデルを示しています.リソースクラスは、通常、複雑なネイティブクラスまたはAPIから派生し、対応するカスタマイズが必要です.このコードモードをリソースクラスの作成の開始点として使用し、カプセル化されたリソースに基づいて必要なカスタマイズを提供します.
using System;
using System.IO;

class Program
{

    static void Main()
    {
        try
        {
            // Initialize a Stream resource to pass 
            // to the DisposableResource class.
            Console.Write("Enter filename and its path: ");
            string fileSpec = Console.ReadLine();
            FileStream fs = File.OpenRead(fileSpec);
            DisposableResource TestObj = new DisposableResource(fs);

            // Use the resource.
            TestObj.DoSomethingWithResource();

            // Dispose the resource.
            TestObj.Dispose();

        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine(e.Message);
        }
    }
}


// This class shows how to use a disposable resource.
// The resource is first initialized and passed to
// the constructor, but it could also be
// initialized in the constructor.
// The lifetime of the resource does not 
// exceed the lifetime of this instance.
// This type does not need a finalizer because it does not
// directly create a native resource like a file handle
// or memory in the unmanaged heap.

public class DisposableResource : IDisposable
{

    private Stream _resource;  
    private bool _disposed;

    // The stream passed to the constructor 
    // must be readable and not null.
    public DisposableResource(Stream stream)
    {
        if (stream == null)
            throw new ArgumentNullException("Stream in null.");
        if (!stream.CanRead)
            throw new ArgumentException("Stream must be readable.");

        _resource = stream;

        _disposed = false;
    }

    // Demonstrates using the resource. 
    // It must not be already disposed.
    public void DoSomethingWithResource() {
        if (_disposed)
            throw new ObjectDisposedException("Resource was disposed.");

        // Show the number of bytes.
        int numBytes = (int) _resource.Length;
        Console.WriteLine("Number of bytes: {0}", numBytes.ToString());
    }


    public void Dispose() 
    {
        Dispose(true);

        // Use SupressFinalize in case a subclass
        // of this type implements a finalizer.
        GC.SuppressFinalize(this);      
    }

    protected virtual void Dispose(bool disposing)
    {
        // If you need thread safety, use a lock around these 
        // operations, as well as in your methods that use the resource.
        if (!_disposed)
        {
            if (disposing) {
                if (_resource != null)
                    _resource.Dispose();
                    Console.WriteLine("Object disposed.");
            }

            // Indicate that the instance has been disposed.
            _resource = null;
            _disposed = true;   
        }
    }
}

8:usingの使用


using文は、オブジェクト上のメソッドを呼び出すときに例外が発生しても、Disposeが呼び出されることを保証します.オブジェクトをtryブロックに入れ、finallyブロックのDisposeを呼び出すことで、同じ結果を得ることができます.実際、これがコンパイラがusing文を変換する方法です.

練習:


1:子コンストラクション関数で親コンストラクション関数を呼び出す方法の例
2:public Manager(int initialdata) {//Add further instructions here. }
public Manager(int initialdata) : base() {//Add further instructions here. } この2つの構造関数には違いがありますか?違いがあれば、どこにありますか?
3:public Manager(int initialdata) {//Add further instructions here. }
public Manager(int initialdata) : base(initialdata) {//Add further instructions here. } この2つの構造関数には違いがありますか?違いがあれば、どこにありますか?
4:public Manager(int initialdata) : this() {//Add further instructions here. } このようにthisを使ってもいいですか.もしよろしければ、どういう意味ですか.
5:privateコンストラクション関数を使用する必要がある場合、ヒント:ある設計モード.
6:Disposeメソッドの実装方法.
7:Disposeメソッドを実現するのに何の役にも立たない.ヒント:答えリリースリソースは0点です.
8:usingのいくつかの使い方.