zoukankan      html  css  js  c++  java
  • 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");
  • 相关阅读:
    R语言ENTREZID ID 转换 gene SYMBOL
    annvar下载数据库的网址
    R语言实现定性资料的秩和检验
    如何获得FPKM/RPKM计算需要的基因长度(考虑exon之间的overlap)
    linux和windows中文显示乱码问题
    从一篇nature medicine文章的得到的可用于文献画图的19种16进制颜色码
    简单将ggplot多个图排列在一起
    python通用读取vcf文件的类(可以直接复制粘贴使用)
    ROCR包中ROC曲线计算是取大于cutoff还是大于等于cutoff
    tinyproxy 反向代理无法上网原因
  • 原文地址:https://www.cnblogs.com/wintertone/p/10597314.html
Copyright © 2011-2022 走看看