C#语言学习记录
1.&& || ! 与或非—逻辑运算符,&&的优先级大于||。
2.常量:定义时:const 类型 常量名称=常量值 如:const PI=3.14;在定义时赋值,在其他时候不能改变。
3.枚举:让我们定义一种枚举类型,并且在定义这种类型是我们要指定这个类型的所有值,一般用来定义那些确定了所有情况的量。
语法:enum 自己定义的名称 {值1,值2,...,值n};枚举的定义一般和类定义在同一个级别(定义在命名空间之下)。比如:enum gender{male,female};
定义枚举时值不能是Int类型。可以强制转换成Int类型,默认编号:0,1。。。。;也可以自己定义值enum gender{male=1,female};则后面的递增。
字符串类型转换成枚举类型:(自定义枚举)(Enum.Parse(typeof(自定义枚举),待转换的字符串))。
4.结构:一个整体有很多不同的属性,用结构来表示很多这种整体。如:存储一个人的所有信息:名字,性别等。和类定义在同一个级别。
语法:访问修饰符 struct 结构名 public struct people
{ {
定义结构成员 public string name;
方法等 public string sex;
} }
5.数组:可以帮我们一次性申明多个同类型的变量。这些变量在内存中是连续的。如 int[] age=new int[5];使用时通过下标来找。赋值可以:int[] age=new int[]{1,2,3...},数组名.Length获得数组的长度。
6.函数(方法):将一堆代码进行重用的机制。可能有输入值,和返回值。 一般方法都要定义在class中。如果没有返回值,用void,一个方法只有一个返回值。调用:类.方法名。return退出方法。
方法语法:[访问修饰服][static] 返回值类型 方法名([参数])
{
方法体
}
一个变量定义在类的里面,就叫做类的字段,能被类中所有方法访问,但是静态(static)方法只能访问静态字段。方法不管是不是静态的都能访问常量。由const修饰的常量不能定义成为静态。
7.方法重载:在同一类下,方法名相同,且方法的参数个数不同或同位置参数的类型不同才能构成方法重载。
8.在方法中参数如果使用out了的话,一定要在方法中赋值,这个参数不是用来传入的是用来传出的,int.TryParse(s, out b); out可用于方法返回多个值。
ref也能向方法里面传值又能向外面返值。如果用了out或者ref的话,那么调用者和方法中的参数都会相应改变(快捷方式)。
完整课程
- 属性(property):lable.text对象的一个特征或者特性。方法(method):xx.setbounds(x,y,w,h)设置对象的动作或者功能。事件(event):click 要用+=,指对象和外界的一种通知机制。
- 程序的基本组成就是类(class),变量以及方法等都要写在类里面。几点注意:对象的生成(new),事件的注册(+=)
- c#的数据类型分为两大类:
- 值类型(value type) 如:int double size datetime数据直接存在栈,字符串类型前面加上@后就不转义。
- 引用类型(refrence type) 如: button label person 数据存到堆,栈去存储引用信息
- 无符号:sbyte(1个字节),short(2个字节),int(4个字节), float(4个字节),double(8个字节)
- 逻辑运算的短路运算:&&只要一边为假则另一边就不判断了,||只要一边为真另一边就不判断了。注意整形提升:byte,short,char运算时都转化成int
- 数组:1先分配空间,2操作元素。数组的复制:Array.Copy(source(源数组),0,dest(目标数组),0,source.length)
- 类:构造方法:在类的方法里面有一类特殊的方法,是完成对象的初始化,1、构造方法的方法名和类名相同,2、构造方法没有返回值也不能写void,构造方法不能显式的访问,要用new。
- 属性:实际上是方法,比字段要多:可以只读写,可以检查if
- 索引:
修饰符 类型 this[参数列表] { set{} get{} }
属性和索引是对字段进行访问和扩充
- 继承:通过冒号来表示,都是单继承,默认所有类都是继承Object。如果需要的是一个父类的对象,来一个子类的对象是完全可以的。可以用as来强制类型转化,Student s1= p1 as Student (如果能转换就是New一个,如果不能转换就是null),as运算符只能针对引用类型。is运算符(用来判断一个对象是不是一个类(或者子类)的实例))if(p1 is Person)
virtual public void SayHello(){ //定义方法 //virtual表示可以被子类override Console.WriteLine("Hello! My name is " + name ); }
与父类同名的方法
-
一是定义同名、但参数列表(签名)与父类不同的方法,这称为对父类方法的重载(Overloading)
-
二是定义同名且参数列表也与父类相同的方法,这称为新增加一种方法,用new表示
-
三是定义同名且参数列表也与父类相同的方法,而且父类的方法用了abstract或virtual进行了修饰,子类的同名方法用了override进行了修饰,这称为虚方法的覆盖(Overriding)
-
- 使用base可以调用父类的方法。
- 修饰符:
- 访问控制符:public:在任何地方都可以访问,private:只在同类中可以访问。protected:除了自己外,还可以在子类访问。internal:在相同程序集里面可以访问。protected internal:在子类和相同程序集里面可以访问。
- static:不能访问实例变量,调用时要直接用类名去访问,有时候可以用来表示“全局变量”,属于类而非实例。
- const:相当于静态常量,只能用于基本类型和string,还可以修饰局部变量。readonly:相当于不可变量,只能赋一次值,只能修饰字段。
- sealed类:不可以继承,一般系统类(string console math),abstract类:不可实例化,要用(new)Array。abstract 类型 方法名(参数列表); abstract 类型 属性名{get;set;}
- public/private/internal/protected是访问控制符
-
static属于类的而非实例的
-
const常量readonly只读量
-
sealed不可继承的
-
abstract抽象的,不可实例化
- 接口:
-
-
- 接口实际上是一个约定:Icloneable,接口是抽象的成员的集合,接口是一个引用类型,比抽象更抽象。
- 定义接口:先约定好,再在别的地方实现
public interface IStringlist { void Add(string s); int Count(get;); string this[int index]{get;set;}; } 注意:public 和abstract这两个关键字不用写出来。
- 实现接口:实现之前的约定的接口
class 类名:[父类,]接口,接口 { public 方法(){...} }
- 显式接口成员实现:在实现多个接口有同名的方法时,方法名前要写接口名:void IWindows.close()。调用时只能用接口调用:((IWindows) f).close();
-
-
- 结构以及枚举
-
- :结构常用来表示较简单的多个分量(字段),可以有方法属性等成员。
- struct是值类型的,是sealed的。结构不能包含无参数构造方法。
- 在定义字段时不能给初始值。
- 构造方法中必须对每个字段赋值。
- 实例化时用new,但是与引用型变量的内存是不一样。
- 值类型变量在赋值时是实行的是字段的copy
- 枚举实质上来说是整数,是值类型,就是把几个可以列举的常量用符合来表示。
enum mycolor { red, green=1, yellow=2 }
- 赋值以及比较: mycolor c = mycolor.red if(c==mycolr.red) switch(c){case mycolor.red:..}
- 与字符串的转化: console.writeline(c.tostring()) ; c = (mycolor)Enum.Parse(typeof(mycolor),"red");
- 结构主要用来表示多个分量,枚举主要用来表示符合化的常量。他们都是值类型。
-
- 委托
- 委托的声明: public delegate double Mydelegate(double x)
- 委托的实例化: Mydelegate d=obj.method
- 委托的调用: 委托名(变量) d(8.9)
- 委托的合并:一个委托实例中可以包含多个函数,调用委托就是调用多个函数,函数间的顺序没有意义,返回值也没有意义。可以用运算符:+ - += -+来进行运算。 cd3= cd1+cd2//call m1 then m2
- 跨线程调用一定要用invoke()函数,加一个委托。
- :委托是对函数原型的包装,也可以把多个函数同时绑定起来,调一下就可以依次全部调用了
- 事件:>>>>回调函数,封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。
- 事件的声明:public event 委托名 事件名 ,声明一个事件类似于声明了一个封装了的委托类型的变量。
- 事件的注册与移除:事件名 +=或-=(在事件所在类的外面只能用以上两个运算符)
- 事件的发生(激发):事件名(参数列表)-相当于回调所注册的函数
- Lambda表达式:
- 泛型有一个<>。
- 匿名方法:delegate(参数){方法体},隐私转化为委托:new Thread(delegate(参数){方法体})
- lambda表达式就是对匿名方法的简写:(参数)=>(表达式或者语句) PlotForm(x=>x*x,1,12)
- 运算符重载:
- public static 类型 oprator 一元运算符(类型 参数){。。。} :一元运算符的声明
- public static 类型 operator 二元运算符 (类型 参数)(。。。) :二元运算符的声明
- public static implicit operator 类型(类型 参数名){。。。} :类型转换运算符的声明
- public static explicit operator 类型(类型 参数){。。。} :类型转换运算符的声明
- 异常处理:
-
try{......} catch(Aexception ex){ .....}
catch(Bexception ex){ .....}
catch(一般的异常 ex){.....}
finally{.....}越仔细的异常写在前面,越一般的异常写在后面。
- throw抛出异常: if(xxx) { throw new someexception(信息) }
-
- 基础算法:
- random类:.Next(100)(生成0~100之间的随机数),.NextDouble()(生成0~1之间的数),如果要用更强的随机数: System.Security.Cryptography .RNGCryptoServiceProvider
- DateTime类是值类型:new DateTime(),.now(取当前的时间),.tostring("yyyy-MM-dd HH:mm:ss")*(转化成字符串),.AddMinutes(5)(加5分钟),.Year .Mounth .Day .Date, TimeSpan(两个日期相减得到一个时间差)
- string类:Substring(inx,len)获取下标从inx开始长度为len的自字符串。.Trim() .TrimEnd()去空格,.Padleft()在左边填充空格,.Insert()插入,.Remove()移除,.Split(';')切片成数组,string.join()。string的内容不变(immutable),stringbuilder是可变的 .Append .Remove .Replace .length .Tostring 在循环中使用s+=...会带来效率问题,最好使用Stringbuilder。
- 集合:数组(ArryList)或者哈希表(键值对)等,访问集合的时候可以用foreach(类型 变量 in xxx)。泛型:如list<string> 、字典,有更好的类型检查以及性能。
- 遍试:把所以的情况都测试一遍。for中用if
- 迭代:多次使用同一算法。while中用n=f(n)
- 递归:分而治之。f(n)中用f(n-1)
- 流和文件:
- Stream类:是信息流的一个抽象
- 按存取位置分:FileStream(文件流),MemoryStream(内存流),BufferedStream(缓存流)
- 读写类:对于内容的区别
- BinaryReader和BinaryWriter(二进制读写)
- TextReader和TextWriter(文本读写)
- StreamReader和StreamWriter
- StringReader和StringWriter
- 其关系:包装的关系
-
FileSteam fs = new FileStream("C:\A.TXT") StreamWriter wr = new StreamWriter(fs)
- System.Io所包含的常用类:
- Directory:公开用于创建、移动和枚举通过目录或子目录的statis方法
- DirectoryInfo:公开用于创建、移动和枚举通过目录或子目录的实例方法
- File:提供用于创建、复制、移动、打开和删除文件的静态方法,并协助创建FileStream对象
- FileInfo:提供用于创建、复制、移动、打开和删除文件的实例方法,并协助创建FileStream对象
- FileSteam:公开以文件为主的Stream。既支持同步文件操作,也支持异步文件操作。
- StreamReader:实现一个TextReader,使其以一种特定的编码方式从字节流中读取字符。
- StreamWriter:实现一个WriterReader,使其以一种特定的编码方式从字节流中写入字符。
- TextReader:表示可读取连续字符的阅读器
- TextWriter:表示可以编写一个有序字符系列的编写器。该类为抽像类。
- FileSystemInfo:提供FileInfo和SystemInfo的共有方法,当你不确定是文件还是目录的时候使用。
- 文本文件的操作:
- 建立StreamReader:new StreamReader(文件路径,FileCode)StreamReader常用的方法有:readline(读一行), readtoend(全读),read,peek,close。
- 建立StreamWriter:new StreamWriter(文件路径,filemode,filecode) StreamWriter常用的方法有:writerline、writer、flush、close
- 二进制文件的操作:
- FileStream:使用其Seek、Read 方法。
- BinaryFormatter。二进制格式器,可以把文本等序列化到一个流里面,当然也可以反序列化。
FileStream stream = new FileStream("C:\\StrObj.t", FileMode.Create, FileAccess.Write , FileShare.None); formatter.Serialize(stream, book);
- Stream类:是信息流的一个抽象
- 控件:
- 常用控件要在实际中熟悉。
- 绘图以及图像:
- GDI:Graphics Devices Interface:绘图技术。如下代码在一个事件中(点击按钮)然后采用Graphics来进行绘图。
-
Graphics g = this.CreateGraphics(); Pen pen = new Pen(Color.Red,2); Brush brush = new SolidBrush(Color.Green); Font font = new Font("宋体",25); Rectangle rect = new Rectangle(180,180,160,160); g.DrawLine(pen,20,100,140,100); g.DrawRectangle(pen, rect); g.DrawString("GDI图形编程",font,brush,20,20); brush.Dispose();font.Dispose();pen.Dispose();g.Dispose();//关闭这些工具,不能占内存。
- 对于Graphics对象的话一般在使用的时候: using(Graphics g = this.CreateGraphics()){........} 这种相当于try{...}finnaly{g.dipose()}
- 图像处理:Bitmap(位图)是抽象类是从Iamge派生的,可以处理Jpeg,bmp等位图,
Bitmap bt1 = new Bitmap("dada\\da.bmp") Bitmap bt2 = new Bitmap(bt1,200,300) Bitmap bt3 bt3.FromFile("文件名称")
DrawImage:绘制图像。
- 文本处理以及正则:
- 文本处理常用类:Console类,.Write(打印),.WriteLine(打印一行),.ReadLine(读取一行)。String类:是固定的每次运算都会生成新的对象,StringBuilder类:不是每次都会新的对象,可以用Add等方法。System.Text.Encoding类:.Default(系统默认的编码),.UTF8,.GetEncoding("GBK232")给定编码,.GetBytes(str)得到一个字符串的字节,GetString(byte[])得到一个字节数组的字符串。
- 正则表达式:Regex类:Static方法:Regex.IsMatch(s,pattern)(是否匹配)、Regex.Match(s)(匹配一次),Regex.Matchs(s)(匹配多次),Regex.Replace(s,pattern)(替换)。Match对象(匹配的结果),.Groups各组,.value原串,.Result(XXX)替换。(?<名称>XXXX)对分组进行命名、在替换时使用${名称},若不命名则用$1,$2等,$0表示全部匹配。(?i:xxxx)表示选项(忽略大小写),http://www.jb51.net/article/360.htm
面向对象: