gpt4 book ai didi

c# - 单例对象的实例成员或类的静态成员

转载 作者:行者123 更新时间:2023-11-30 11:25:04 27 4
gpt4 key购买 nike

我正在编写一个监听器类,它随机创建一个 HttpListener未使用的端口并监听它。我试图让它成为单例。然而我是发现很难在收听时保持该单例对象 null到随机 HTTP 端口失败 10 次。

(我已经将端口号和 HttpListener 实例显示为单例成员实例。但是还有很多其他成员我没有展示过简单。)这是我的代码:

class Listener
{
private static Listener listener = null; //singleton instance

//member variables
private HttpListener httpListener = null;
private int port = -1;

static Listener()
{
listener = new Listener();
}

private Listener()
{
try
{
port = //randomly generate
httpListener = new HttpListener();
//start listening
}
catch(Exception ex)
{
//cant listen on randomly chosen port
listener = null;
httpListener = null;
port = -1;
return;
}
}
}

但是在 catch() 中,listener = nulllistener 设置为 null只是一会儿。当默认构造函数返回时,它返回一个新的Listener 的实例,因此静态构造函数中的 listener 总是有分配给它的实例。因此,而不是 listener = null inside default构造函数它应该是 this = null 这是无效的。

因此我将整个代码移到了静态构造函数中。但这迫使我

  • 使实例成员(porthttpListener)static
  • 或者到处使用listener.port , listener.httpListener

    类监听器{ 私有(private)静态监听器监听器 = null;//单例实例

    //member variables
    private HttpListener httpListener = null;
    private int port = -1;

    static Listener()
    {
    listener = new Listener();

    try
    {
    listener.port = //randomly generate
    listener.httpListener = new HttpListener();
    //start listening
    }
    catch(Exception ex)
    {
    //cant listen on randomly chosen port
    listener = null;
    return;
    }
    }

    private Listener()
    {
    }

我不明白

Q1 是否让port & httpListener static? (这个我觉得有点违背OOP原则)或者

Q2 是否将它们保留为实例成员并在所有地方使用listener.? (这是有问题的,因为在我的实际代码中有很多这样的成员和方法,我必须在任何地方附加 listener.)

或者我认为这一切都是错误的,应该采用不同的方法?

最佳答案

直接的问题是实例构造函数在失败时将静态成员监听器设置为 null。但是,控制然后返回到静态构造函数,它将静态成员监听器设置为在实例构造函数中创建的对象。因此,您看到的行为。

我认为您的(实例)构造函数试图做的事情太多了。我会将“开始监听”逻辑移动到一个单独的方法中,并从实例构造函数以外的任何地方调用它。这将使您的错误处理更容易一些,例如

class Listener
{
public static Listener listener = null; //singleton instance

//member variables
private HttpListener httpListener = null;
private int port = -1;

static Listener GetListener()
{
if (listener != null)
{
return listener;
}

try
{
listener = new Listener();
listener.StartListening();
return listener;
}
catch (Exception)
{
//cant listen on randomly chosen port
listener.Cleanup();
listener = null;
throw;
}
}

private Listener()
{
port = RandomlyGenerate();
httpListener = new HttpListener();
}

private void StartListening()
{
//start listening
}

private void Cleanup()
{
httpListener.Close();
httpListener = null;
port = -1;
}
}

关于c# - 单例对象的实例成员或类的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20467988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com