在C#中有一些我自己认为比较独特的知识点,这些知识点是我经常使用的知识,但对它们的了解还是比较少的,所以通过查找资料学习,总结了这些独特的知识点并简单叙述,希望对大家有所帮组!其中主要有:var关键字、try..catch..finally、foreach语句、ArrayList类、#region..#endregion等知识点。
隐含类型,使用var来声明任意类型的局部变量。在C#中它仅仅是一个关键字,不代表一种新的类型,它仅是负责告诉编译器:该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量。Var声明变量后,变量类型就确定下来了,不会在变。例:
var str = “Hello world”; //string类型,相当于 string str = “Hello world” var request = (HttpWebRequest)WebRequest.Create(url); //这是http网络编程中我使用的例子,var可用HttpWebRequest类型替换
用于处理异常,通常有三中异常处理语句:
(1).try…catch; //处理异常
(2).try…finally; //清除异常
(3).try…catch…finally; //处理所有异常
try块中包含容易产生异常的代码,使用引发异常语句,接着捕获异常;try块中发生异常后跳转到catch异常处理程序,catch用于异常处理程序,通常格式为:catch(异常类 异常对象实例){…}
例1:(参考自《从零开始学C#》)
int [] nums = {1,2,3,4,5,6,7,8,9}; //定义整形数组 try { for(int i=0;i<=num.Length;i++) { Console.Write(num[i].ToString()+” ”); } } catch(Exception ex) { Console.Write(ex.Message.ToString()); //输入异常错误 }
Try语句捕获异常,由于数组索引从0开始遍历,用“<=”会遍历10次,多遍历一次,出现索引越界,跳转到catch语句先创建一个异常的对象ex并输出错误信息。运行结果如下图所示:
finally用于清除产生错误分配的资源,在使用try..catch..finally语句中即使引发异常,finally块中的代码也会被执行(始终执行),从程序中释放资源。try..catch..finally语句捕获错误、清除并执行应用程序,无论有没有异常都会执行,出现异常是执行顺序为:try->catch->finally;没有异常执行顺序为:try->finally。下面看一个实际工程中使用的例子:
例2:(这是我在C#网络编程中自己编写的代码)
try { Stream=response.GetResponseStream(); //获取应答流 … //具体通讯浏览器操作 } catch (Exception msg) { MessageBox.Show(msg.Message); //异常处理 } finally { stream.Close(); //释放资源:关闭流操作 }
这是C#浏览器中出现异常情况(断开网络连接访问)执行结果如下图所示:
最后注意,处理异常会大大降低性能,所以不要将它用在控制正常程序流程中,如果有可能检测到代码中异常,请替代try..catch..finally操作。如在出发中除数不能为0这个异常我们可以用if判断不为0在进行除法操作,这样就实现了替换。(自定义异常throw这里我就不在介绍了)
foreach语句为数组或对象集合中的每一个元素重复一个嵌入语句组,用于循环访问集合以获取所需信息,需要调用IEnumerable接口,其格式:foreach(类型变量 in 集合) { … //操作}每执行一次,循环变量就依次取集合中的一个元素操作。foreach语句的主要特点是代码简洁,效率又高。
例1:(foreach语句简单迭代)
int [] nums = {1,2,3,4,5,6,7,8,9}; //定义整形数组 foreach(int i in nums) { Console.WriteLine(i); //循环输出数组 } //相当于:for(int i=0;i<nums.Length;i++) {...}
注意:在如上述一维或多维数组遍历中,尽量使用foreach语句,他会自动检查数组的索引,使其不会出现越界错误。而在上面数组访问中for循环语句每执行一次都会对数组索引有效值进行判断是否越界(相当于使用if-else判断),foreach会避免这样情况相对效率较高。同时,如果采用多维数组操作foreach会更加方便,它只需一层循环,而for语句需要多层循环来执行。
例2:(foreach与for语句多维数组对比)
int [,] intArray = new int[4,4] {{5,2},{1,2},{3,4}…} foreach(int i in intArray) { Console.WriteLine(i); } //而采用for语句需要两层循环执行 for(int i=0;i<intArray.GetLength(0);i++) for(int j=0;j<intArray.GetLength(1);j++) Console.WriteLine(intArray[i,j]);
下面是foreach语句我在实际项目工程中的一个简单应用,代码如下:
例3:(foreach语句在实际工程中的简单应用)
int count = 0; //记录选中对象个数 public List<object> aryRects; //存放所有Rectangle对象 public abstract class shape:Object {…} //shape类:属性protected bool BSelected是否被鼠标选中 foreach(shape s in aryRects) { if (s.BSelected) //如果被选中,count+1 { count++; } }
这是一个C#编写画图软件,通过判断在图上已经被鼠标左键选中的图形的个数及相应属性实现移动、删除等功能。运行结果如下:
显然,使用for想实现上面的功能是非常困难,甚至无法实现的,这就是foreach的好处及实际工程中的应用。foreach语句需要注意:这里的循环变量是一个只读型局部变量,如果尝试改变其值或删除会发生编辑错误。
foreach(int I in nums) { i++; //不能修改值 Console.WriteLine(i); } //它提示的错误信息为:i是一个foreach迭代变量,无法为它赋值 foreach(int I in nums) { nums.Remove(i); //不能删除值 Console.WriteLine(i); }
数组通常大小固定后就不能更改,但C#提供了动态数组ArrayList类实现动态添加、插入或移除元素的方法,更加灵活的设置数组大小。在使用该类前必须要声明System.Collections命名空间,ArrayList的属性和方法如下:
ArrayList类属性表
(由于使用CSDN插入表格间距太大,不知道怎样设置行间距,才换成了图片格式,见谅!)
ArrayList类常用方法表
(上面的两个表格都转自孙景瑞的《从零开始学C#》,非常优秀的一本书籍,推荐大家看看,同时感谢作者,这里引用了他的知识结晶)
例:
ArrayList aryList = new ArrayList(); for(int i=0;i<4;i++) { aryList.Add(i); //使用add方法添加4个元素 } Console.WriteLine("ArrayList动态数组中元素的个数为:"+aryList.Count); //Count属性 string[] Str = {"abc","xyz"}; aryList.AddRange(Str); //AddRange(数组名)将Str数组中所有元素添加到aryList动态数组末尾 Console.WriteLine("ArrayList动态数组中元素的个数为:"+aryList.Count); aryList.RemoveAt(1); //删除索引为1的元素(0开始索引)即:数字1(第二项) aryList.Remove("abc"); //删除值第一个为”abc”的值 Console.WriteLine("遍历输出ArrayList动态数组中所有元素"); foreach(object list in aryList) //遍历输出动态数组aryList中所有元素 { Console.WriteLine(list.ToString()); }
输出结果如下图所示:
C#中使用预处理指令可以禁止编译器编译代码的某部分,还可以禁止编译器与额外功能相关的代码,预处理指令的开头都是#符号,如:#define、#undef、#if、#elif、#else、#endif、#warning、#error、#regoin、#endregion、#line、#pragma。这里我主要想讲讲#region..#endregion的用法。
#region..#endregion指令用于将一段代码标记给指定名称的块,实现指定展开或折叠代码块。#region块必须以#endregion指令终止。格式为:#region 名称 ... #endregion.如下图所示:
#region 属性 //状态处理对应的操作菜单 private ContextMenu menuDelSet; private MenuItem menuSet; private MenuItem menuDel; private MenuItem dynamicModel; public LoadData loadData; public List<object> aryRects; //存放所有Rectangle对象 private List<object> aryLines; //存放所有Line对象 public List<VarBase> varList; //存放所有的变量 private List<int> usedModelID; //已使用的模型ID private List<int> toUseModelID; //可用的模型ID //Undo or Redo 规定只保存5次 private UndoBuffer undoB; private shapeRect gRect = null; //在Form中被选中的唯一,模型; private shapeRect gFrom = null; private shapeRect gTo = null; //画线时的from 和 to private shapeLine gLine = null; private Point firstStart; private Point lastStart; //记录鼠标起始位置 private const int iRectW = 80; //状态对象矩形的宽度; private const int iRectH = 40; //状态对象矩形的高度; #endregion
使用它的优点是可以被某些编译器识别,包括Visual Studio .NET编译器,这些编译器可以使用这些指令使代码在屏幕上更好地布局,能隐藏代码便于管理和查看,如下图所示是在工程中隐藏了相应部分功能代码的例子,给人一目了然的感觉。
希望这些知识点能帮助巩固和学习C#知识,同时这仅仅是我在学习C#中遇到的自认为比较特殊的知识点,如果叙述中有错误或不足之处见谅!不太会排版,见谅!
(By:Eastmount 2013-8-25 夜1点http://blog.csdn.net/eastmount/)