zoukankan      html  css  js  c++  java
  • C#学习笔记(4)

    在像C一样的一些面向过程的语言中并没有class关键字,而是一般使用struct,C#中也有struct关键字,其作用和class相似,但是最大的一点不同就是struct没有办法进行继承,其他的大部分的功能与类相同。

    举个例子,把上次实现的Time类改写成struct

        public  struct  Time
        {
            public int month;
            public int year;
            public int day;
        }

     对于类中能实现的构造函数和拷贝构造函数,struct均能实现。

    下面来补充说明一下上次没有提及的参数传递。

    在类或者struct中定义一个这样的函数

            public void GetTime(int h, int m, int s)
            {
                h = 12;
                m = 34;
                s = 56;
            }

    在Main类里面运行以下语句

                Time t2= new Time();
                t2.GetTime(t2.year, t2.month, t2.day);
                Console.WriteLine("{0},      {1},      {2}",t2.year,t2.month,t2.day);

    在程序运行结束之后,我们会发现t2实例中的各个变量的值并没有改变,这主要是因为t2这个实例被传递到函数是是作为一个形参,并不会改变实参的值。

    如果我们想要通过返回值以外的方式改变实参的值,可以通过ref和out这两个关键字实现

            public void GetTime(ref int h, int m, int s)
            {
                h = 12;
                m = 34;
                s = 56;
            }

    如果我们想这样把函数的第一个形参前加上关键字ref,运行结果就会变成这个样子

    ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。再实际使用中,我们基本上可以把两个关键字等效。

    同时,我们还需要注意另外一点,我们不仅要在函数声明是使用ref或者out关键字,在使用该函数的时候也需要在对应的参数的位置使用ref或者out关键字。

    同样,在类和struct中关键字ref和out均可使用。

    在C#中,除了类以外还有另外一种实现继承和多态的机制——Interface (接口)。

    接口和抽象类非常相似,但是一个类只可以继承一个抽象类,但是却可以继承多个接口。在声明接口的时候我们不能在方法前增加权限作为修饰,也不能写出具体的实现方法。

    我们创建一个简单的接口来举例

        public interface Inubmer
        {
            void One(int one);
            void Two(int two);
            void Three(int three);
        }

     创建一个类来继承这个接口

        public class Count : Inubmer
        {
            public void One(int one)
            {
                if(one == 1)
                    Console.WriteLine("The number is one.");
                else
                    Console.WriteLine("The number is't one.");
            }
            public void Two(int two)
            {
                if(two == 2)
                    Console.WriteLine("The number is two.");
                else
                    Console.WriteLine("The number is't two.");
            }
            public void Three(int three)
            {
                if (three == 3)
                    Console.WriteLine("The number is three.");
                else
                    Console.WriteLine("The number is't three.");
            }
        }

     如果一个类继承了一个或者几个接口的话,我们在这类里面必须实现所有接口中的所有方法,否则编译器就会报错,这点与抽象类也不相同,抽象类我们只需要实现我们需要的方法即可。

    我们做一个简单的测试

        class Program
        {
            static void Main(string[] args)
            {
                Count test = new Count();
                test.One(1);
                test.One(2);
                test.Two(2);
            }
        }

    运行结果如下

    类似类的继承,接口之间也可以进行一对一,多对一的扩展

        public interface Iplus : Inubmer
        {
            void Plus(int number);
        }

    拓展之后的接口带有原先接口的所有功能,同时也可以增加一些新的功能

    我们对原先的Number类进行简单的修改

    public class Count : Iplus
    {public void Plus(int number)
            {
                number++;
                Console.WriteLine("After plus, the number is "+number.ToString()+".");
            }
    }

    在Main中测试

    test.Plus(3);

    测试结果如下:

    最后,说明一种特殊情况的处理方法,当一个类继承的多个接口中有同名的方法时,我们最好要显示的注明每一个方法的所属接口,这样能够有效的避免错误的发生。

  • 相关阅读:
    VMware Workstation Pro 12 创建虚拟机(安装Ubuntu)
    老师的题目(开心一刻)
    政务私有云盘系统建设的工具 – Mobox私有云盘
    学校信息化分享-中小学怎样快速完成教学资源库的建设
    SpringBoot 2.x 文件上传出现 The field file exceeds its maximum permitted size of 1048576 bytes
    nginx错误集
    nginx做http强制跳转https,接口的POST请求变成GET
    swagger Base URL地址和下边的不一致
    CentOS7关闭防火墙
    nginx配置:静态访问txt文件
  • 原文地址:https://www.cnblogs.com/ljc825/p/4384822.html
Copyright © 2011-2022 走看看