在 C# 中具有复杂初始化的静态字符串变量

本文关键字:静态 字符串 变量 初始化 复杂 | 更新日期: 2023-09-27 17:56:44

我有一个带有静态字符串变量的类,该变量具有一些复杂的初始化(我不能像"whatever"那样将其设置为带引号的字符串)。我需要运行几行代码来实际创建值。设置后,其值不会更改。它当前设置为仅在第一次调用 get 时设置的属性。

class MyClass
{
    private static string _myString = "";
    public static string MyString
    {
        get
        {
            if(_myString == "")
            {
                // use an object "obj" here to create the value
                MyObject obj = new MyObject();
                obj.someSetupHere();
                _myString = obj.ToString();
            }
            return _myString;
        }
    }
}

我的问题是:有没有更好的方法可以做到这一点?我宁愿在设置所有其他变量时设置值,而不是在值的第一个"get"上设置值。我应该在这里使用Lazy<T>吗?我真的很想要这样的东西:

private static string _myString = 
{
        // use an object "obj" here to create the value
        MyObject obj = new MyObject();
        obj.someSetupHere();
        _myString = obj.ToString();
}

我知道这可能不是有效的语法,但希望它传达了我想要做的事情。

在 C# 中具有复杂初始化的静态字符串变量

你可以调用一个方法:

private static readonly string _myString = GetMyStringValue();
private static string GetMyStringValue()
{
    MyObject obj = new MyObject();
    obj.someSetupHere();
    return obj.ToString();
}

如果您真的想避免额外的声明方法,您可以使用 lambda 表达式转换为Func<string>来完成所有这些操作:

private static readonly string _myString = ((Func<string>) () =>
{
    MyObject obj = new MyObject();
    obj.someSetupHere();
    return obj.ToString();
}).Invoke();

或者使用静态构造函数初始化字符串:

private static readonly string _myString;
static MyClass()
{
    MyObject obj = new MyObject();
    obj.someSetupHere();
    _myString = obj.ToString();
}