字符串构造函数

rad*_*ers 15 c# string constructor

我们可以说,

string myString = "Hello";
Run Code Online (Sandbox Code Playgroud)

哪个'神奇'构造一个保存该值的新字符串对象.

为什么不能对我们在代码中定义的类创建的对象使用类似的"无构造"方法?VS为strings 做的"魔力"是什么?对于enums?

我从未见过如何解释它是如何工作的.

Jon*_*eet 25

基本上,它是C#语言规范的一部分:字符串文字,数字文字,字符文字和布尔文字的语法,但这就是全部.

编译器使用这些文字生成IL,对于大多数文件,有一个适合"特定类型的常量"的指令,因此它直接表示.一个例外是decimal,就CLR而言,它不是原始类型,因此必须得到额外的支持.(例如,这就是decimal在应用属性时无法指定参数的原因.)

查看所发生情况的最简单方法是使用ildasm(或类似工具)查看为任何特定位源代码生成的IL.

在创建自己的类方面 - 您可以提供从string(或其他)到您自己的类型的隐式转换,但这不会产生完全相同的效果.您可以编写以下源代码:

MyType x = "hello";
Run Code Online (Sandbox Code Playgroud)

...但这不会是类型的"常量" MyType...它只是一个初始化器,碰巧使用了隐式转换.


小智 7

实际上,您可以为自定义类执行此操作.它是通过从其他类型定义您自己的隐式转换来实现的.它在msdn中得到了很好的报道:http://msdn.microsoft.com/en-us/library/aa288476%28v=vs.71%29.aspx

这是为字符串修改的示例:

class Email
{
    private string user;
    private string domain;

    public Email(string user, string domain)
    {
        this.user = user;
        this.domain = domain;
    }

    static public implicit operator Email(string value) // magic goes here ;)
    {
        var parts = value.Split('@');
        if (parts.Length != 2)
            return null;

        return new Email(parts[0], parts[1]);
    }

    static public implicit operator string(Email value)
    {
        return "{ User = " + value.user + ", Domain = " + value.domain + " }";
    }
}

class Test
{
    static public void Main()
    {
        Email test = "alice@test.com"

        System.Console.WriteLine("Test: " + test);
    }
}
Run Code Online (Sandbox Code Playgroud)


jak*_*sch 5

C#编译器将其转换为相应的CIL指令:ldstr.您自己的复杂类型没有等效项,因此编译器必须发出newobjCIL指令,该指令调用您的类型的构造函数.您建议的语法将隐藏用户的此构造函数调用.