**************************事件和委托************************
1.事件和委托
a.方法可以调用自己\\回调
b.签名相当于参数列表
c.委托是一种类型(函数类型)-->其的变量就是一个函数的引用
d.委托变量可以作为参数进行传递---->就相当于函数指针类型
2.事件
e.在定义事件之前一定要定义一个委托,然后根据委托定义事件
f.定义事件名称的规则EventName,定义委托的名称规则NameHandle
g.在触发事件之前一定要判断是否为Null
if(event!=null)
{
触发事件
}
h. public static Receive (object Sender , Event e) // sender是的窗体本身 e继承与Event的事件
3.Array是集合的基类
a.因为类的静态成员属于类,而不能与对象绑定,所以静态对象也不能作为属性
b.静态属性石属于类的
4.如果想在类内使用成员(类)变量的方法,则应将该成员(类)变量初始实例化,eg:
class heaterWater
{
public Alarm _al=New Alarm();
public void heatWater( )
{
....+=New Temp ( _al.MakeAlert) //如果不实例化al,则al的方法调用不出来
}
5. 尤其是类的static 引用成员变量最好(一定)要初始实例化,(至少New 一个空间出来,才能调用其中的方法),eg:
class A
{
private static ArrayList _Arr_Stu=new ArrayList( );
}
6.事件只能在自己所定义的类内调用,在其他类内只能绑定,而不能调用
7.获取键盘的数值:
ConsoleKeyInfo confo
ConsInfo=console.ReadKey(true) //true 不显示,false显示
8.可以重写Array.sort( ) //Icompare--->重写这个接口来完成特定的排序,只需要随便定义一个雷中重写就可以了
a. public class SortByName:system.collection.Icompare
{
// 重写
}
b. Sort(Array , New SortByName( ) )
c. 接口的子类实例就等同于父类接口的实例(也是一种多态)
9.转换方式
a. Convert---> 适合于多数的类型进行转换(尤其是值类型)
b. as ---->适合于引用类型进行转换,且编译期间不报错
***********************集合**************************
1.集合都需要实例化,Array不需要(时一种特殊的数组)
2.所有集合中都是Object元素
3. Stack s= New Stack ()
s.Push("A") //数值型的数据传递时-->就是Copy,无论是否是字面量或者变量都是一样,引用传递地址,所以只能是变量
4. HashTable 键值对
键相当于索引,可以使任何类型,键不能相同,值可以相同
5.
生成 ----->编译期间
> -------->运行期间
6. SortList类似于HashTable,添加完成后会自动排序
7.
foreach( DictionaryEntry item in sorted)
{
console.writeLine(...item.key ,item.value) // foreach 从sorted等集合中读出的是每个元素的引用地址
}
8.
a. 字典类:hashTable ,SortedList 都有GetEnumerator方法来得到一个迭代的对象(使用 .MoveNext( ) 方法来迭代) ,但是SortedList多一个SortedList.GetByIndex方法来进行索引迭代
b.字典的key就相当于索引
***********************泛型***********************
1.可以重写Icompareble 接口来----->使用Array.Sort(Array,Icompare)---->来进行排序
2.
a. 集合中都是object类
b. List是ArrayList的引申(相似)
c. Dictionary于hashTable(相似)
d. hashtable和sortedList自动排序
3.hashtable和Dictonary使用MoveNext( ) 的区别:
hashtable.GetEnumerator 然后 .key就可以得到Key;Dictionary.GetEnumenrator 然后 .Current.key ---->得到key
4.队列的泛型
Array和ArrayList都有Sort方法,可以对Icompare重写来实现指定的排序
5.泛型接口
a.继承与List的都可以排序
b.Dictionary(字典集合)--->自动排序(不用排序)
c.队列(不用排序)--->已经强制排序
6.
string stringinput ="123+4/5*3-4+5%2/3"
Regex r=New Regex(@"\d+")
string [ ] ops=r.split(stringinput) ---->好东西,可以根据正则表达式冲string中提取符合对顶的字符串(例如:\D \d)
********************调试异常******************
1.及时窗口---->相当于表达式
2.异常
a.不异常抛出的话,程序会终止
b.Exception 异常的基类(系统异常,应用系统异常)
c.异常一般发生在方法执行时 *(!!)
d. finally即使之前有return ,也会执行
e. finally中不能使用return和 goto
f. 在小方法内部的异常最好throw抛出异常到该方法外(否则只能在小方法内捕获异常),然后被调用的大方法中所捕获
show ( )
{
throw ...//小方法中抛出异常 ----------------> public static void Main( )
} {
show( ) ----> Main中调用show方法,可以在Main中捕获show抛出的异常
}
*************************窗体************************
1.整个窗体叫做容器
a.调用起始主界面的窗口程序也有入口文件
b.界面类和后台代码同时存在,才能打开
c. private void FrmLoad..
{
窗口加载后的事件
}
d.窗体显示方法 .show( ) --->不锁定窗体,可创建多个窗体 showDialog( )---->锁定窗体,不继续执行
e. initializeComponent( ) 中
一般先执行,只有生成控件后控件才可以使用,所以自定义的代码放在其后
f. 父子窗口传递参数,不要再子窗口的初始化中进行(intial...),而是要在子窗口的构造函数中完成
g. 窗口中的控件初始设置修改,可以放在 ...load事件中设置 //initialComponent( ) 中一般是属性中设置的选项
h. 两个相同的控件添加相同事件时要重置,否则会使同一个事件
i. initializeComponent 在load( )事件之前, > load 事件在窗口显示之前 > 窗口显示
2.异常处理的好处就是:可以让程序处理完异常以后继续执行( 尤其是运行期)
3. focus---> 当前控件获取光标
4. 容器汇总可以嵌套容器
5. 写文字必须使用lable
6. 窗体关闭时必须关闭线程time(否则会一直运行) ---->在Form.Closing 事件中关闭
7. 对话框可以直接使用,不用new ------>来实例化,例如:
if( colorDialog.showDIalog( )==.....)
8. 容器可以用于逻辑分组(eg: chechBox) 对于单选分组
9. ....group.add 控件add到什么容器下就属于什么容器
10. 引用类型的变量被赋值时,要么有一个现成的实例(堆上)的地址赋予给它,要么要new 一个实例,然后将地址赋予给它
11. string.IsNullorEmpty(text) -->可以用来判断一个string是否为空
12.
....(object sender ,keyprossEvent e)
{
if(....) { e.handled =true ;} ---->不执行事件
}
13. string path= Application .startupPath +@"\calc.exe" --->可以不用"\\"了
以上是本进程存放的路径
14.每个控件都可以绑定一个tag(类型是object的,可以储存一些控件的信息)
15. Text.contain(" .") //string的一个方法
16. TextBox.text.indexof(string ,int index) //index 指的是字符,在文本汇总的索引
17.如果想使用(触发)某个控件的键盘和鼠标事件,必须使该控件处于active状态----->focus( )状态
******************数据结构*****************
1.数据结构要有关系(数学模型) :线性结构,树状结构,网状结构
2.链表:单链表,双链表
3. public Node( object data) :this(data,null,null) //初始化列表,先调用Node有四个参数的构造函数进行构造
*******************I/O******************
1. Application.stortupPath --->当前项目路劲
2. 当对文件流进行读写时,peek( ) 紧随其移动直到末尾,peek=-1
3. st=new streamReader(filestrream) // 文件流操作完后都要关闭
4.
sw.writeline()
sw.flush() ---> 每次写入后一定要清空 flush( )
sw.close()
5. path.GetTempFileName( ) 获取临时文件路径
6. sw.flush( )--->保证缓存中数据少
sw.Dispose( ) ----->释放托管的资源
7.FileInfo和StreamFilek都可以创建文件
8.二进制文件是以byte方式写入的
9.文字以外的需要二进制方式类读写
10.
UTP8 Encoding utf= new UTF8Encoding ( )
byte[ ] bytes=utf.GetBytes(string)
fs,write (bytes,0,bytes.length()) //以字节形式赌徒要设置UTF8Encoding编码
11.可以以字节(单个字节)或二进制(机器码)方法读取文件,而且一次都是一个字节