4

独自のクラスを作成する際のベスト プラクティスを確認するための簡単な質問があります。

このクラスに、コンストラクターで初期化されるプライベート メンバーが 1 つあるとします。次に、このプライベート メンバーが別の非静的メソッドで null かどうかを確認する必要がありますか? それとも、変数がnullにならないため、そのチェックを追加する必要がないと仮定するのは保存されていますか?

例えば以下のように、null のチェックは絶対に必要です。

// Provides Client connections.
public TcpClient tcpSocket;

/// <summary>
/// Creates a telnet connection to the host and port provided.
/// </summary>
/// <param name="Hostname">The host to connect to. Generally, Localhost to connect to the Network API on the server itself.</param>
/// <param name="Port">Generally 23, for Telnet Connections.</param>
public TelnetConnection(string Hostname, int Port)
{
        tcpSocket = new TcpClient(Hostname, Port);
}

/// <summary>
/// Closes the socket and disposes of the TcpClient.
/// </summary>
public void CloseSocket()
{
    if (tcpSocket != null)
    {
        tcpSocket.Close();
    }  
}

だから、私はあなたのすべての答えに基づいていくつかの変更を加えました。

private readonly TcpClient tcpSocket;

public TcpClient TcpSocket
{
    get { return tcpSocket; }
}

int TimeOutMs = 100;

/// <summary>
/// Creates a telnet connection to the host and port provided.
/// </summary>
/// <param name="Hostname">The host to connect to. Generally, Localhost to connect to the Network API on the server itself.</param>
/// <param name="Port">TODO Generally 23, for Telnet Connections.</param>
public TelnetConnection(string Hostname, int Port)
{
        tcpSocket = new TcpClient(Hostname, Port);
}

/// <summary>
/// Closes the socket and disposes of the TcpClient.
/// </summary>
public void CloseSocket()
{
    if (tcpSocket != null)
    {
        tcpSocket.Close();
    }  
}

ありがとう。

4

3 に答える 3

6

プロパティを public にしたので、このクラスを使用するすべてのコードで参照を null に設定でき、それに対するすべての操作で NullReferenceException がスローされます。

クラスのユーザーにそれを受け入れてもらいたい場合 (これは防御可能です): いいえ、null をチェックする必要はありません。

プロパティを のようpublic TcpClient tcpSocket { get; private set; }にすることもできるので、外部コードはそれを null に設定できません。クラス内tcpSocketでを nullに設定しない場合 、コンストラクターが常に呼び出されるため、null になることはありません。

于 2012-08-23T14:14:57.583 に答える
2

ctorで接続を開いてから、パブリックメソッドを使用して接続を閉じる理由がわかりません。ctorで接続を作成している場合、それは通常、クラスの存続期間中に必要な接続であることを意味します。

クラスが破棄されたときに接続が閉じていることを確認する方法を尋ねている場合は、IDisposableを実装します。

IDisposableインターフェース

プライベートなので、nullにすることはできませんが、接続されているかどうかを確認する必要があります。

   if (tcpSocket.Connected)
   {
       tcpSocket.Close();
   }
于 2012-08-23T14:44:03.550 に答える
1

一般に、フィールドが null でないことを確認できれば安全です。それをクラス不変条件と呼ぶことができます。ただし、コードでtcpSocketは はプライベートではないため、誰でもその値を に設定できますnull

フィールドをプライベート セッターを持つプロパティにすることをお勧めします (完全にプライベートにできる場合を除きます)。これにより、外部 (つまり、制御不能!) コードが参照を変更しないことが保証されます。tcpSocketこれにより、 ではないことを保証できますnull

于 2012-08-23T14:20:29.070 に答える