0

C#初心者です。私は最近、いくつかの C# コードの出力を尋ねるテストを受けました。正確なコードはありませんが、以下のメモリから再作成しようとしました。このコードは何らかの理由でコンパイルされません (ここで何が起こっているのかについて質問があるだけなので、それほど重要ではありません)。覚えようとして最も苦労した部分は、すべてのクラス フィールドを作成する行でした。

ここに私の質問があります:

  1. 「new class1();」を使用してクラスの新しいインスタンスを作成しています。それをインスタンス化する有効な方法を変数に割り当てずに?
  2. クラスがインスタンス化されるたびに、静的フィールドはどのように処理されますか?
  3. コンストラクターを呼び出してクラス フィールドを作成することはできますか?

    using System;
    using System.Collections.Generic;
    
    namespace CustomFunctionTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                new class1();
                new class1("E");
             }
        }
        public class class1
        {
    
            public static class1 test1 = new class1("A");
            private class1 b = new class1("B");
            public static class1 c = new class1("C");
    
            public class1()
            {
                Console.WriteLine("D");
            }
            public class1(string str)
            {
                Console.WriteLine(str);
            }
    
        }
    }
    
4

2 に答える 2

1

1) 「new class1();」を使用してクラスの新しいインスタンスを作成しています。それをインスタンス化する有効な方法を変数に割り当てずに?

はい。そのコンストラクターは、静的オブジェクトに対して何らかのアクションを実行したり、何らかの方法で保持したりすることさえできます。または、ガベージコレクションが行われる可能性があります。品質コードに適していますか? 通常はありません。

2) クラスがインスタンス化されるたびに、静的フィールドはどのように処理されますか?

静的コンストラクターがある場合、型が初期化され、型が 1 回だけ初期化されるときに、静的コンストラクターの前に静的フィールドが初期化されます。あなたの例では、静的コンストラクターがないため、ランタイムは、静的フィールドがアクセスされるまで初期化を延期します。

3) コンストラクターを呼び出してクラス フィールドを作成することもできますか?

はい。クラスのフィールドは通常、クラスの構築時に初期化されます。

于 2013-04-20T04:39:30.960 に答える
0
  1. はい; 一般に、コンパイラまたは JITTER が、クラス コンストラクターで副作用が発生していないと判断することは、検討するには複雑すぎる問題であるため、最適化することはできません。
  2. インスタンス コンストラクターを実行する前に、型を完全に正常に初期化する必要があります。静的コンストラクターとフィールド初期化子の正確な順序は構成可能であり、DOT NET フレームワークのバージョンによってデフォルトの順序が異なります。
  3. いずれかのコンストラクターが完了すると、クラス オブジェクトの有効なインスタンスが返されます。ただし、これはインスタンスが必ずしも「アクションの準備ができている」ことを意味するわけではありません。たとえば、e-シリアライゼーションは、多くの場合、デフォルト コンストラクターの実行に依存し、続いてデフォルト以外のすべてのプロパティを設定して、真に「すぐに使用できる」インスタンスを作成します。
于 2013-04-20T05:08:04.657 に答える