C#学习笔记1

近几天对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");

 

posted @ 2019-03-25 22:43  冬音  阅读(210)  评论(0编辑  收藏  举报