C#支持两种类型:值类型和引用类型。值类型包括简单类型(如char,int,和float),枚举类型,以及结构类型。引用类型有类、接口、委托和数组类型。

值类型和引用类型的区别在于:值类型变量直接保存着它的值,而引用变量保存着对象(译注:对象里保存着值)的引用。对于引用类型来说,
两个引用类型的变量可以可以指向同一个对象,因此,会出现在一个引用变量上操作它所指向的对象,却影响了其他的某个引用变量所指向的对象。

请看例子:

using System;
struct Struct1
{
public int Value;
}
class Class1
{
public int Value = 0;
}
class Test
{
static void Main() {
Struct1 val1 
= new Struct1();
Struct1 val2 
= val1;
val2.Value 
= 123;
Class1 ref1 
= new Class1();
Class1 ref2 
= ref1;
ref2.Value 
= 123;
Console.WriteLine(
"Values: {0}, {1}", val1.Value, val2.Value);
Console.WriteLine(
"Refs: {0}, {1}", ref1.Value, ref2.Value);
}
}
这个例子显示了两种类型的区别,程序产生的输出是:
Values: 0, 123
Refs: 123, 123
给局部变量val2的一个成员赋值,不会影响局部变量val1,因为这两个局部变量都是值类型的,并且每个值类型的变量都有自己的存储空间。与此相反,赋值操作ref2.Value = 123;影响了ref1和ref2同时指向的那个对象。
注意下面两条语句:
Console.WriteLine("Values: {0}, {1}", val1.Value, val2.Value);
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
它们展示了Console.WriteLine方法的字符串格式化的功能,用到了可变数量的参数。第一个参数是一个字符串,它里面可以包含数字占位符如{0}和{1},每一个占位符指向接下来的某个参数,{0}指向该方法的第二个参数,{1}指向第三个参数,以此类推。在向控制台输出以前,每一个占位符都被相应的变量的格式化结果代替(译注:占位符里还可以带有格式化的指令如{0:C}表示将数字转换为表示货币金额的字符串)。
我们可以定义新的enum和struct值类型,也可以定义class、interface、delegate引用类型。请看例子:

using System;
public enum Color
{
Red, Blue, Green
}
public struct Point
{
public int x, y;
}
public interface IBase
{
void F();
}
public interface IDerived: IBase
{
void G();
}
public class A
{
protected virtual void H() {
Console.WriteLine(
"A.H");
}
}
public class B: A, IDerived
{
public void F() {
Console.WriteLine(
"B.F, implementation of IDerived.F");
}
public void G() {
Console.WriteLine(
"B.G, implementation of IDerived.G");
}
override protected void H() {
Console.WriteLine(
"B.H, override of A.H");
}
}
public delegate void EmptyDelegate();

例子给出了每一个类型的定义。接下来会详细介绍这些类型的定义。



posted on 2009-03-18 14:38  apple123  阅读(806)  评论(0编辑  收藏  举报