注:本文主要给不熟悉C#的,或想加深C#基础知识的人阅读,如果是技术牛人,请绕行,以免耽误您的宝贵时间。
使用C#要先弄明白一下知识:声明变量、变量的初始化和作用域、C#的预定义数据类型、在C#程序中使用条件语句、循环语句和跳转语句指定执行流、枚举、名称空间、Main()方法、基本命令行C#编译器选项、使用System.Console执行控制台I/O、使用内部注释和文档编制功能、预处理器指令、C#编程的推荐规则和约定。C#的基础知识是后面使用C#开发程序的基础,阅读完本章后,读者就有足够的C#知识编写简单的程序了,但还不能使用继承等面向对象特征,这些内容将在以后介绍。
一、简单的C#程序
1.在文本编辑器中输入下面的代码,保存为后缀名为.cs的文件,如保存为:First.cs。
1 using System;
2
3 namespace Wrox
4 {
5 public class MyFirstClass
6 {
7 static void Main()
8 {
9 Console.WriteLine("Hello World!");
10 Console.ReadLine();
11 return;
12 }
13 }
14 }
2.对源文件运行C#命令行编译器(csc.exe),编译这个程序:csc First.cs 此时就会在相应目录下生成First.exe文件,双击该文件即在编辑器中显示Hello World!
二、变量
1.在C#中声明变量使用下面的语法:datetype identifier,如int i;声明了int变量i,编译器不允许在表达式中使用这个变量,除非用一个值初始化这个变量。
2.声明i之后,就可以使用赋值运算符(=)给他赋值:i=10;还可以在一行代码中声明变量并且赋值:int i =20;
3.可以在一条语句中声明和初始化多个相同类型的变量:int i=1,j=2;
4.类型推断(type inference)使用var关键字,这时编译器可以根据变量的初始值推断变量的类型。如:var someNum=100;等价于int someNum=100;
变量一旦声明确定类型之后就不能改变类型了,就必须遵循其他变量类型遵循的强类型化规则。
5.变量的作用域是可以访问该变量的代码区域,一旦出去该区域,该变量就不可以在使用。
6.常量是其值在使用过程中不会发生变化的变量,在变量的前面加上关键字const,就可以把该变量指定为一个常量。const int a = 100;
常量必须在声明时初始化;
常量的值必须能在编译时用于计算,不能从一个变量中提取的值初始化常量;如果这样做请使用只读字段;
常量总是静态的,注意不可以用static修饰const常量。
三、预定义数据类型
1.值类型和引用类型:从概念上看,区别是值类型直接存储其值,应用类型存储对值的引用。
2.CTS类型:在C#声明一个int类型时,实际上是.Net结构的System.Int32的一个实例。
3.预定义值类型:内置的CTS值类型表示基本类型,如整形、浮点型、字符型和布尔类型。
如:sbyte-System.SByte,short-System.Int16,int-System.Int32,long-System.Int64,byte-System.Byte,ushort-System.UInt16,uint-System.UInt32,ulong-System.UInt64,float-System.Single,double-System.Double,decimal-System.Decimal,bool-System.Boolen,char-System.Char。
4.预定义的引用类型:
object-System.Object是所有类型的基类型,所有其他的类型都是从object直接或间接继承而来;
string-System.String。
四、流控制--控制流程语句
1.条件语句:if..else;switch..case语句;
2.循环语句:for循环;while循环;do..while循环;foreach循环;
3跳转语句:goto语句;break语句;continue语句;return语句;
五、枚举--用enum修饰
枚举是用户定义的整数类型,创建枚举可以使代码更易于维护,有助于确保给变量指定合法的、期望的值,枚举使代码更清晰,允许用描述性的名称表示整数值。简单应用如下:
1 class EnumExample
2 {
3 public enum TimeOfDay
4 {
5 Morning=0,
6 Afternoon=1,
7 Evening=2
8 }
9 public static int Main()
10 {
11 WriteGreeting(TimeOfDay.Morning);
12 return 0;
13 }
14
15 static void WriteGreeting(TimeOfDay timeOfDay)
16 {
17 switch(timeOfDay)
18 {
19 case TimeOfDay.Morning:
20 Console.WriteLine("Good Morning");
21 break;
22 case TimeOfDay.Afternoon:
23 Console.WriteLine("Good Afternoon");
24 break;
25 case TimeOfDay.Evening:
26 Console.WriteLine("Good Evening");
27 break;
28 defult:
29 Console.WriteLine("hello!");
30 break;
31 }
32 }
33 }
C#枚举的真正强大之处是它们在后台会实例化为派生于基类System.Enum的结构,表示可以对它们调用方法,执行有用的任务。实际上,一旦代码编译好,枚举就成为基本类型,与int和float类似。
可以从字符串中获取枚举值,请看下面一段代码:
1 TimeOfDay time = (TimeOfDay)Enum.Parse(typeof(TimeOfDay),"afternoon",true);
2 Console.WriteLine((int)time);
这样就会返回1,Enum.Parse()方法实现从字符串中获取枚举值,并转化为整数。Enum.Parse()的第一个参数是要使用的枚举类型,第二个参数是要转换的字符串,第三个参数指定转换时是否忽略大小写。
六、名称空间
名称空间提供了一种组织相关类和其他类型的方式,与文件或组件不同,名称空间是一种逻辑组合,而不是物理组合。名称空间以句点(.)隔开,最后是类名。如:System.Date.DbHelp。命名空间通过Using语句引入。如:Using System.Date;
七、Main()方法
C#程序是从方法Main()开始执行的,这个方法必须是类或结构的静态方法,并且其返回值必须是int或void,Main()方法要么不带参数,要么是string类型的数组(string[] args)。我们给入口点方法指定什么级别并不重要,即使把该方法标记为private,它也可以运行。
八、控制台I/O
Console.Write();Console.WriteLine();注意可以添加一个格式字符串以及一个可选的精度值,主要格式字符串有C:本地货币格式,D:十进制格式,E:科学计数法(e的大小写确定指数符号的大小写),F:固定点格式,G:普通格式,N:用逗号表示千分符,P:百分数格式,X:十六进制格式。如下输出为:¥940.23,¥940.2,¥940.2300。
1 decimal i=940.23m;
2 Console.WriteLine("{0:c}",i);
3 Console.WriteLine("{0:c1}",i);
4 Console.WriteLine("{0:c4}",i);
还有一个技巧是,可以使用占位符来代替这些格式字符串,如下输出为:.23。
1 double d = 0.234;
2 Console.WriteLine("{0:#.00}",d);
因为如果在符号(#)的位置上没有字符,就会忽略该符号,如果在0的位置上有一个字符,就用这个字符代替0,否则显示0。
九、使用注释
1.//This is a singleline comment
2./*This comment
spans multiple lines*/
3.XML文档:通过///可以把包含类型和类型成员的文档说明的XML标记放在代码中。
十、C#预处理指令:以#开头,不会转化为可执行代码中的命令,但是会影响编译过程的各个方面。
1.#define、#undef告诉编译器存在或删除给定名称的符号,通常和#if一起使用;
2.#if、#elif、#else、#endif告诉编译器是否要编译某个代码块,如:
1 int DoSomeWork(double x)
2 {
3 #if DEBUG
4 Console.WriteLine("x is "+x);
5 #endif
6 }
这段代码会像往常那样执行,但Console.WriteLine命令包含在#if字句中,只有在前面的#define命令定义了符号DEBUG后才执行。当编译器遇到#if语句后,会先检查相关符号是否存在,如果存在,就编译#if字句中的代码。否则,编译器会忽略所有的代码,知道遇到匹配的#endif指令为止。
3.#warning,#error:编译器遇到它们时会分别产生警告和错误,如果编译器遇到@warning指令,会给用户显示@warning指令后面的文本,之后编译继续进行。如果编译器遇到#error指令,就会给用户显示后面的文本,作为一条编译错误消息,然后会立即退出编译,不会生成IL代码。
4.#region,#endregion:用于把一段代码标记为有给定名称的一个块。
5.#line:可以用于改变编译器在警告和错误信息中显示的文件名和行号信息。
6.#pragma:可以抑制或还原指定的编译警告。#pragma指令可以在类或方法级别执行,下面例子禁止“字段未使用”警告,然后在编译MyClass类后还原该警告。
1 #pragma warning disable 169
2 public class MyClass
3 {
4 int neverUsedField;
5 }
6 #pragma warning restore 169
十一、C#编程规则
1.标识符的规则:标识符是给变量、用户自定义类型和这些类型的成员指定的名称,标识符区分大小写,C#中的标识符有两条规则:首字符必须为字母或下划线,不能把C#关键字用作标识符。
C#保留关键字有很多这里不再列举,如果需要把某一保留字用作标识符,可以在标识符前面加上前缀符号@,告知编译器其后的内容是一个标识符,而不是C#关键字,即class不是有效标识符,而@class是有效标识符。
标识符也可以包含Unicode字符,用语法\uXXXX来指定,如\u005fdentifier是有效标识符。
2.用法约定:任何一种开发语言都有一些传统的编程风格,是一种约定。
在许多情况下,名称都应使用PascaI大小写形式,Pascal大小写形式指名称中单词的首字母大写,如EmployeeSalary,类型中所有私有成员字段的名称都应是camel大小写形式,camel大小写形式
指名称中除首个单词外的单词首字母大写。如employeeSalary。