C#基础知识

本文只记录零散的知识点,并不是系统的学习笔记

 

% 抽象类、抽象方法:

        抽象类不能实例化,只能被继承(可以声明,但是new实例化必须子类完成)。抽象类可以包含非抽象方法和抽象方法。

        抽象方法就是只有函数定义没有函数体(显然,抽象函数本身也是虚拟的Virtual方法)。且必须声明在抽象类中。

   子类可以不实现抽象父类的非抽象方法。

    子类如果声明为抽象类,则可以不override实现父类的抽象方法。

% 重写方法override和隐藏方法new:

        override:父类的方法就没有了,被覆盖了。

        new:父类的方法只是被隐藏了,但是还存在。(如果想调用父类方法,则需要用父类去声明  Father son = new Son( );son.fatherFunc( );)

 

父类的虚方法virtual,子类可以不重写,这时实例化的子类调用的就是未重写的父类方法。

% 密封类和密封方法

        密封类可以声明在任何类上,表示该类不能被继承了。(其中不可包含抽象方法和虚方法)

   密封方法只能声明在重写的方法上,表示该方法不能再被重写了。                  

% 接口和抽象类区别

        抽象类:和普通类唯一区别就是不能实例化。(具体实现子类必须重写父类抽象方法,抽象子类则可以不重写)

        接口:只能包含方法、属性、事件、索引器的声明(不能实现),不能包含字段、常量等。  ----PS:接口也可以继承

                    不能有访问修饰符

% 委托

        使方法可以当做参数来进行传递。(定义:delegate void MyDel( 参数或没有);)

        实例化:①MyDel del1 = new MyDel( "Func1" );

                    ②MyDel del = "Func2";

        使用:调用---del();  当参数传递--- void Func(MyDel del){  }

            注意:如果委托没有指向任何方法,调用的话,会出现异常Null(空引用)

        系统委托:

                Action委托:可以指向一个没有返回值,没有参数的方法

                Action的拓展(用泛型实现可指向有参数的方法):Action<int,string> act ; //可以指向一个没有返回值,但有一个int参数和一个string参数的方法   =====》但是不能指向有返回值的方法,拓展也没有

                Func委托:必须指定一个返回值类型,参数类型可以0-16个。最后一个是返回值类型

                Func<int,string,string> func;//返回值类型是string,参数类型是int,string

% 匿名方法

                  匿名方法使用方式:delegate(参数){ 函数体 };

                   匿名方法使用时机:当前方法只调用一次(一般用于一些回调时)

              

% Lambda表达式     ----------- 只要有委托参数类型的地方就可以使用匿名方法,只要有匿名方法就可以用Lambda代替。

            其实就是匿名方法的简写形式,用来代替匿名方法的(因为匿名方法还需要delegate关键字,麻烦),所以本质也是定义了一个方法。    ==========  直接括号(里边带参数,参数不需要指定类型,因为前边委托类型已经标明类型了),后边接函数体即可。

                        

            特殊的:

            

% 事件Event

        声明:在委托前边加event关键字即可

        使用:一样

        

% 事件和委托的区别

            ①事件只能声明在类内(成员形式),不能声明在函数体内;委托可以声明在任何地方

            ②事件只能在当前类内触发,不能在类外(保证了只有状态改变者自身知道自己状态改变),委托可以类外触发

            ③事件只能施加+=、-=操作符

            ④使用中,委托常用来表达回调(eg:动画执行完后做的事情,因为动画完成事件不确定),事件用来表达外发的接口(供别人注册)

% 结构体和类 在声明字段的时候,能否给初始值问题 结构体和类

        类可以:int a = 5;但是不可以 int a;a = 5;(因为a = 5;这是执行代码:在被执行的时候才会有效果)

        结构体不可以:int b = 6;//结构体需要在构造函数中去赋值

        可能有疑问:那int a = 5;有赋值操作,也是执行代码啊!其实,严格意义上,类也是不可以给字段初始值的,只不过微软帮我们做了一步操作:会把你给的初始值放到构造函数中进行赋值!也就是:int a;而this.a = 5;是在构造函数中完成的!所以,理论上像执行代码,应该放到函数中去,这样才能达到在函数调用时执行代码才有效果。

        二者构造函数区别:如果我们没写任何构造函数,编译器会自动生成一个无参构造,而我们写了任意构造后,这个隐式构造就不会再提供了。    ===========   而结构体则不然,它的隐式构造永远存在(即使我们写了有参构造),但不能手动写无参构造!                         结构体在构造函数中必须为所有字段赋值。

        区别:

            1、结构体的自定义构造函数必须初始化所有的实例字段和未初始化属性,而类不必;

            2、结构体变量的声明可以不必非要使用new(因为编译器在栈上已经为其开辟了空间,new只是去调用构造去做初始化字段操作),也可以声明之后再分别对字段进行点赋值,而类只能new

            3、结构体不能被继承,类可以

            4、结构体实例字段不能在声明的时候同时赋值(需在构造中进行),类可以

            5、结构体变量只声明而没有用new进行初始化时,可以为其实例字段赋值,而类不行

            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值