系列文章导航:
[你必须知道的.NET] 开篇有益
[你必须知道的.NET] 第一回:恩怨情仇:is和as
[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类
[你必须知道的.NET] 第三回:历史纠葛:特性和属性
[你必须知道的.NET] 第四回:后来居上:class和struct
[你必须知道的.NET] 第五回:深入浅出关键字---把new说透
[你必须知道的.NET] 第六回:深入浅出关键字---base和this
[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始
[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理
[你必须知道的.NET] 第九回:品味类型---值类型与引用类型(中)-规则无边
[你必须知道的.NET] 第十回:品味类型---值类型与引用类型(下)-应用征途
[你必须知道的.NET] 第十一回:参数之惑---传递的艺术(上)
[你必须知道的.NET] 第十二回:参数之惑---传递的艺术(下)
[你必须知道的.NET] 第十三回:从Hello, world开始认识IL
[你必须知道的.NET] 第十四回:认识IL代码---从开始到现在
[你必须知道的.NET] 第十五回:继承本质论
[你必须知道的.NET] 第十六回:深入浅出关键字---using全接触
[你必须知道的.NET] 第十七回:貌合神离:覆写和重载
[你必须知道的.NET] 第十八回:对象创建始末(上)
[你必须知道的.NET] 第十九回:对象创建始末(下)
[你必须知道的.NET]第二十回:学习方法论
[你必须知道的.NET]第二十一回:认识全面的null
[你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考
[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
2.3 参数传递
• 代码演示
参数传递
// 04 ref和out
public class RefAndOut
{
public static void Main()
{
//必须进行初始化,才能使用ref方式传递
int x = 10;
ValueWithRef(ref x);
Console.WriteLine(x);
//使用out方式传递,不必初始化
int y;
ValueWithOut(out y);
Console.WriteLine(y);
object oRef = new object();
RefWithRef(ref oRef);
Console.WriteLine(oRef.ToString());
object owith;
RefWithOut(out owith);
Console.WriteLine(owith.ToString());
}
static void ValueWithRef(ref int i)
{
i = 100;
Console.WriteLine(i.ToString());
}
static void ValueWithOut(out int i)
{
i = 200;
Console.WriteLine(i.ToString());
}
static void RefWithRef(ref object o)
{
o = new MyStruct();
Console.WriteLine(o.ToString());
}
static void RefWithOut(out object o)
{
o = new String('a', 10);
Console.WriteLine(o.ToString());
}
}
不必多说,就是一个简要阐释,对于参数的传递作者将计划以更多的笔墨来在后面的系列中做以澄清和深入。
2.4 类型转换
类型转换的演示,包括很多个方面,在此我们只以自定义类型转换为例来做以说明,更详细的类型转换可以参考[第九回:品味类型---值类型与引用类型(中)-规则无边]的[再论类型转换部分]。
• 代码演示
首先是值类型的自定义类型转换,
Code
public struct MyStruct
{
// 01.2 自定义类型转:整形->MyStruct型
static public explicit operator MyStruct(int myNo)
{
return new MyStruct(myNo);
}
}
然后是引用类型的自定义类型转换,
Code
public class MyClass
{
// 02.2 自定义类型转换:MyClass->string型
static public implicit operator string(MyClass mc)
{
return mc.ToString();
}
public override string ToString()
{
return _myNo.ToString();
}
}
最后,我们对自定义的类型做以测试,
Code
public static void Main(string[] args)
{
#region 03. 类型转换
MyStruct MyNum;
int i = 100;
MyNum = (MyStruct)i;
Console.WriteLine("整形显式转换为MyStruct型---");
Console.WriteLine(i);
MyClass MyCls = new MyClass(200);
string str = MyCls;
Console.WriteLine("MyClass型隐式转换为string型---");
Console.WriteLine(str);
#endregion
}
2.5 类型判等
类型判等主要包括:ReferenceEquals()、Equals()虚方法和静态方法、==操作符等方面,同时注意在值类型和引用类型判等时的不同之处,可以参考[第九回:品味类型---值类型与引用类型(中)-规则无边]的[4. 再论类型判等]的简述。
• 代码演示
Code
// 01 定义值类型
public struct MyStruct
{
// 01.1 值类型的类型判等
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
public class MyClass
{
// 02.1 引用类型的类型判等
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
public static void Main(string[] args)
{
#region 05 类型判等
Console.WriteLine("类型判等---");
// 05.1 ReferenceEquals判等
//值类型总是返回false,经过两次装箱的myStruct不可能指向同一地址
Console.WriteLine(ReferenceEquals(myStruct, myStruct));
//同一引用类型对象,将指向同样的内存地址
Console.WriteLine(ReferenceEquals(myClass, myClass));
//RefenceEquals认为null等于null,因此返回true
Console.WriteLine(ReferenceEquals(null, null));
// 05.2 Equals判等
//重载的值类型判等方法,成员大小不同
Console.WriteLine(myStruct.Equals(myStruct2)) ;
//重载的引用类型判等方法,指向引用相同
Console.WriteLine(myClass.Equals(myClass2));
#endregion
}
2.6 垃圾回收
首先,垃圾回收机制,绝对不是三言两语就能交代清楚,分析明白的。因此,本示例只是从最简单的说明出发,对垃圾回收机制做以简单的分析,目的是有始有终的交代实例由创建到消亡的全过程。
• 代码演示
Code
public static void Main(string[] args)
{
#region 06 垃圾回收的简单阐释
//实例定义及初始化
MyClass mc1 = new MyClass();
//声明但不实体化
MyClass mc2;
//拷贝引用,mc2和mc1指向同一托管地址
mc2 = mc1;
//定义另一实例,并完成初始化
MyClass mc3 = new MyClass();
//引用拷贝,mc1、mc2指向了新的托管地址
//那么原来的地址成为GC回收的对象,在
mc1 = mc3;
mc2 = mc3;
#endregion
}
• 内存实况
GC执行时,会遍历所有的托管堆对象,按照一定的递归遍历算法找出所有的可达对象和不可访问对象,显然本示例中的托管堆A对象没有被任何引用访问,属于不可访问对象,将被列入执行垃圾收集的目标。对象由newobj指令产生,到被GC回收是一个复杂的过程,我们期望在系列的后期对此做以深入浅出的理解。
2.7 总结陈述
这些示例主要从从基础的方向入手来剖析前前两回中的探讨,不求能够全面而深邃,但求能够一点而及面的展开,技术的魅力正在于千变万化,技术追求者的力求却是从变化中寻求不变,不然我们实质太累了,我想这就是好方法,本系列希望的就是提供一个入口,打开一个方法。示例的详细分析可以下载[类型示例代码],简单的分析希望能带来丝丝惬意。
3. 结论
值类型和引用类型,要说的,要做的,还有很多。此篇只是一个阶段,更多的深入和探讨我相信还在继续,同时广泛的关注技术力量的成长,是每个人应该进取的空间和道路。
品味类型,为应用之路开辟技术基础。
品味类型,继续探讨还会更多精彩。
©2007 Anytao.com