如何在C#中创建一个类,使其可以像字符串一样进行初始化?

7

我希望能够像初始化字符串一样初始化一个类:

string str = "hello";
MyClass class = "hello";

我不太清楚string str = "hello";具体是做什么的。我猜想编译器会将"hello"转换为new System.String("hello");,但我不确定。也许这是不可能的,或者我可能遗漏了某些非常基本的东西;如果是这样,请原谅我的无知 : )。我试图创建一个类,它可以像字符串一样工作,但会自动将字符串存储在文件中。

好的,在阅读您的答案后,这是我的代码:

class StringOnFile
{
    private static string Extension = ".htm";
    private string _FullPath;
    public bool Preserve = false;

    public string FullPath
    {
        get
        {
            return _FullPath;
        }
    }

    public static implicit operator StringOnFile(string value)
    {
        StringOnFile This = new StringOnFile();
        int path = 0;

        do{
            path++;
            This._FullPath = Path.GetFullPath(path.ToString() + Extension);
        } 
        while(File.Exists(This._FullPath));

        using (StreamWriter sw = File.CreateText(This._FullPath))
        {
            sw.Write(value);
        }

        return This;
    }

    public static implicit operator string(StringOnFile stringOnFile)
    {
        using (StreamReader sr = File.OpenText(stringOnFile._FullPath))
        {
            return sr.ReadToEnd();
        }
    }

    ~StringOnFile()
    {
        if(!Preserve) File.Delete(FullPath);
    }
}

你认为呢?


哦,顺便问一下,在非代码句子中(我现在说的是这个论坛),有没有办法让代码(比如我的问题中句子“I assume "hello" gets translated...”中的代码“hello”)像我问题中的两行代码一样有颜色? - Juan
不是的,字符串字面量在.NET运行时中被构建为非常底层的部分。在C#中的"hello"对应于IL中的ldstr "hello"指令。 - Tim Robinson
那么我们可以说字符串类具有到ldstr的隐式转换(我假设这是指向包含字符串的内存块的指针)?我只是试图理解这个。想找出通用规则,除非对于string str = "something";没有通用规则,编译器在这种情况下只会为该情况执行它。 - Juan
3个回答

8

请尝试以下操作:

class MyClass {
    public static implicit operator MyClass(string value) {
        // Custom logic here 
        return new MyClass();
    }
}

void Example() {
  MyClass v1 = "data";
}

这将得到您所需的最终结果。然而,我建议不要采用这种方法。有几个隐式转换的陷阱最终会遇到。更好的方法是只有一个构造函数,它需要string参数。

4
当然,也可以使用静态方法,这可能更能说明字符串的预期含义,例如 FromName 等。这样还可以允许有多个具有相同参数但不同含义的方法。 - Jon Skeet
最后的建议是:最好和更清晰的方式是拥有一个接受字符串参数的构造函数,但只在语义上有意义时使用它,即该字符串应该是构造对象所必需的重要部分。 - Abel

5

可以创建一个从字符串到你的类型的隐式转换...但我个人很少这样做。一个例子是来自于LINQ to XML的XNamespace类。你的类真的只有一个字符串成员吗?如果是这样,也许它是合适的。或者它可能只有一个字符串和一些通常可以默认值的其他字段...但在大多数情况下,我不认为从string进行转换是合适的。

换句话说:你的用户真的应该将你的类视为完全相同于一个字符串吗?它是否有效地包装了一个字符串?如果你能给我们更多细节,我们可以给出更多建议。

不,编译器不会将"hello"转换为new System.String("hello") - 这当然会导致递归问题,也会破坏内部化。 IL直接支持字符串常量,C#编译器使用它。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接