C#核心语法.docx
- 文档编号:22779550
- 上传时间:2023-04-27
- 格式:DOCX
- 页数:49
- 大小:46.61KB
C#核心语法.docx
《C#核心语法.docx》由会员分享,可在线阅读,更多相关《C#核心语法.docx(49页珍藏版)》请在冰豆网上搜索。
C#核心语法
目录
1.特殊的数据成员1
2.数组(array)1
3.命名空间(namespace)2
4.方法的参数传递2
5.构造器(constructor)3
6.析构(Destructor)4
7.访问控制修饰符5
8.类型转换6
9.属性(Property)7
10.索引器(indexer)8
11.委托(delegate)10
12.事件(event)11
13.虚方法(virtual)13
14.抽象类(abstract)14
15.接口(interface)14
16.排序(IComparable与IComparer)17
17.扩展方法19
18.密封类和密封方法(sealed)20
19.yieldreturn语句动态的返回集合20
20.多线程的应用20
1.特殊的数据成员
(1)常量const
定义方式:
constintg=10;
注意:
常量的值必须在声明时初始化,常量的值不可变化,常量本身就是静态的不能使用static修饰。
(2)只读字段readonly
定义方式:
privatereadonlyintt;
注意:
只读字段必须在声明时或类构造方法中初始化,只读字段的值不可变化,只读字段不一定是静态的可以使用static修饰。
2.数组(array)
(1)一维数组
定义方式:
int[]array=newint[num];
int[]array={1,2,3,4,5,6};
int[]array=newint[]{1,2,3,4,5,6};
(2)多维数组
定义方式:
int[,]array=newint[low,row];
int[,]array={{1,2},{5,6}};(一维的维度要一致)
int[,]array=newint[2,2]{{1,2},{5,6}};
(3)不规则数组(数组的数组)
int[][]array=newint[3][];
array[0]=newint[]{1,2,3,4};
array[1]=newint[]{1,2,3};
array[2]=newint[]{1,2};
int[][,]array=newint[3][,];
(4)数组遍历
遍历规则数组:
for(inti=0;i { for(intj=0;j (1);j++) { Console.Write(array[i,j]+""); } Console.WriteLine(); } 遍历不规则数组: for(inti=0;i { for(intj=0;j { Console.Write(array[i][j]+""); } Console.WriteLine(); } 3.命名空间(namespace) C#命名空间与Java的包一样,不同的程序文件里的类可以在同一命名空间里。 命名空间可以嵌套。 4.方法的参数传递 (1)值传递 代码形式: 方法名称(参数类型参数名称) 说明: 此方式并无特别之处。 (2)引用参数(ref) 代码形式: 方法名称(ref参数类型参数名称) 说明: 传递参数的引用可以改变原参数(实参),但是需要初始化实参。 下面代码输出1。 classProgram { staticvoidadd(refinti) { i++; } staticvoidMain(string[]args) { inti=0;//必须先初始化 add(refi);//调用时必须加ref Console.WriteLine(i); } } (3)输出参数(out) 代码形式: 方法名称(out参数类型参数名称) 说明: 传递参数的引用可以改变原参数(实参),但是在使用前需要初始化参数。 下面代码输出100。 classProgram { staticvoidadd(outinti) { i=0;//必须在使用前初始化 i=100; } staticvoidMain(string[]args) { inti; add(outi);//调用时必须加out Console.WriteLine(i); } } (4)传递可变数量的参数(params) 代码形式: 方法名称(params参数类型参数名称) 说明: 传递的参数数量不定,可以变化。 下面的程序输出123。 classProgram { staticvoidPrint(paramsint[]array) { foreach(intiinarray) { Console.Write(i+""); } } staticvoidMain(string[]args) { Print(1,2); Print(3); } } 5.构造器(constructor) (1)创建对象的过程—无参构造器 classA { publicA(inti){} } classB: A {} classProgram { staticvoidMain(string[]args) { newB();//无法创建对象 } } 以上的程序无法创建B类对象,因为创建B类对象调用B类的默认构造器时会默认的调用其基类A的无参构造器,而A类却没有无参构造器,所以不能创建B类对象。 (2)使用base调用基类构造器 classA { publicA(inti){} } classB: A { publicB(): base(5){}//调用A类的有参构造 } classProgram { staticvoidMain(string[]args) { newB();//可以创建对象 } } (3)静态构造器(Java中的静态初始化器) 静态构造器最多执行一次,执行在静态成员初始化完毕之后。 下面程序输出20。 classProgram { staticvoidMain(string[]args) { Console.WriteLine(A.i); } } classA { publicstaticinti=10; staticA() { i=20; } } 6.析构(Destructor) (1)析构函数(Finalize操作) 下面程序运行结果: 构造A构造A析构A析构A。 classProgram { staticvoidMain(string[]args) { newA(); newA(); } } classA { publicA() { Console.Write("构造A"); } ~A()//析构 { Console.Write("析构A"); } } (2)在一般情况下不要实现析构函数,这会影响垃圾回收的性能。 (3)显示调用垃圾回收: GC.Collect()会建议程序调用垃圾回收,微软强烈建议不要这样做! (4)释放模式,IDisposable接口 classA: IDisposable { privatebooldisposed=false;//标志是否已释放资源 protectedvirtualvoidDispose(booldisposing) { if(! this.disposed) { if(disposing) { Console.WriteLine("调用所引用的类的Dispose()方法! "); } Console.WriteLine("调用类本身的非托管资源! "); disposed=true; } } publicvoidDispose() { Dispose(true);//调用手动释放资源 GC.SuppressFinalize(this);//阻止调用终结器 } ~A() { Dispose(false); } } 对于下面主方法,执行结果: 调用类本身的非托管资源! classProgram { staticvoidMain(string[]args) { Aa=newA(); } } 对于下面主方法,执行结果: 调用所引用的类的Dispose()方法! 调用类本身的非托管资源! classProgram { staticvoidMain(string[]args) { Aa=newA(); a.Dispose(); a.Dispose(); } } (5)对于继承了IDisposable接口的类,使用using简化try{}finally{} 对于下面的两个主方法,执行结果都是: 使用a对象 调用所引用的类的Dispose()方法! 调用类本身的非托管资源! classProgram { staticvoidMain(string[]args) { Aa=newA(); try {Console.WriteLine("使用a对象");} finally {a.Dispose();} } } classProgram { staticvoidMain(string[]args) { Aa=newA(); using(a)//使用using { Console.WriteLine("使用a对象"); } } } 7.访问控制修饰符 (1)修饰符的访问范围(空白表示不能访问) 访问控制修饰符 类内部 子类 程序集内 程序集外 default 可以访问 public 可以访问 可以访问 可以访问 可以访问 private 可以访问 internal 可以访问 可以访问 可以访问 protected 可以访问 可以访问 protectedinternal 可以访问 可以访问 可以访问 子类可以访问 (2)总结: 在C#1.0中,不声明任何修饰符,默认是私有的方法,也就是说default与private一样。 当父类和子类在同一程序集时,子类可以访问父类的internal成员,当父类和子类不在同一程序集时,子类不可以访问父类的internal成员,但可以访问父类的protectedinteral成员。 8.类型转换 (1)使用checked与unchecked检测抓换的异常(如: 溢出) 下面程序会出现溢出异常,而中断执行。 classProgram { staticvoidMain(string[]args) { longa=1000000000000; intb; b=checked((int)a);//使用checked检测是否溢出 } } 下面程序会忽略溢出异常。 classProgram { staticvoidMain(string[]args) { longa=1000000000000; intb; b=unchecked((int)a);//使用unchecked忽略溢出异常,默认也是忽略溢出异常 } } (2)使用is判断类型 下面程序的执行结果: TrueFalseTrueTrue classA {} classB: A {} classProgram { staticvoidMain(string[]args) { Aa=newA(); Bb=newB(); Console.WriteLine(aisA); Console.WriteLine(aisB); Console.WriteLine(bisA); Console.WriteLine(bisB); } } (3)使用as操作符(使用as比is效率高) classA {} classB: A {} classProgram { staticvoidMain(string[]args) { Aa=newA(); Bb=aasB;//转换失败返回null if(a! =null) { Console.WriteLine("转换成功"); } } } 9.属性(Property) (1)使用属性访问私有成员 classA { privatestringm_name; publicstringName { get {returnm_name;} set { if(value! =null)//赋值前的处理 m_name=value; } } } classProgram { staticvoidMain(string[]args) { Aa=newA(); a.Name="lizhiwei"; Console.WriteLine(a.Name); } } (2)访问静态成员的属性 classA { privatestaticintm_num=0; publicA() { m_num++; } publicstaticintNum { get {returnm_num;} } } classProgram { staticvoidMain(string[]args) { newA(); Console.WriteLine(A.Num); newA(); Console.WriteLine(A.Num); } } 10.索引器(indexer) (1)使用索引器 下面程序运行结果: 12 classA { privateint[]array=newint[20]; publicintthis[intindex]//索引器 { get {returnarray[index];} set {array[index]=value;} } } classProgram { staticvoidMain(string[]args) { Aa=newA(); a[0]=1;//访问索引器set a[19]=2;//访问索引器set Console.WriteLine(a[0]+""+a[19]);//访问索引器get } } (2)索引器的重载 下面的程序运行结果: lizhiweili classA { privateHashtablem_map=newHashtable(); publicstringthis[stringkey]//索引器 { get {returnm_map[key].ToString();} set {m_map[key]=value;} } publicstringthis[intkey]//重载索引器 { get {returnm_map[key].ToString();} set {m_map[key]=value;} } } classProgram { staticvoidMain(string[]args) { Aa=newA(); a["001"]="lizhiwei"; a[2]="li"; Console.WriteLine(a["001"]+""+a[2]); } } (3)多参数的索引器 下面程序运行结果: 2010 classA { privatestringm_name; privateintm_age; privatestringm_sex; publicstringName { get {returnm_name;} set {m_name=value;} } publicintAge { get {returnm_age;} set {m_age=value;} } publicstringSex { get {returnm_sex;} set {m_sex=value;} } } classB { privateArrayListm_list=newArrayList(); publicintthis[stringname,stringsex] { get { foreach(Aainm_list) { if(a.Name.Equals(name)&&a.Sex.Equals(sex)) { returna.Age; } } return-1; } set { Aa=newA(); a.Name=name; a.Sex=sex; a.Age=value;//value的类型与返回值类型一致(这里是int) m_list.Add(a); } } } classProgram { staticvoidMain(string[]args) { Bb=newB(); b["李志伟","男"]=20; b["张三","男"]=10; Console.Write(b["李志伟","男"]+""+b["张三","男"]); } } (4)注意: 索引器不能是静态(static)的! 11.委托(delegate) (1)委托的使用(类似指向函数的指针) 下面程序运行结果: 李志伟 delegatevoidPrintDelegate(strings);//申明委托 classA { publicvoidPrint(strings)//与委托的返回值、参数相同的函数 { Console.WriteLine(s); } } classProgram { staticvoidMain(string[]args) { Aa=newA(); PrintDelegates=newPrintDelegate(a.Print);//新建委托链 s("李志伟");//执行委托连 } } (2)委托链的使用 下面程序的运行结果: a1李志伟a2李志伟a2李志伟 a1李志伟a2李志伟 delegatevoidPrintDelegate(strings);//申明委托 classA { privatestringname; publicA(stringname) { this.name=name; } publicvoidPrint(strings)//与委托的返回值、参数相同的函数 { Console.Write(name+s+""); } } classProgram { staticvoidMain(string[]args) { Aa1=newA("a1"); Aa2=newA("a2"); PrintDelegates=newPrintDelegate(a1.Print);//新建委托链 s+=newPrintDelegate(a2.Print);//增加委托链 s+=newPrintDelegate(a2.Print);//增加委托链 s("李志伟");//执行委托链 Console.WriteLine(); s-=newPrintDelegate(a2.Print);//减少委托链 s("李志伟");//执行委托链 } } (3)直接使用委托调用匿名方法 delegatevoidPrintDelegate(strings);//申明委托 classProgram { staticvoidMain(string[]args) { PrintDelegates=null; s+=delegate(stringtemp){Console.WriteLine(temp);};//委托指向匿名方法 s("李志伟");//执行委托连 } } (4)使用Action 当委托没有返回值时使用Action 例如: classProgram { privatevoidHello(stringname)//无返回值 { Console.WriteLine("你好,"+name+"! "); } privatestringGETAge(intage)//有返回值 { Console.WriteLine("我的年龄: "+age+"! "); return"我的年龄: "+age+"! "; } staticvoidMain(string[]args) { Programp=newProgram(); Action //Action action("李志伟");/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 核心 语法
![提示](https://static.bdocx.com/images/bang_tan.gif)