使用匿名方法初始化静态属性

本文关键字:初始化 静态 属性 方法 | 更新日期: 2023-09-27 18:35:21

>我有以下属性:

protected static string Port { get; } = GetPort();
private static string GetPort()
{
    var tcpListener = new TcpListener(IPAddress.Loopback, 0);
    tcpListener.Start();
    var port = ((IPEndPoint)tcpListener.LocalEndpoint).Port.ToString();
    tcpListener.Stop();
    return port;
}

我可以以某种方式使用匿名方法之类的东西将代码插入属性protected static string Port { get; } =旁边的GetPort()中吗?

使用匿名方法初始化静态属性

是的,你可以:

protected static Func<string> Port { get; } = () =>
    {
        // ...
        return port;
    }

您可以修改它,在首次访问时立即调用,并且只能调用一次,如Dennis_E在评论中建议的那样:

protected static string Port { get; } = ((Func<string>)(() =>
    {
        // ...
        return port;
    }))();

问题是,你为什么要这样?您当前的解决方案要好得多,并且与FxCop(CA1810)兼容,因此我会保持原样。

另一种可能性是一个简单的getter:

protected static string Port
{
    get
    {
        // ...
        return port;
    }
}

请注意,在第一种情况下,用法有点尴尬:

var p = Port();

在简单的 getter 案例(和您的版本)中,这是很自然的:

var p = Port;