c#是一种强类型的语言。在这类语言中,必须声明每个要创建的对象类型(如整型、浮点型、字符型),而编译器可以通过强制要求对象必须赋予正确的类型。c#的数据类型可分为两类:值类型和引用类型。两者的主要区别是值在内存中存储方式的不同。值类型在栈分配的内存中保存其实际值(或者作为另一更大的引用类型对象的一部分分配)。引用类型变量的地址保存在栈中,但实际对象存在堆中。引用类型的两个变量可以引用同一个对象,对一个变量的操作就可能影响另一个变量所引用的对象。值类型的每一个变量都具有它们自己的数据拷贝,因此对一个变量的操作不可能影响另一个变量(ref和out参数变量例外)。
在c#中,没有明确的方式表示对象是引用类型(也就是说,不使用&操作符)。
c#的值类型可以分为基本类型、结构类型和枚举类型。这些类型均隐式派生自System.ValueType,每个值类型都有一个隐式的默认构造函数来初始化其类型默认值。
委托类型
委托是一个类型,是一个定义签名的类型,即方法的返回值类型和参数列表类型。可以使用委托类型来声明一个变量,该变量可以引用与委托签名相同的所有方法。委托类型的语法格式:
[访问修饰符] delegate 返回类型 委托名 (参数列表);
示例:
public delegate int PerformCalculation(int x, int y);
在上述代码中声明了一个名为“PerformCalculation”的委托,它带有两个int类型的参数,而且返回值也是int类型。
委托具有以下特点:
(1)委托类似于c++函数指针,但它们是类型安全的;
(2)委托允许将方法作为参数进行传递;
(3)委托可用于定义回调方法;
(4)委托可以链接在一起,例如可以对一个事件调用多个方法;
(5)方法不必与委托签名完全匹配。
与委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构中的任何方法都可以分配给该委托。方法可以是静态方法,也可以是实例方法。这样就可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。只要知道委托的签名,就可以分配自己的方法。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
public delegate int Expression(int a, int b);
class Program
{
static void Main(string[] args)
{
//(2)委托扩展
//Expression ex = GetEX;
//Calculate(ex, 25, 10);
Calculate(GetAdd, 25, 10);
}
static int Add(int a, int b)
{
return a + b;
}
static int Divide(int a, int b)
{
return a / b;
}
static int subtract(int a, int b)
{
return a - b;
}
static int multiply(int a, int b)
{
return a * b;
}
static int GetAdd(int a, int b)
{
return a + b;
}
static void Calculate(Expression ex, int a, int b)
{
Console.WriteLine(ex(a, b) + "\n");
}
}