0

奇妙なことに遭遇しました。リフレクションを使用してクラスのインスタンスを作成しています。これはいくつかのパラメーターを渡します。1 つは variavle: ipAddress です。コンストラクターでインスタンスを作成すると、変数はフィールドに格納されますが、コンストラクターが完了し、(デバッガーで) クラス内でチェックするインスタンスを作成する行に戻り、フィールド 'ipAddress' が null に変更されました。これはどのように可能ですか?

これはクラスの一部です:

public class moxa_nport_5110
{
    string instanceName;
    Delegate triggerCallBackMethod;

    private BPUConsole bpuConsole { get; set; }

    TcpIpServer server;
    string ipAddress;

    public moxa_nport_5110(Delegate TriggerCallBackMethod, Delegate Callback, params object[] CtorParam)
    {
        #region Initialize
        triggerCallBackMethod = TriggerCallBackMethod;
        instanceName = (string)CtorParam[0];
        string ipAddress = (string)CtorParam[1];
        int Port = (int)CtorParam[2];
        bpuConsole = new BPUConsole(Callback, instanceName);
        #endregion

        server = new TcpIpServer("10.100.184.140", 8888, false);
        server.OnDataReceived += new TcpIpServer.ReceiveEventHandler(server_OnDataReceived);
        server.OnClientConnected += new TcpIpServer.InfoEventHandler(server_OnClientConnected);
        server.OnClientDisconnected += new TcpIpServer.InfoEventHandler(server_OnClientDisconnected);
        server.OnAbnormalConnectionDisconnect += new TcpIpServer.InfoEventHandler(server_OnAbnormalConnectionDisconnect);
        server.AddClient(ipAddress, 1);
    }

    public void SendData(byte[] Data)
    {
        server.SendData(ipAddress, Data);
    }

これは、インスタンスを作成する行です:

driverInterface = Activator.CreateInstance(driverType, tempParam);  //create an instance of the driver

ここに戻ると、フィールド ipAddress の値は null です。

編集:

フィールドは同じ値ですが、アクセスできません:

ここに画像の説明を入力

4

2 に答える 2

6
string ipAddress;

public moxa_nport_5110(Delegate TriggerCallBackMethod, Delegate Callback, params object[] CtorParam)
{
    #region Initialize
    triggerCallBackMethod = TriggerCallBackMethod;
    instanceName = (string)CtorParam[0];
    string ipAddress = (string)CtorParam[1];
}

String はクラスのフィールドであるため、 を使用してその値を設定する必要がありますthis.。フィールドをシャドウする ipAdress と呼ばれる「新しい」文字列を作成しているだけです。this.ipAdress = ...代わりにコンストラクター内で使用します。

于 2013-05-22T12:00:43.570 に答える
3

この場合、同じ名前の2 つのstring ipAddress = (string)CtorParam[1];変数があり、コンテキストのために 2 番目の変数が優先されます:変数を設定しますが、別の変数も作成します - メソッド (ここではコンストラクター) の「存続期間」が続く - 変数とはまったく関係ありません。同じ名前の以前の宣言。

より高いレベルの変数を設定するには、ステートメントから型のプレフィックスを削除します。

ipAddress = (string)CtorParam[1];
于 2013-05-22T12:00:10.193 に答える