http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2022/10/29 13:05:00
博文_总结学习C#_中级篇_01


开始本篇前,先说说自己学习C#的师从,淘宝淘的教程,老师没见过,甚至名字都不知道,资料本身可能也是盗版的(得罪!),感谢他们制作的教程,一个是泰课在线的siki(不知道中文名),一个是湖南中方县曾瑛(在视频中出现的),前者简洁明了,但有些来龙去脉讲的少,时常让人感觉好像懂了,但一下子又到了一个陌生的地方,断片的感觉,后者讲的太啰唆了,有些逻辑也不清晰,但恰好补充了前者不足,还有就是两个都没讲明白或是自己听不明白的,请教第三位老师,百度,哈哈! 

本篇总结C#中级篇(自己分的篇),主要总结:调试和异常处理、面向对象、集合和泛型。另外,有一点,先说明一下,此博文非教程,一来帮助自己梳理当下的学习,有些自己很清楚的东西,或者用不上的东西,不展开;二来顺便完成六个一任务,这个,附中人都懂。 

一、调试和异常处理

不记得是学js还是python的时候,印象较深的是,有位老师说过,如果你知道那个地方可能出错的话,尽量使用 if 语句就好,所以我对异常处理这部分,一直抱着仅了解就好的态度。

关于调试,visual studio比较好的是,当代码有错,编译器马上就会用红色波浪线标识出来,至于断点调试,仅知道,没发现有什么作用。 

二、面向对象

感觉C#真的是面向对象,入口就在类里面,这部分内容较多,一个一个来总结。

1、类的创建

class 类名{  }class前面不加public修饰符的话,不能在其他命名空间调用,同一个命名空间下定义的类,可以直接调用。

2、字段

就是其他语言说的属性,在C#中属性另有所指,字段即类中定义的变量,需要指定数据类型和修饰符,如public string name

说下修饰符,public表示该字段是公有的,在类外可以调用,可继承;private 私有字段,类外不能调用,不能继承;static静态字段,属于类的字段,在外要用类名调用。

编程规范要求,类的字段应该用private

3、属性

本质是一种方法,定义方式: 修饰符+数据类型+属性名+{ get{}set{}}

修饰符一般public,属性名要求首字母大写,以区别于字段,括号内含get代码块和set代码块,get中要返回值(即所谓的属性值,用return返回),set块用来接受赋值输入值给属性,用value传递。

属性的定义有点像函数定义,只是没有返回类型和参数部分,还有内部有getset块,get是属性取值用,set是属性赋值用,属性实际使用就像字段一样取值和赋值。

getset可以只有其一,如果没有set,可认为是只读属性,还可以私有set,在set前加private修饰符,在外只能取值,不能赋值。

定义属性,可以先定义小写的字段,再定义大写的属性,也可以直接定义大写的属性,当做字段用。

4、构造函数

这个是非常重要的一个概念,构造函数在类实例化对象的时候自动调用,用来初始化对象(初始化对象的字段方法等)

构造函数有传参,实例化对象的时候就要传参,如果一个类没有定义构造函数的话,编译器会调用一个默认无传参的构造函数,对象的字段初始化时,int型赋值0string型赋值空字符串,对象赋值null等。

5、静态字段和方法

字段和方法前用static修饰,前面还可加publicprivate表示公有和私有的静态字段,静态字段和方法属于类自己的,在外需要类名调用,有时也方便,比如不需要创建对象就可以调用,如Math类下的方法,调用时Math.xx

静态方法的函数体中,不能直接调用类中的非静态字段和非静态方法,只能在类中先实例一个类自己的对象,再用这个对象调用类的普通字段和方法,好别扭,不理解这种设计的初衷,记住就好!

还有一点,类的公有静态字段,可以在外访问修改,在内也没有问题,相当一个python的类属性,可放在类的构造函数里,如一个静态字段count,在构造函数中count++,这样每构造一个,用类的静态字段记录,构造的次数。

6、常量字段

constreadonly关键字声明的变量属于常量,一旦赋值后,不能更改,关键字加在变量声明的数据类型前,如const double PI=3.1415const声明变量时需要马上赋值,readonly则可以不赋值,这个放在构造函数里有用,比如一个readonly的字段,作为参数传给构造函数,用类构造对象的时候赋值,每次构造可以传入不同的值,但一旦构造完成,这个字段值不能再修改。

7thisbase

js中,因为要操作HTML元素,this够初学者喝一壶的,头疼的厉害的那种,在C#中,感觉没什么难度,this表示对象的,base表示父类的。

8、继承

面向对象的三个特点,封装、继承、多态。

所谓继承,即类(基类)可以派生子类,派生类继承父类的所有公有的字段、属性和方法,C#不支持多重继承,即多父,但好像可以继承多接口(这个好像地位有点高,不知道以后有没有机会用接口)。

写法上子类名字++父类名,还有一个万类之源,Object类,所有的类都是继承于它,其有个方法ToString,所有对象也就都有ToString方法。

private私有的字段和方法不能继承,也不能被对象调用。

protected保护的字段方法能继承,但不能被对象调用,这个用的不多,不甚清楚。

9、虚方法和隐藏方法

虚方法,关键字virtual,父类用了虚方法,子类可以用override重写,孙子类可以继续用override重写,这就是类的多态。

隐藏方法,关键字new,子类重写父类的方法,即子类重写与父类相同名字的方法,用new写,这种写法,siki不推荐,不推荐的原因是,一般对象用什么类构造出来,就具有该类的方法,而不管声明的时候用的是基类还是派生类。

补充一个概念,Cat cat = new Cat(),这是一个实例化cat对象的代码,左边我们称声明一个对象(用Cat类声明一个cat对象),右边为构造一个对象,即用构造函数对对象进行初始化,如果类没有构造函数,调用编译器默认的构造函数。

10、抽象类和抽象方法

关键字abstruct,这种属于高层次的使用。

抽象类可做基类派生,不能初始化构造对象,里面可以有抽象方法和普通方法。

抽象方法,无函数体,子类中需要override重写 

11、密封类和密封方法

关键字sealed,这个没用过,也少见使用场合。

密封类不能派生,与基类相反。

密封方法,定义在其他类的密封方法,子类也不能继承,siki 说只有重写的方法才能密封,关键字sealed加在override前,如 sealed override void Test() 

12、构造函数的继承问题

无参数的构造函数,子类如果重写的话,直接写(省略 :base()

有参数的构造函数,要:base),不展开。 

13、接口

interface不用class,可做为类和接口的基类,也只能派生,不能构造,有点象抽象类,接口成员只能有方法、属性、索引器、事件,不能有构造函数、字段、不允许运算符重载,所有的成员都不提供实现方式,如方法,不能有函数体,如属性,无set块。

这个层次也高,不知道有没有机会用。 

14、运算符重载

运算符重载,两个老师讲的都没能理解,请教了百度老师。

直接说个例子,比如一个Box类,构造时传两个int参数,即Box类的对象,带有两个int,假如用Box实例两个对象b1b2,需要计算b1+b2,编译器怎么可能知道两个对象怎么加!这时就需要重载运算符 加号。

重载运算符,需要在这个类中进行,即在Box类中,写法如:

public static Box operator + (Box b1, Box b2) { .. },有点象函数定义,

operator + 即操作符 +,括号内传两个对象,花括号写怎么进行加法。

这样,编译器就知道 b1+b2怎么计算了。 

15、索引器

定义在类中,可以让类实例出来的对象,象数组一样用索引,这种类一般构造一个数组类型的对象,这样实例化出来的对象,如cats,就可以数组一样,如cats[index]取值和赋值。

写法很特别,不展开。 

16ToString方法的重写

当使用Console.Write(object),输出对象,自动调用对象的ToString方法,但只能看到对象的所属类信息。

重写类的ToString方法,如显示类的所有字段

public override string ToString(){

       return string.Format("name:{0},age:{1}",name,age);

} 

这篇有点长了,先到这,中级篇2再继续。

mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.