第一章
1、定义自己的命名空间
框架类库中的类是通过命名空间组织的!
问题:
如果在一个项目中,编写了两个功能不同的但是名字相同的类,就会发生冲突,解决办法有两种:
(1)将其中一个改名字;
(2)使用不同的命名空间
分析:在C#中,如果同一个命名空间下有两个变量和函数的名字完全相同,就会出现冲突!
2、命名空间的使用
(1)、用自定义命名空间组织类
语法:
namespace MySchool //mySchool是自己定义的空间名字
{
class student
{
//类的内容
public void Study()
{
}
}
}
(2)、引用命名空间
(3)、使用命名空间
××课后总结:
本章所学的知识点包括:
(1) .NET 的基本的框架及其主要内容;
(2)命名空间的使用及作用;
(3)根命名空间-- System ;
(4) ping 来检测网络;
(5) using 的用法:
1、引用命名空间;
2、重命名;
(6)WebClient下载。
第二章:用对象思考:属性和方法
1)、类是具有相同属性和共同行为的对象的集合; --类的定义
2)、类是对象的模板;
3)、对象是类的实例;
4)、静态方法中,可以直接调用其他静态方法;
5)、如果要调用实例方法,则需要通过对象.方法();
6)、在实例方法中,可以直接调用静态方法;
7)、共有的变量等命名时用 Pascal 命名法;
私有的用 Camel 命名法。
8)、方法:对象执行的操作称为类的方法;
字段:类中用于操作的变量称为字段(变量分为成员变量、类变量);
字段 表 关联
属性 表 状态
方法 标 行为
9)、访问修饰符( public 、 private );
属性的封装保证了数据的合法性;
10)、在类中使用方法:
一、方法的重载:(取决于参数的类型)
1、在同一个类中;
2、方法名相同;
3、参数项不同
a、参数个数不同;
b、参数个数相同,对应的参数类型不同。
二、构造函数:
1、概念:
(1)构造函数名与类名相同;
(2)无返回类型。
(3)一般情况,构造函数总是 public 类型的。
(4)在构造函数中不要对类的示例做初始化以外的事情,不要尝试显示的调用构造函数,
也就是直接去调用。
2、作用:
(1)给属性赋值;
(2)实例化类
3、函数重载:
1、在同一个类中;
2、函数名相同;
3、参数项不同
a、参数个数不同;
b、参数个数相同,对应的参数类型不同。
11)、 ref 侧重于 修改
out 更侧重于 输出
12)、 this 关键字代表的是当前的对象。在类的内部,我们可以用this关键字来访问它的成员。
★★★课外知识:
常在电脑前工作,应多吃点胡萝卜,白菜,豆芽,豆腐,红枣,橘子,牛奶及鸡蛋、动物肝脏,瘦肉等食物
以补充人体内维生素A和蛋白质,抵抗电脑辐射最简单的办法就是:
最好在每天上午喝2~3杯绿茶,吃一个橘子。
13)、构造函数:
如果用户没有定义构造函数,则编译器在编译时会自动给该类添加默认的构造函数;
public Student(){ }
如果用户已经定义了构造函数,则编译器不会给该类添加默认构造函数。
第三章(用对象思考:值类型和引用类型)
1)、在程序中使用常量
语法:
访问修饰符 const 数据类型 常量名 = 值
何时使用常量:
(1)用于在程序中一旦设定就不允许被修改的值;
(2)用于在程序中被经常引用的值。
2)、枚举:
枚举表示一组有限的值,对可能的值进行约束,用关键字 enum。
语法:
访问修饰符 enum 枚举名
{
Male,Female
}
3)、给枚举成员赋值
枚举还允许用描述性的名称表示整数值。
枚举的主体不可以定义属性和方法。
使用枚举的好处:
(1)易于维护;
(2)有助于赋值;
(3)易于输入;
(4)使代码更清晰,使用直观方便。
4)、结构的定义:(结构中的构成和类非常相似)
语法:
访问修饰符 struct 结构名
{
定义"结构"(可以有字段、方法)成员
}
使用:
在使用时可以不用 new,直接定义就可以了,但是必须为结构的成员赋初值。
结构与类的区别:
不同点:
类:
引用类型,可以被继承,可以有默认构造函数,可以添加无参数的构造函数,创建对象必须使用 new,
结构中给字段赋初值是错误的。
结构:
值类型,不能被继承,不可以有默认构造函数,可以添加构造函数,但是它们必须带有参数,
创建对象可以不用 new,类中可以给字段赋值。
相同点:
都可以包含字段、方法,都可以实现接口。
5)、值类型:(包括)
数据类型
结构类型
枚举类型
6)、引用类型(C# 中包括 类类型和接口类型)
引用类型变量的赋值只复制对象的引用,而不复制对象本身。
7)、装箱:
值类型转换成引用类型称为 装箱。
8)、拆箱:
引用类型转换成值类型成为 拆箱。
9)、类型的参数传递
实参
@1、值传递 不变
(1)、值传递(无 ref ){
@2、引用类型 变
@1、值类型 变
(2)、引用传递(有 ref ){
@2、引用类型 变
10)、数据类型分类(在课本72页)
11)、索引器:
语法:
访问修饰符 名称 this [数据类型 名称]。
特点:
索引器和数组属性有些类似,但是数组属性只能通过下标(索引)访问,而索引器可以
通过重载它,从而自定义它的访问方式。
12)、使用类图描述类和类成员
在类图中:
+ 表示 共有
- 表示 私有
第五章
文件读写与XML
1)、1、文件
(1)如何读写文件(分 5 个步骤)
1)创建一个文件流
2)创建阅读器或者写入器
3)执行读写操作
4)关闭阅读器或者写入器
5)关闭文件流
命名空间为:using System.IO;
例:
创建文件流
FileStream myFs=new FileStream(path,FileMode.Create);
创建写入器
StreamWriter mySw= new StreamWriter(myFs);
将录入的内容写入文件
mySw.Write(content);
关闭写入器
mySw.Close();
关闭文件流
myFs.Close();
(2)文件流
1)流是一个用于数据传输的对象
在创建一个文件流时需要在它的构造函数中指定参数。
Create:用指定的名称新建一个文件
CreateNew:新建一个文件
Open:打开一个文件,使用这个枚举值时,指定的文件必须存在,否则会发生异常。
OpenOrCreate:OpenOrCreate与Open成员类似,只是如果文件不存在,则用指定的名称新建一个文件并打开它。
FileMode:枚举还有其他的成员
(3)文件读写器
1)StreamWriter写入器
2)StreamReader
问:不用文件流操作简单,为什么还要使用文件流操作?
答:非文件流方式对文件进行操作,无法对文件的打开方式、访问方式进行精确的控制,不容易控制读写。
有时候容易引发异常。但是对于一些简单的文件操作而言,这种方式非常方便。
(4) File 类的方法:
Exists(string path) 用于检查指定文件是否存在,返回值为布尔值
Copy(string SourceFileName,string DestinationFilePath) 复制到目标文件夹
Move(string sourceFileName,string destFileName) 移动
Delete(string path) 删除
(5) Directory 类的方法:
Exists(string path) 用于检查指定文件夹在磁盘上是否存在
Move(string sourceDirName,string destDirName) 移动
Delete(string,bool) 删除,如果bool值为true,则删除子目录中所有目录内容
2)、XML(可扩展标记性语言)
1)特点:
一、XML中用于描述数据的各个节点可以自由的扩展;
二、XML文件中的节点区分大小写;
三、XML中的每对标记通常称为节点,它们是成对出现的,用来描述这个节点存储的内容。
2)TreeView树形控件
TreeView也是通过节点来表示数据的,它的 Nodes对象表示它的节点集合,TreeView的节点对象是TreeNode。
第六章
用对象思考:继承
1)、继承的概述:
1)概念:
继承是面向对象编程中一个非常重要的特性。在有继承关系的两个类中,子类不仅具有自己独有的成员,
还有父类的成员。
(1)被继承的类称为父类或者基类,继承其他类的类称为子类或者派生类。
(2)继承关系在类图中表示为一个箭头,箭头指向的是父类。
(3)继承要符合 is-a 的关系。
2) protected 访问修饰符与 base 关键字
public , private , protected 的区别:
修饰符 类内部 子类 其他类
public 可以 可以 可以
private 可以 不可以 不可以
protected 可以 可以 不可以
◆◆◆
问:如果父类的字段设为 protected,我们在子类中访问字段和属性有什么区别呢?
答:请回顾属性的特点,属性可以对类本身的字段进行约束。为了保证数据的安全还是建议你使用属性。
3)在子类中可以直接用 base 关键字调用父类的属性和方法,还可以调用构造函数。
2)、继承的使用:
1)继承的特性:
【1】传递性:
如:A:B,B:C,那么 A:C。
【2】单根性
就是说所有的子类的基类只能有一个。
【3】密封性:
用 sealed 修饰的类不能被继承,我们称这种类为 密封类。
2)编写子类时的注意事项(两点)
【1】隐式调用父类构造函数
【2】显示调用父类的构造函数
如果父类中没有提供默认的无参构造函数,那么子类的构造函数必须明确指明调用的是哪个父类的有参
构造函数。
在实例化子类的时候,先执行父类的构造函数,在执行子类的构造函数,
:base() 调用父类的构造函数。
用 base.属性、 base.方法。
3)、继承的价值:
1)继承模拟了现实世界的关系;
2)继承实现了代码的重用;
3)继承使得程序结构清晰。
第七章
用对象思考:多态
1)、多态:(好处-----不用考虑类型问题)
1)概念:
不同的对象对于同一个方法却有着不同的执行结果,我们称之为多态。
多态也可以说是同一个类在不同场合下表现出不同的行为特征。
2)定义:
发生在子类与父类之间:
【1】方法名相同
【2】参数项相同
3)对方法的使用:包括--
方法的重载:
方法的重写:(包括重写父类的抽象方法和重写父类的虚方法)
2)、抽象方法和抽象类:
1)定义:
抽象方法是一个没有实现的方法,通过在定义方法时增加关键字 abstract 可以声明抽象方法。
2)抽象方法:(特性)
【1】不包括方法体
【2】含有抽象方法的类一定是抽象方法
3)抽象类:
【1】抽象类不能被实例化(所以只能通过它的子类来实现该类的方法,除非它的子类也是抽象类。)
轻松理解:如果抽象类不被子类继承并实现它的抽象方法,那便没有实际意义了。
【2】抽象类不能是密封或者静态的。
4)抽象类中是否都是抽象方法?
【1】抽象类中并不都是抽象方法,也存在具体的方法。
【2】含有抽象方法的类必然是抽象方法。
5)抽象类和抽象方法的使用:
【1】重写抽象方法:
语法:
访问修饰符 override 返回类型 方法()
6)里氏替换原则:
【 is 操作符的使用】:
"is" 操作符是用来检查对象是否与给定的类型相同。
if(obj is string)
{
}
【 as 操作符的使用】:
"as"用于两个对象之间的转换,
as 类似于强制转换,不同的是
强制转换转换失败时会报异常;
而 as 在转换失败时,运算符将产生空(null),不会报出异常。
3)、使用虚方法:
1)使用虚方法实现多态
虚方法用 virtual 关键字修饰,可以有方法体。
语法:
访问修饰符 virtual 返回类型 方法()
{
//方法体
}
2)重写 Equals() 方法-----是虚方法,可重写
语法:
public virtual bool Equals(Object obj)
3)虚方法的好处:(何时用虚方法?)
可以提供默认的实现,还可以重写自定义的实现方式,大大的增加了程序的灵活性。
如果你想让你的代码更加人性化,灵活就尽量使用虚方法来实现功能。
4)虚方法与抽象方法的区别:
虚方法 抽象方法
用 virtual 修饰 用 abstract 修饰
要有方法体,哪怕一个分号 不允许有方法体
(可以)被子类重写 override (必须)被子类重写 override
除了密封类外都可以写 只能在抽象类中
4)、面向对象的三大特性:
【1】封装
【2】继承
【3】多态
5)、简单工厂模式:
◆软件中的设计模式是软件开发中对于某种需求的一种经验的总结,是特定问题经过实践的特定解决方法。
◆设计模式可以提高软件的复用性,使软件更易于扩展,更容易适应需求的变化,设计模式是面向对象
在实际应用中的集中体现。
◆简单工厂模式用于在调用者不知道对象属于哪个子类的情况下,创建不同的对象。
第八章
用对象思考:接口
1)、接口:
1)概念:
接口是一组规范,是一种标准,遵循这个规范和标准就能实现某种功能。
接口也是一种类。
接口中不能有方法(可以有抽象方法)
不能有字段(可以定义,但是不能赋值)
成员不需要 public 修饰
重写方法不需要 override 关键字
不能有构造函数
不能实例化
接口可以实现继承。
2)作用:
【1】实现多重继承
【2】定义了一种规范和标准
3)定义:
语法:
public interface IComparable
{
int Comparer( Object obj);
}
定义一个接口的名称通常都是以“I”开头,例如:IComparable、IList。
实现了一个接口、继承一个类。
实现一个接口的语法与继承类似 :class Student: IComparable 。
如果类已经继承了一个父类,则以“,”分隔父类和接口。
class Student : Person,IComparable
4)接口小结:
【1】接口是对继承单根性的扩展;
【2】接口是一种规范和标准;
【3】接口屏蔽了实现的细节;
【4】接口的使用方便团队协作开发。
2)、泛型接口:
1)概念:
在比较大小时不需要类型转换,对类型控制更严格,增强系统安全性,代码也非常简洁。
2)泛型接口:
IComparable<T>是IComparable接口的泛型版,他对类型的约束更加严格。
3)比较器:
IComparer<T>通常称为比较器,它用于比较两个对象的大小,可以作为参数传递给 Sort() 方法进行排序。
4)例子:
//比较器 排序
class NameCompar:IComparer<FeedBase>
{
//按姓名升序
public int Compar(FeedBase x,FeedBase y)
{
return x.DisplayName.CompareTo(y.DisplayName);
}
}
//点击次数比较器
class ClicksCompar:IComparer<FeedBase>
{
public int Compar(FeedBase x,FeedBase y)
{
//升序
return x.Click.CompareTo(y.Click);
//降序
return y.Click.CompareTo(x.Click);
}
}
3)、接口的典型应用:
1)接口作为参数的意义:
接口作为参数就是传递一个实现了接口的对象。
2)接口作为返回值的意义:
接口作为参数传递了实现接口的对象。
接口作为返回值实际上就是返回一个实现接口的对象。
3)实现一个接口必须实现它提供的方法、属性等。
【1】接口:接口是某类行为或功能的抽象,是一种规范或者标准,或者说是一种契约。
【2】抽象类:对具体对象的最高抽象,这个对象拥有自己的最基本特征;
从整体上来讲,抽象类和接口本质上都是系统的最高抽象,从实际上来讲,二者抽象的对象不一样
就这一点导致了他们二者的应用截然不同。
本质相同,但是对象不一样。