Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中创建一个可以像字符串一样初始化的类?_C#_.net - Fatal编程技术网

如何在C#中创建一个可以像字符串一样初始化的类?

如何在C#中创建一个可以像字符串一样初始化的类?,c#,.net,C#,.net,我希望能够像初始化字符串一样初始化类: string str = "hello"; MyClass class = "hello"; 我真的不知道到底是什么string str=“hello”可以。我假设“hello”被编译器翻译成新的System.String(“hello”)但我不确定。也许这是不可能的,也许我错过了一些非常基本的东西;如果是这样的话,请原谅我的无知:)。我试图创建一个类,它的工作方式与字符串类似,但会自动将字符串存储在文件中 好的,这是我读了你的答案后的代码: class

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

string str = "hello";
MyClass class = "hello";
我真的不知道到底是什么
string str=“hello”可以。我假设
“hello”
被编译器翻译成
新的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);
    }
}

你认为呢?

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

换句话说:你的用户真的应该把你的类看作一个字符串吗?它实际上是字符串的包装器吗?如果你能给我们更多的细节,我们可以提供更多的建议

不,编译器不会将“hello”翻译成
新的System.String(“hello”)
——当然,这只会导致递归问题以及中断interning。IL直接支持C#编译器使用的字符串常量

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

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

这将得到你想要的最终结果。不过,我反对这种做法。隐式转换最终会遇到几个陷阱。最好是有一个构造函数,它接受
字符串

哦,顺便问一下,有没有办法把代码放在一个非代码的句子中(我现在谈论的是这个论坛)(就像我的问题中“我假设”hello“被翻译了…”句子中的代码“hello”一样)颜色是否与我问题中的两行代码一样?“我假设编译器将
“hello”
转换为新的
系统。字符串(“hello”)
”--不,字符串文本以非常低的级别内置到.NET运行时中“hello”
对应于IL中的
ldstr“hello”
指令。因此我们可以说string类具有到ldstr的隐式转换(我假设这是指向包含字符串的memeory块的指针)?我只是想弄明白。想知道一般规则是什么,除非
string str=“somthing”没有一般规则和编译器在这种情况下所做的,它只在这种情况下做。或者是一个静态方法,当然-关于字符串的预期含义,哪一个可以提供更多信息:
FromName
等。这也允许使用具有相同参数但含义不同的多个方法。+1最后的建议是:最好有一个接受字符串的构造函数,但只在语义上有意义时使用它,即。,字符串应该是构造对象所需的重要部分。