4

我有一个简单的问题,想看看在制作自己的课程时最佳做法是什么。

假设这个类有一个在构造函数中初始化的私有成员,然后我是否必须检查这个私有成员在另一个公共的非静态方法中是否为空?或者假设变量不会为空,因此不必添加该检查是否可以保存?

例如,像下面这样,检查 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

您已将该属性公开,因此任何使用此类的代码都可以将引用设置为 null,从而导致对其进行的任何操作都会引发 NullReferenceException。

如果您希望您班级的用户能够忍受(这是可以辩护的):不,您不必检查 null。

您也可以将属性设为 like public TcpClient tcpSocket { get; private set; },因此外部代码无法将其设置为 null。如果你没有tcpSocket你的类中设置为 null ,它永远不会为 null,因为构造函数总是会被调用。

于 2012-08-23T14:14:57.583 回答
2

我不明白为什么你在ctor中打开一个连接然后有公共方法来关闭它。如果您要在 ctor 中创建连接,那么这通常意味着它是您在课程生命周期中想要的连接。

如果您询问如何确保在释放类时关闭连接,请实现 IDisposable。

IDisposable 接口

由于它是私有的,它不应该为空,但您应该检查是否已连接。

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

通常,如果您可以确保字段不为 null ,则它是安全的。你可以称它为类不变量。但是,在您的代码中,tcpSocket它不是私有的,因此任何人都可以将其值设置为null.

我建议您使用私有设置器将该字段设为属性(除非您可以将其设为完全私有)。这可以确保没有外部(即无法控制!)代码修改引用。这反过来又使你能够保证tcpSocket不是null

于 2012-08-23T14:20:29.070 回答