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

bob*_*sox 4 c# static-variables lazy-initialization

我有一个带有静态字符串变量的类,它具有一些有点复杂的初始化(我不能将它设置为等于带引号的字符串"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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:有更好的方法吗?我希望在设置所有其他变量时设置值,而不是在值的第一个"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();
}
Run Code Online (Sandbox Code Playgroud)

我知道这可能不是有效的语法,但希望它传达了我正在尝试做的事情.

Jon*_*eet 5

你可以调用一个方法:

private static readonly string _myString = GetMyStringValue();

private static string GetMyStringValue()
{
    MyObject obj = new MyObject();
    obj.someSetupHere();
    return obj.ToString();
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想避免额外声明的方法,你可以使用lambda表达式强制转换为a Func<string>:

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

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

private static readonly string _myString;

static MyClass()
{
    MyObject obj = new MyObject();
    obj.someSetupHere();
    _myString = obj.ToString();
}
Run Code Online (Sandbox Code Playgroud)