有问题多问,问问题证明你动脑筋去思考了
《C#图解教程》
语法参考 C Sharp Language Specification.doc
编程到底怎么学?
多做练习,就像游泳
反复练习,就像打铁,反复捶打
把代码敲到吐
做笔记,养成做笔记、总结的好习惯
1. 代码规范
普通变量(局部变量) -- userName, userPassword
字段 _userName
属性名 方法名 类名 GetMax() UserName class Person...
方法尽量短小,不要超过35行
调到11号字 一个屏幕能够看完
文件名与类名一致,一个类一个文件
案例:你现在要修改前人写好的代码如类MyClass,扩展一个功能,怎么办?
将原来的类使用partial关键字,
新建一个类MyClassExt1 partial MyClass
再将原类注释掉
2. 面向对象计算器_控制台程序/_Winform程序/_ASP.NET
封装-->打包
//找对象
//先看基础类库有没有提供,没有自己写
//提要求
//得结果
3. IP地址和域名之间的关系
域名是由DNS服务器提供的 QQ能上,网页打不开
DNS担负着将网站地址变换为IP地址的重任,如果DNS解析过程中出现了故障,
那么网站将无法访问
4. EXE 和 DLL是组合使用的
比如说我们系统要支持MySQL SQL Server以及其他数据库
那么保证EXE文件的框架不便,只要写两个操作数据库的DLL就可以了
一个程序引用dll的办法一般有两种
第一种是引用项目 -- 一般是原生dll,如果dll更改,那么引用项也会更改
第二种是添加dll的引用,直接将dll文件复制到项目中,再引用(但不会同步更新)
相当于第三方插件
新的项目,就使用生成;
旧的项目,使用重新生成会先将原Debug文件删除,再生成
5. 继承中的几个难点
->构造方法的执行顺序
创建对象的时候,首先调用根类的构造方法,依次父类的构造方法,直到当前类型
base关键字:显示调用父类构造方法 先执行父类指定的构造方法,再执行自己的构造方法
this关键字:显示调用本类构造方法 先执行this指定的构造方法,再执行自己的构造方法
->里氏转换原则 --> 实现多态的基础
is运算符 <operand> is <type> 先判断,再转换,比较麻烦
as运算符 <operand> as <type> 判断转换一步到位
6. 多态计算器
属性是只读属性,即public int Num{get{return _num}};
那么给字段赋值就限制为只能使用构造函数
将抽象类、接口、构造函数 --> 融合在一起写计算器
7. 模块化计算器
使用简单工厂模式
利用一个工厂类,里面写上一个Productxxx方法 根据传进来的数据创建对象
再返回给主程序
这样完成的模块化的计算器,具备很强的扩展性。
想要扩展一个功能,如增加对一种运算符的支持,只需要两步:
增加一个运算符的DLL
之后修改下工厂模块
8. 终极计算器
插件机制 -- 设计到反射的使用
9. 接口的使用
一般在比较大的系统中才涉及接口的使用,在普通小项目中接口和抽象类起到的作用没什么区别
接口可以使得多个对象在不同环境下实现多态
例如:
1)我们定义三个接口 IShowable{Show方法} IReadable ISortable
2)再定义三个函数ShowHelper(IShowable shower)...把接口做为参数传进来
3)之后写类去配合接口 如MyClass1实现了上述三个接口,就可以调用ShowHelper(MyClass1)实现所有三个功能
这样就可以限制类所能实现的功能,而不影响类本身
比如我们可以使用这种方式实现对角色的权限的限制
接口的单一性:就是当作零件来使用
比如说想实现比较功能,就实现IComparable接口
想实现排序功能,就实现ISortable接口
10. C#有一个Environment类 当前系统环境的类
11. 类的成员有哪一些
字段,属性,方法,索引,事件
索引是一种特殊类型的属性,可以把它添加到一个类中,以提供类似于数组的访问。
public 返回值 this[类型 索引名]
{
get { }
set { }
}
public int this[int numBase, int power] -- 两个索引
{ get{return (int)Math.Pow(numBase,power);}}
实际上,索引可以提供复杂的访问,因为我们可以用方括号语法定义和使用复杂的参数类型
12. 静态与非静态
语法
在方法或字段等前面加上static
如何使用
直接使用类名.成员名
静态类
静态一般提供功能,有时提供一些常量
Microsoft windows SDK Tools --> IL反汇编程序(common intermediate language)
.ctor --> constructor
.method --> 标记为方法
.field --> 字段
.cctor --> class constructor
class MyClass
{
public int numInstance = 10; 通过IL反汇编程序,我们看到这段代码实际上是在构造方法中执行的
public static int numStatic = 20;
static MyClass //静态字段的数据由静态构造方法初始化,而且只执行一次
{ //先于实例构造方法执行
}
public MyClass
{
}
}