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);
}
}
这个例子显示了两种类型的区别,程序产生的输出是: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();
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();
例子给出了每一个类型的定义。接下来会详细介绍这些类型的定义。