关于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
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
相关文章推荐
- 通过实现Cloneable接口和覆盖clone()方法实现深度克隆,以及如何通过ByteArrayIOStream实现克隆
- Cloneable和clone的使用,以及深复制与浅复制的区别
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
- java cloneable接口及使用场景
- 关于String.format的使用以及把秒转换为小时,分钟的代码
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
- 使用clone( )和Cloneable接口
- ICloneable接口 Clone 深拷贝 浅拷贝
- Adobe Flex迷你教程 -- 合理使用Module分割项目以及对Module的使用[关于接口]
- HessianCSharp 1.3.3版本前使用泛型以及接口interface继承问题解决方案!!(实例代码)
- 关于Java对象复制(Clone、深度Clone以及序列化与反序列化的使用)
- 五星-原型模式常使用于以下场景--而JAVA中的任何类只要实现了Cloneable标识接口,就可以使用clone方法来进行对象的拷贝
- 一个关于模板字符串的使用技巧,以及 String.raw() 函数
- 关于NSMutableAttributedString 的使用以及介绍
- 结合实例详解clone()函数,Cloneable接口以及深拷贝与浅拷贝的问题
- 结合实例详解clone()函数,Cloneable接口以及深拷贝与浅拷贝的问题
- Cloneable接口使用
- 泛型、函数式接口基础复习以及Lambda表达式、Optional的使用
- MemberwiseClone 关于 string 浅拷贝的一个误解
- Cloneable接口的使用