rad*_*ers 15 c# string constructor
我们可以说,
string myString = "Hello";
Run Code Online (Sandbox Code Playgroud)
哪个'神奇'构造一个保存该值的新字符串对象.
为什么不能对我们在代码中定义的类创建的对象使用类似的"无构造"方法?VS为string
s 做的"魔力"是什么?对于enum
s?
我从未见过如何解释它是如何工作的.
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)
C#编译器将其转换为相应的CIL指令:ldstr
.您自己的复杂类型没有等效项,因此编译器必须发出newobj
CIL指令,该指令调用您的类型的构造函数.您建议的语法将隐藏用户的此构造函数调用.
归档时间: |
|
查看次数: |
1172 次 |
最近记录: |