3

解決済み:開発環境の問題。Dev Envを再起動し、すべてOK。

初めて質問するので、間違っていたら教えてください。

C# でインスタンス固有の変数を使用して頭を包み込もうとしています。次のテスト コードは動作するはずですが、エラーがスローされます。

非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です...

クラスの各インスタンスに固有の public var を持ち、その var を関数内 (静的またはそれ以外) に設定できるようにするための正しい方法は何ですか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AlchemyWebSocketsTest2
{
    class KHandler
    {
        public string name = "wut";
        static void KHandlerInstantiate()
        {
            name = "huh";
            Console.WriteLine("All Good.");
        }

    }
}
4

4 に答える 4

6

KHandler のインスタンスが必要です。クラスhandlerのインスタンスであるオブジェクトに注意してください。KHandler

namespace AlchemyWebSocketsTest2
{
   class KHandler
   {
     public string name = "wut";
     static void Main()
     {
        KHandler handler = new KHandler();
        handler.name = "huh";
        Console.WriteLine("All Good.");
     }

  }
}
于 2012-12-06T17:35:42.220 に答える
0

静的関数内の非静的メンバーにアクセスしようとしています。nameとして宣言するとpublic static string name = "wut";、コードはコンパイルされます。静的クラスとメソッドをご覧になることをお勧めします。

于 2012-12-06T17:36:54.287 に答える
0

静的 (型) メソッドで非静的 (インスタンス) メンバーを割り当てようとしています。名前を割り当てるには、KHandler クラスのインスタンスを作成する必要があります

static void Main()
{
     var khandlerInstance = new KHandler();
     khandlerInstance.name = "huh";
     Console.WriteLine("All Good.");
}

アップデート。静的メソッドを使用して各インスタンスに変数を割り当てる必要がある場合は、インスタンスをパラメーターとして渡す必要があります。

class KHandler
{
    string Name;
    public static void ChangeName(KHandler targetInstance, string newName)
    {
        targetInstance.Name = newName;
    }
}
于 2012-12-06T17:37:33.783 に答える
0

わかりました、いくつかのコンストラクタはどうですか?

// a sample base class
class KBase  {
     public readonly int value;  // making it readonly means it can only be assigned to once, and that has to happen during a constructor.
     public KBase ( int startValue ) { value = startValue; }
}

class KHandler : KBase
{
    public readonly string name = "wut";

    // this is a parameterless constructor, whose implementation invokes another constructor ( the one below ) of this class
    public KHandler () : this ( "huh" ) {
    }

    // this is a 1 parameter constructor, whose implementation ensures KBase is properly initialized, and then proceeds to initialize its part of the new instance.
    public KHandler ( string val ) : base ( 3 ) { 
        name = val;
    }
}

class Test {
    static void Main()
    {
        // this next line calls the parameterless constructor I defined above
        KHandler handler = new KHandler();  

        // and this next line calls the 1 parameter constructor
        KHandler handler2 = new KHandler("something else");

        Console.WriteLine("All Good 1"+handler.name);
        Console.WriteLine("All Good 2"+handler2.name);
    }
}

新しいクラスインスタンスが割り当てられて「ゼロ化」された後、少し特別な環境で実行されるコンストラクターの基本的なメカニズムが必要だと思います。特別な環境は、コンパイラ/言語がすべての基本クラスとフィールドが適切に初期化されることを保証し、構築中に読み取り専用メンバー (のみ) に割り当てることができることです。

コンストラクターは、基本クラスのコンストラクターを呼び出して、これらの基本を適切に初期化できます。コンストラクターは、続行する前に同じクラスの別のコンストラクターを呼び出すこともできます。

上記の例のように、クラスごとに複数のコンストラクターを使用できます。コンストラクターを指定しない場合、コンパイラーは空のパラメーターなしのコンストラクターを効果的に挿入します。この動作が望ましくない場合は、(任意のパラメーター リストの) 独自のコンストラクターを追加すると、コンパイラー/言語による空のパラメーターなしのコンストラクターの自動作成がキャンセルされます。(独自のパラメーター化されたコンストラクターを追加し、パラメーターなしのコンストラクターも必要な場合は、自分で追加し直す必要があります。)

最初のコンストラクター (パラメーターなしのコンストラクター) は最初の new KHandler() の結果として呼び出され、2 番目のコンストラクターは 2 番目の new KHandler (文字列) によって呼び出されます。

構築されると、オブジェクトはすぐに使用できると見なされます。とにかく、コンストラクターの一般的な構造を検索すると、より多くの情報が得られます。

于 2012-12-06T17:56:56.697 に答える