.Net培训个人总结笔记4

学习交流,欢迎转载。转载请注明文章来源:http://www.cnblogs.com/lgjspace/archive/2011/10/12/2211038.html

 

拓展:
测试驱动开发模式:http://baike.baidu.com/view/184088.htm

 

重点:
internal的可见范围:中文翻译为“内部的”,范围只限定在编译好后的 *.exe 或 *.dll 文件内部可见,文件外部是看不到的。

 

经验:
把一个引用类型的变量值(暂时假设为一个有 Name, Age 属性的 Human 类的对象 person)赋值给一个新建的变量(暂时假设为创建了一个 Human 类型的变量 person2,相当于执行了 Human person2;)时,有两种方式:
1.给这个新建的 person2 变量构造出( new 出)一个 Human类的对象(即相当于 person = new Human();),然后把原来的 person 里的所有属性都分别赋值给 person 对应的属性,从而实现引用类型的“复制”。
2.直接把原有的 Human 类型的对象赋值给 新建的变量 person2,也能实现同样的引用类型的“复制”的效果。但,这两者之间是有差别的:
前者相当于用“值传递”的方式“拷贝”了同样的一份给新变量 person2,而后续外界对person2 的修改不会影响原有的 person,即没有“引用传递效应”;
而后者则是直接把 person 自己(而不是和 person 自己一样的一份“拷贝”)原原本本地给了别人(person2),所以外界对 person2的任何修改都会直接影响原来的 person 变量。

 

经验:
 for 循环和 foreach 循环的区别:
for循环:循环体中可以使用循环变量 i 来随时监视遍历的进度或者定位元素的位置,被遍历的每个元素都可以被任意修改(如果元素本身不是只读的话),遍历的顺序可以任由程序员来决定(可以跳开某些项、重复遍历某些项、改变遍历的顺序方式等);
foreach循环:循环体中没有类似于 for 头中的 i 的变量可以用来定位或者监视被遍历项,被遍历的每个项都是只读的,都不能被修改,而且遍历的顺序是由 foreach 来决定的,一般为顺序地逐个遍历,程序员不能对遍历的顺序作任何修改(这样其实也很好理解,如果被遍历的项不是只读,而是可以随时增删改的话,那foreach遍历时的索引顺序也就被打乱了)。

 

细节:
C#中的命名规则一般有两种:Camel Pascal。
在C#程序中,所有的字段名、所有方法里面的参数名、所有方法体里面定义的变量名等都要用Camel方式(即第一个单词开头小写,第二个单词开始都是开头字母大写);程序中所有的属性、所有的方法、所有类的类名等都要用Pascal方式(即名字中的所有单词都要开头字母大写,无论单词是第一个还是最后一个,规则都不变)。

 

拓展:
1.WinForm窗体下的所有控件之类的东西都继承自System.Windows.Forms。
2.MSDN中的方法、属性、类等,凡是带“手机”图标的都是可以用在移动设备的开发上的;凡是带“锁”的都是访问级别为“受保护”的(即带有 protected 修饰符的)。

 

细节:
关于访问级别修饰符 public、private、protected、internal:
protected 和 private 一样,(本类以外的)外界是不能访问带 protected 的变量的,但在类的派生方面上,只有受保护的(标有 protected 修饰符的)成员才能被派生类继承下来,而“私有”(标有 private 修饰符的)的成员则不能被派生类继承(在派生类的继承权限方面上,protected 更类似于 public)。

 

经验:
在 .Net 中凡是名字是带有复数形式的属性一般都是集合,凡是集合的一般都会有Add()、Remove()、Count()、Clear()等方法,而且返回值类型一般是以“×××Collection”的形式来命名的,其中“×××”则是集合的每个元素的返回值的类型。

 

细节:
所有的引用类型都被放在内存的托管堆上面,值类型都被放在栈上。放在栈上的变量由操作系统来控制回收,而放在托管堆上的资源由托管堆来回收。

 

拓展:
在C#中,一般常用的数据结构相关的类都放在了 System.Collections 命名空间下。
C#中涉及到数据结构的类一般有:ArrayList(链表)、Queue(队列)、Stack(栈)、HashTable(哈希表)等。
ArrayList链表相当于“变长数组”,其原理大致是通过利用内存中的零散空间来实现“变长”,即链表中的元素集合在内存中的存放是不连续的。
Queue队列的特点是:“先进先出”,而Stack栈的特点是:“先进后出”。
Queue队列最重要的应用是在于:构建缓冲。缓冲的使用例况:从高速设备往低速设备上传输数据时会用到缓冲。缓冲不是越大越好,主要是取决于缓冲的提取和传进是否能够达到动态的平衡。

 

重点:
1.静态类是不能被创建实例的!
例如下面的代码:

 1 namespace tmp
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 P p = new P(); //报错:“无法创建静态类“tmp.P”的实例。”。
8 }
9 }
10
11 static class P
12 {
13 public void SayHello()
14 {
15 Console.WriteLine("123");
16 }
17 }
18 }

在这代码段中,创建类 P 的实例是不允许的。
2.究竟能否实现“不创建类的对象,而是直接以“类名.类里的方法名”的方式来调用类的方法”的效果,不是看类是不是静态类(static),而是要取决于类里面的方法是不是静态方法(static),方法到底能不能直接用类名来调用(即以“类名.类中的方法名”的方式来调用)跟“类是不是静态的”没有关系,只要是静态方法,无论该方法的类是不是静态的,都可以用类名来直接调用。
3.静态类是不能被创建类的实例的。但如果类一旦定义成静态类,则类里面不能声明实例成员,原因也很好理解,既然静态类是不能被创建类的实例的,而类的实例成员是需要创建类的实例才能被类的实例调用的,不能以“类名.类的方法名”的方式来直接调用,所以在静态类中是不能声明实例成员的。如下面的情况是不被允许的:

 1 namespace tmp
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 P.SayHello(); //这样会报错:不能在静态类中声明实例成员
8 }
9 }
10
11 static class P //静态类
12 {
13 public void SayHello()
14 {
15 Console.WriteLine("非静态方法");
16 }
17 }
18 }

 

重点:
在C#中是不存在“全局变量”这回事的,也不存在“函数”这说法,什么东西都必须放在类里面。如果必须实现这种有“全局成员”的效果,可以用静态(static)成员来代替。
在C#中:
密封类(seal)不能够被继承,只能够被实例化(即创建类的对象);
抽象类(abstract)只能够被继承,不能够被实例化(即创建类的对象);
静态类(static)既不能被继承,又不能被实例化(即创建类的对象),只能直接的以“类名.类的方法名”的方式来简单调用。静态类多用在写函数库。

 

如下面的这种继承方式是不被允许的:

 1 namespace tmp
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7
8 }
9 }
10
11 class P1 : P //这样会报错:“tmp.P1”: 无法从静态类“tmp.P”派生。
12 {
13 public void SayHello()
14 {
15
16 }
17 }
18
19 static class P //静态类
20 {
21 public static void SayHello()
22 {
23 Console.WriteLine("静态方法");
24 }
25 }
26 }

 

细节:
在C#中,this 指代的是“该类里的自己的成员”,所以静态成员不能用 this 来指明。

 

细节:
Form1.Show() 和 Form1.ShowDialog() 方法的区别:
Show() 方法弹出的新窗体不会挡住后面的窗体,而 ShowDialog() 方法弹出的新窗体会挡住弹出该新窗体的旧窗体,若要再对旧窗体进行操作,则必须先关闭该新窗体。

 

重点:
在C#中,静态类的作用除了可以用来写函数库和用来声明全局成员之外,还可以在项目中控制实例的唯一(类似于单例模式)。

 

重点:
如果把一个非静态(static)、非抽象(abstract)的类的构造函数的访问级别设置成 private ,就禁止了外界对该类的构造函数的调用,也就是相当于禁止外界对该类的 new 操作了,但这并不等于“类不能被创建实例”了,因为虽然类外部不能 new 了,但类内部不受任何影响,照样可以 new 自己的实例,private 级别的构造函数只能禁止在外部调用,在自己本类内部是没办法禁止的,是可调用的,所以,尽管是构造函数设置了private 级别的非静态非抽象的类,也可以在类的内部创建自己本类的变量, new 出自己本类的对象。

posted @ 2011-10-12 22:53  梁国锦  阅读(220)  评论(0编辑  收藏  举报