近几天对C#教程里一些没有完全掌握的知识进行了学习,学习到了自己以前不知道的用法,并进行了练习。
知识点包括枚举、异常处理、泛型和匿名委托。
1. 枚举
以前知道枚举类型,但是很少用到。
枚举是一组命名整型变量。声明关键字时enum
枚举可以建立对象与整数间的对应关系;使代码简洁;可以限定值的范围,减少编译错误;易于修改;更安全
代码简洁:
class Animal { public const int dog= 1; public const int cat = 2; public const int Rabbit = 3; }
enum Animal { Dog, Cat, Rabbit};
限定值的范围:
如果不知道动物有哪些下面代码编译是不会有错误的,而实际运行会出现错误
ShowAnimal(4);
而下面这样错误就可以在写代码时发现
ShowAnimal((int)Animal.Bird);
易于修改:如果现在要删除兔子,如果不适用枚举,代码中调用兔子id的代码不会出现编译错误,而使用枚举,就可以在编译时发现该错误
更安全:使用枚举,对象和整数的对应关系就确定了,不可修改,而使用类是可能被修改的
2. 异常处理
异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应
异常可以自定义,自定义的异常类是派生自 ApplicationException 类,如下
public class TempIsZeroException: ApplicationException { public TempIsZeroException(string message): base(message) { } }
异常可以抛出
Catch(Exception e)
{
...
Throw e
}
合理的处理异常是很重要的,异常往往是程序中要修复的地方,需要注意。
3.泛型
泛型是一种延迟编写数据类型的规范,在实际使用的时候再确定类型。
泛型的优点在于重用代码、保护类型的安全性以及提高性能。
泛型类例子:
public class MyGenericArray<T> { private T[] array; public MyGenericArray(int size) { array = new T[size + 1]; } public T getItem(int index) { return array[index]; } public void setItem(int index, T value) { array[index] = value; } }
这里使用T作为通用类型,指代数据类型,声明了T类型的自定义数组的构造函数(申请空间)、元素获取方法和元素赋值方法。
使用用例:
static void Main(string[] args) { // 声明一个整型数组 MyGenericArray<int> intArray = new MyGenericArray<int>(5); // 设置值 for (int c = 0; c < 5; c++) { intArray.setItem(c, c*5); } // 获取值 for (int c = 0; c < 5; c++) { Console.Write(intArray.getItem(c) + " "); } Console.WriteLine(); // 声明一个字符数组 MyGenericArray<char> charArray = new MyGenericArray<char>(5); // 设置值 for (int c = 0; c < 5; c++) { charArray.setItem(c, (char)(c+97)); } // 获取值 for (int c = 0; c < 5; c++) { Console.Write(charArray.getItem(c) + " "); } Console.WriteLine(); Console.ReadKey(); }
这里分明int、char作为数据类型实例化自定义数组,首先申请空间、然后分别调用设置值和取值的方法。
泛型方法
除了泛型类,还可以通过类型参数声明泛型方法,如下例:
static void Swap<T>(ref T a, ref T b) { T temp; temp = a; a= b; b = temp; }
这是一个使用T来替代数据类型的泛型方法,实现两个变量值交换
调用例子如下:
static void Main(string[] args) { int a = 10; int b = 20; char c = 'I'; char d = 'V'; Console.WriteLine("a = {0}, b = {1}", a, b); Console.WriteLine("c = {0}, d = {1}", c, d); Swap<int>(ref a, ref b); Swap<char>(ref c, ref d); Console.WriteLine("a = {0}, b = {1}", a, b); Console.WriteLine("c = {0}, d = {1}", c, d); Console.ReadLine(); }
泛型委托
委托也可以泛型,例如
delegate T NumberChanger<T>(T n);
声明两个方法,一个输出显示int类型,一个输出显示string类型:
public static void IntShow(int v) { Console.WriteLine(v); } public static void StringShow(string v) { Console.WriteLine(v); }
创建委托实例,并调用
// 创建委托实例 NumberChanger<int> nc1 = new NumberChanger<int>(IntShow); NumberChanger<string> nc2 = new NumberChanger<string>(StringShow); nc1(25); nc2("Hello");
4. 匿名方法
匿名方法提供了一种传递代码块作为委托碳数的技术,匿名方法是没有名称只有主体的方法。
匿名方法的意义在于减少写方法的工作量,可以访问调用者的变量,降低程序复杂度,减少系统开销。
匿名方法语法
delegate void NumberChanger(int n); ... NumberChanger nc = delegate(int x) { Console.WriteLine("Anonymous Method: {0}", x); };
这里声明了一个委托,并用一块代码进行了实例化。
实例如下:
delegate void Hello(string str); //声明一个委托 // 使用匿名方法创建委托实例 Hello h = delegate(string str) { Console.WriteLine(str); ; //使用匿名方法调用委托 h("hello");