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

时间:2016-02-18 09:58:47

标签: c# properties static

我有以下属性:

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;
}

我可以以某种方式使用类似匿名方法的内容,只需在GetPort()属性protected static string Port { get; } =旁边插入代码吗?

1 个答案:

答案 0 :(得分:3)

是的,你可以:

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

        return port;
    }

你可以修改它,在第一次访问时立即调用,只需按照Dennis_E在评论中的建议调用一次:

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

        return port;
    }))();

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

另一种可能性是一个简单的吸气剂:

protected static string Port
{
    get
    {
        // ...

        return port;
    }
}

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

var p = Port();

在简单的getter案例(以及你的版本)中很自然:

var p = Port;