博客园  :: 联系 :: 管理

【C#】基础知识

Posted on 2010-10-18 16:21  独孤雁  阅读(205)  评论(0编辑  收藏  举报
  • 变量的作用域和访问级别
  • 申明各种数据类型的变量
  • 在C#程序中控制执行流
  • 注释和XML文挡说明
  • 预处理器指令
  • 用法规则和命名规定(略)

 

1.编译运行C#程序:新建xx.cs文件->设置环境变量->打开命令行提示符->cscxx.cs->编译代码->自动生成xx.exe 注意:未设置环境变量的两种解决方法:(1)运行csc之前,命令行运行批处理文件%Microsoft Visual Studio2005%\Common7\Tools\vcvars32.bat,其中,Microsoft Visual Studio2005是安装VS2005的安装目录.(2)开始->程序->Microsoft VisualStudio 2005->Microsoft Visual StudioTools子菜单->Microsoft Visual Studio 命令提示

2.修饰符static表示方法不能在特定实例上执行,因此不必先实例化类再调用。

3.变量:datatype(数据类型)identifier(变量名)

int i;编译器不让我们使用变量,除非初始化该i变量,但它在堆栈中分配了4个字节以保存其值。

变量的初始化:(1)值类型初始化:int i=1;(2)引用类型初始化:SomethingobjSomething =new Something();

4.变量作用域:可以访问该变量的代码区域

(1)同名变量不能在同一作用域内申明两次:如int i=20;...;inti=30;是错误的

(2)循环内部同名变量可以在同一作用域内申明两次:如for(int i=0;i<10;i++){...};for(inti=9;i>=0;i--){...};是正确的。

(3)同名变量在循环体外只能申明一次,不能在循环内继续申明。

(4)字段(申明为类型级的变量)和局部变量(申明为方法级的变量)在同一作用域不冲突:classcar{static int i=20;public static voidMain(){int i=30;Console.WriteLine(i);return;}}

如何引用类级变量?object.fieldname(类名.字段名)

如何访问实例字段(该字段属于类的一个特定实例)?this.fieldname(this.字段名)

5.常量:const inti=20;(值不会在使用过程中发生变化称~,在C#中只把局部变量和字段申明为常量)

常量特性:(1)必须声明时初始化,指定值后不修改(2)在编译时能用于计算(3)常量总是静态的,不必用static修饰(4)用易于理解的清楚的名称代替了不明确的数字或字符串(5)使程序更易于修改(6)易于避免程序出错。

6.预定义数据类型:值类型(存储在堆栈中)、引用类型(存储在托管堆中)。

y=null;(表示不引用任何对象),基本数据类型int、bool、long都是值类型;而复杂的包含许多字段的较大类型(通常有类的情况下)规定为引用类型。

7.CTS类型:(如上一章介绍)string s=i.ToString();inti=s.ToInt32();

 

8.预定义的值类型:基本数据类型(整型、浮点类型、字符类型、bool类型)+引用类型

(1)基本数据类型:

整型(8个):sbyte(System.SByte)8位有符号整数、short(System.Int16)16位有符号整数、int(System.Int32)32位有符号整数、long(System.Int64)64位有符号整数、byte(System.Byte)8位无符号整数、ushort(System.Uint16)16位无符号整数、uint(System.Uint32)32位无符号整数、ulong(System.Uint64)64位无符号整数。(无符号:0~2n-1,有符号:-2n-1~2n-1-1)

uintui=1234U;long l=1234L;ulong ul=1234UL;

浮点型(2个):float(System.Single)32位单精度浮点数(n=7位)、double(System.Double)64位双精度浮点数(n=15/16位).

未指定非整数类型则默认为double类型。如想指定为float,则最后加字符F(或f):floatf=12.3F;

Decimal类型(1个):decimal(System.Decimal)128位高精度十进制数表示法(n=28位),专用类型以及算财务货币。decimald=12.30M(精度更大的数字)

Bool类型(1个):bool(System.Boolean),值为true或false.注意:bool值和整数值不能相互转换。

字符类型(1个):char(System.Char),表示一个16位的Unicode字符。注意:不允许在char类型和8位byte类型间进行隐式转换。虽然8位足够编码英语中的每个字符和0~9数字了,但他们不够编码更大的符号系统中的每个字符(比如中文),因此有了16位Unicode模式,ASCII编码就是Unicode的一个子集。chara=‘A’(字符用单引号而不用双引号)。4位16进制Unicode值:'\u0041';带有数据类型转换的整数值:(char)65;表示16进制数:'/x0041'.

转义序列:\' 单引号 、\''双引号、\\ 反斜杠、\0 空、\a 警告、\b 退格、\f 换页、\n 换行、\r回车、\t 水平制表符、\v垂直制表符

注意:C#本身有一个string类型,所以无须将字符串表示为char类型的数组。

(2)引用类型:

object(System.Object)根类型,CTS中的其他类型都是从它派生而来的(包括值类型)

string(System.String)Unicode字符串

注意:stringfilepath="C:\\ProCSharp\\First.cs"<=> stringfilepath=@"C:\ProCSharp\First.cs"

@后面表示所有字符都看作是原来的含义,同时也可以包含换行符。

 

9.流控制:(1)条件语句:if(condition){statement(s);},else{statement(s);}

if(condition1){statement(s);},else if(condition2) {statement(s);}...elseif(condition N) {statement(s);} statement(s);

switch(condition){casecondition1:statement(s);break;casecondition2:statement(s);break;...default:statement(s);break;}

注意:case的值必须是常量表达式,不允许使用变量。运行时它禁止所有失败的条件。只有当使用goto语句特别标记要激活的后面case子句,才会允许继续执行,同时标记没有break的每个case子句为错误。解决方案:令一个case子句为空,就可以从这个case跳到下一个case,这样就不需要用goto语句来跳转子句产生非逻辑错误了。值相同的不同常量所表示的case不能使用,但不同值的常量的case的排放顺序是无关紧要的。switch...case语句的另一个作用在于可以用字符串测试变量。

(2)循环语句:for循环:for(inti=0;i<100;i++){...}

嵌套的for循环用于矩形多维数组中遍历每个元素,最外部的循环遍历每一行,内部循环遍历某行上的每一列。每次迭代外部循环时,内部循环要彻底执行完毕。for(inti=0;i<100;i+=10){for(intj=i;j<i+10;j++){...}...}

while循环:while(condition)statement(s);先判断循环条件,后执行循环。

do...while循环:do{...}while(condition);先执行至少一次循环,后判断循环条件。

foreach循环:迭代集合总的每一项.foreach(inttemp in arrayOfInts){...}

注意:不能改变集合中各项的值(temp)。

(3)跳转语句:goto语句:不能跳转到像for循环这样的代码块中,也不能跳出类的范围,不能退出异常处理try...catch后面的finally块。在switch...case语句之间跳转使用goto语句相当方便,其他情况下goto语句不受欢迎。

break语句:退出各种循环,循环结束后就执行后面的语句。若放在嵌套的语句中,则执行最内部循环后面的语句。若放在switch语句或循环外部则编译错误。

continue语句:必须在各种循环中使用,只从循环的当前迭代中退出,然后从下一次迭代开始重新执行,而不是退出循环。

return语句:退出类的方法,把控制返回方法的调用者,若有方法返回值,则返回这个类型的值。

 

10.枚举:publicenumTimeOfDay{Morning=0,Afternoon=1,Evening=2},枚举可以调用方法执行有用的任务。例如:TimeOfDaytime=TimeOfDay.Afternoon;Console.WriteLine(time.ToString());

从字符串获取枚举值方法:TimeOfDaytime2=(TimeOfDay)Enum.Parse(typeof(TimeOfDay),"afternoon",true);Console.WriteLine((int)time2);

注意:第一个参数:要使用枚举的类型:typeof(枚举类名),第二个参数要使用的字符串,第三个参数是bool指定在转换时是否忽略大小写?Enum.Parse()实际上返回一个对象引用,把这个字符串显式转换为需要的枚举类型。

 

11.数组:数组类型 []数组名

初始化数组:int[]integers=new int[32];注意:数组总是引用类型,无论它各个元素是不是值类型。

访问数组元素:integers[0]=32;表示第1个数组元素值是32.

动态分配数组内存位置:int[]integers;integers =newint[32];首先不进行初始化,创建一个空引用,然后用new关键字把这个引用指向请求动态分配的内存位置。

查看数组包含多少元素:intnumElements=integers.Length;

12.命名空间:namespacexx{class yy} <=> xx.yy

注意:命名空间与程序集无关。不允许在另一个嵌套命名空间中声明多部分的命名空间。

13.using语句:便于使用其他命名空间中的类。

命名空间别名:using别名aa=xx; 使用别名实例化一个xx对象x1:aa::xx x1=new aa::xx();

14.Main()方法:主程序入口必须是类或结构的静态方法static,且返回类型必须是int或void

public static intMain(){...} 或 public static void Main(){...} 或 public static intMain(string[] args){...}

编译多个Main()方法使其成了主程序入口点:使用/main,即:cscxx.cs/main:所属类的全名

15.编译C#文件:/t:exe控制台应用程序(默认)、/t:library 带有清单的类库dll、/t:module 没有清单的组件、/t:winexeWindows应用程序(没有控制台窗口) /out输出的C#文件名、/reference或/r(程序集的路径和文件名),在未引用的程序集中引用类型。

 

16.控制台I/O:Console.Write()指定值写入控制台、Console.WriteLine()输出结果最后添加一个换行符

格式化输出:int i=10;intj=20;Console.WriteLine("{0}+{1}={2}",i,j,i+j);{0}{1}{2}分别表示第1,第2,第3个参数。也可以指定宽度w:{n,w}表示第n-1个参数的值宽度是w,调整文本在该宽度中的位置,正值表示右对齐,负值表示左对齐。如-{0,2}左对齐的第一个参数的值的宽度是2

预定义类型格式字符串:C-本地货币格式 D -十进制格式(给定精度说明符则加上前导符0) E-科学计数法(指数),格式字符串的大小写(e,E)确定指数符号的大小写  F-固定点格式,精度说明符设置为小数位数,可以为0. G -普通格式(使用E,F格式取决于哪种格式更简单)N-数字格式(用逗号表示千分符)P -百分数格式 X -16进制数格式(精度说明符用于加上前导符0),例如:C2表示两位小数的货币单位。

 

17.注释://单行注释 “”

XML文挡注释说明:///<c>把行中的文本标记为代码</c><code>把多行标记为代码</code><example>标记为一个代码实例</example><exception>说明一个异常类</exception><include>包含其他文挡说明文件的注释行i</include><list>把列表插入到文挡说明中</list><param>标记方法的参数</param><paramref>表示一个单词是方法的参数</paramref><permission>说明对成员的访问</permission><remarks>给成员添加描述</remarks><returns>说明方法的返回值</returns><see>提供对另一个参数的交叉引用</see><seealso>提供描述中的“参见”部分</seealso><summary>提供类型或成员的简短小节</summary><value>描述属性</value>

编译为程序集生成XML文挡说明:csc /t:library/doc:xx.xml xx.cs

生成xx.xml文挡说明:<?xmlversion="1.0"?><doc><assembly><name>xx</name></assembly><members><membername="T:命名空间的类名"><summary>...</summary><returns>...</returns><paramname="aa"></param></members>其中“T:”表示这是个类型,“F:”表示这是个字段,“M:”表示这是个成员

 

18.C#预处理器命令:

#define DEBUG定义符号DEBUG,这个符号不是实际代码的一部分,而只在编译器编译代码时存在。

#undef DEBUG删除符号的定义。若符号不存在,#undef没有任何作用。若符号存在,则#define也不起作用。必须把#define和#undef命令放在C#源代码开头,在声明要编译的任何对象的代码之前。

#if #elif #else#endif条件编译(先检查符号是否存在,若存在只编译#if块中的代码,否则会忽略所有的代码直到遇到匹配的#endif指令为止)

#warning #error警告和报错编译(使用#error可以检查#define语句是否做错什么事,而使用#warning可以让自己想起做过什么事)

#region #endregion把一段代码标记为给定名称的一块

#line可用于改变编译器在警告和错误信息中显示的文件名和行号信息。#line default可以把行号恢复为默认的行号

#pragma抑制或恢复指定的编译警告,可在类或方法上执行,对抑制什么警告和抑制时间进行更精确的控制