您的位置:首页 > 其它

关于default在泛型中的使用以及ICloneable接口中MemberwiseClone的浅表副本以及String.empty

2012-07-30 18:14 399 查看
1:在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:

T 是引用类型还是值类型。

如果 T 为值类型,则它是数值还是结构。

给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。以下来自GenericList<T> 类的示例显示了如何使用default
关键字。有关更多信息,请参见泛型概述

但是在实际的使用中发现default不仅仅用于泛型代码里,如下情况的代码也是可以正确编译的:

class Program




{

static void Main(string[] args)


{

int a = default(int);

string b = default(string);

bool c = default(bool);

Program d = default(Program);

Console.ReadLine();

}



}



args {string[0]}



a 0

b null

c false

d null

经过分析不难发现default的另一个作用了,default(类型),初始化该对象的默认值,至于类型是值类型还是引用类型,default会自动选择,同样default在泛型的运用,也是遵循这样一个原则

2:

MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

3:

string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色)

c# string映射为.net Framework的String

如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作

如果使用c#,建议使用string,比较符合规范

string始终代表 System.String(1.x) 或 ::System.String(2.0) ,String只有在前面有using System;的时候并且当前命名空间中没有名为String的类型(class、struct、delegate、enum)的时候才代表System.String

string是关键字,String不是,也就是说string不能作为类、结构、枚举、字段、变量、方法、属性的名称,而String可以

方法测试:

class Program {
static
void Main(string[] args) { String s
= String.Empty;
string t
= string.Empty; } }

生成的IL

C# code
IL_0000:  nop
IL_0001:  ldsfld     string [mscorlib]System.String::Empty
IL_0006:  stloc.0
IL_0007:  ldsfld     string [mscorlib]System.String::Empty
IL_000c:  stloc.1
IL_000d:  ret
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐