简单的控制台应用程序。
代码(它有把某条消息写到屏幕上的一个类组成)
编译并运行程序得到结果:
在上面的代码示例中,前几行代码与名称空间有关,名称空间是把相关类组合在一起的方式。namespace关键字声明了应与类相关的名称空间。编译器在using语句指定的名称空间中查找没有在当前名称中定义但在代码中应用的类。
using Systme;
namespace Work
{
如果没有using,就必须完全限定对Console.WriteLine()方法的调用,如下
System.Console.WriteLine("Hello from Worx.");
标准的System名称空间包含了最常用的.NET类型。C#没有用于输入和输出的内置关键字,而是完全依赖于.NET类。 声明一个类MyFirstClass全名(Worx.MyFirstCSharpClass:)
所有的c#代码都必须包含在一个类中,类的声明包括class关键字其后是类名和一对花括号。与类相关的所有代码都应放在这对花括号中。
每个c#可执行文件都必须有一个入口点,那就是Main()方法(M大写)
public static void Main()
{
在启动时调用这个方法时,该方法要么没有返回值(Void),要么返回一个整数(int).在c#中方法的定义如下:
[modifers] return_type MethodName([parameter])
{
//Method body. NB.This code block is pseudo-code.
}
第一个方括号中的内容表示可选关键字。有两个修饰符public和static,public表示在任何地方使用,所以可以在类的外部调用它。static表示方法不能在类的实例上执行,因此不必先实例化类在调用。把返回类型设置为void,.
WriteLine()是一个静态方法。
声明变量:datatype identifier
声明int变量i.然后赋值(=)i=10;并初始化它的值int i=10;还可以声明和初始化多个变量int x=10,y=20;在多个变量的声明中,不能指定不同的数据类型:int x=10;bool y=true;int x=10,bool y=true;
变量的初始化
c#有两个方法可确保变量在使用前进行了初始化:1变量在类或结构中的字段,如果没有显示初始化,创建这些变量时,其默认值就是0。2方法的局部变量必须在代码中显示初始化,之后才能子语句中使用它们的值。如果检测到局部变量在初始化之前就使用了它的值,就会产生错误。
c#中错误的语句:
错误的信息:
类型推断使用var关键字。编译器可以根据变量的初始值推断的变量类型:
int someNumber=0;
就变成var someNumber=0;
下面是另一个小例子:
程序输出如下:
遵循规则:1变量必须初始化,否则编译器就没有推断变量类型的依据。2初始化不能为空。3初始化必须放在表达式中。4不能把初始化器设置为一个对象,除非在初始化器中创建了一个新对象。
变量的作用域是可以访问该变量的代码区域。
1局部变量的作用域冲突,不能用的代码是:
这段代码使用了两个for循环打印0--9的数字,在逆序打印0--9的数字重要的是同一个方法中,代码i声明了两次,可以这么做的原因是,两次声明,i都是在循环内部声明的所以变量i对于个子的循环来说都是局部变量。
例子:
会产生如下错误:
其原因是:变量j时在for循环开始定义的,在执行for循环时应处于其作用域内,在Main()方法结束后,变量j才超出作用域,第二个j(不合法)则在循环的作用域内,该作用域嵌套在Mian()方法的作用域内,编译器无法区分这两个变量,所以不允许声明第2个变量。
字段和局部变量的作用域冲突:代码:
在本例中,当Mian()方法中断,程序结束时,才会删除该类。
要引用类级变量,使用语法objectfieldname,上例,访问的是静态字段。就只能用类本身的名称:
常量,它的值在使用的过程中不会发生变化的变量。变量变常量在变量前面加上关键字const,例如:const int a=100;常量的使用规则:在声明时必须初始化。常量的值必须能在编译时用于计算。常量总是静态的。
预定义数据类型
数据类型:1值类型。2应用类型。区别:值类型直接储存其值,引用类型储存对值得引用。储存位置:值类型储存在堆栈中,而引用类型储存在托管堆上。
定义了一个类Vector,Vector是一个引用类型,他有一个int类型的成员变量Value:
在执行代码后,只有一个Vector对象。
如果变量是一个引用,就可以把其值设置为null,表示它不能引用任何对象:y=null;
如果将引用设置为null,显然就不可能对他调用任何非静态的成员函数或字段,这么做会在运行期间抛出一个异常。
在.NET中,short有16位长,Int有32位,long类型有64位。所有的整形类型的变量都能被赋值予十进制或十六进制,后者需要0x前缀:long x=0x12ab;
浮点类型:
double数据类型比float数据类型大,提供的精度也大一倍(15位)
decimal类型表示精度更高的浮点数。
bool类型包含布尔值TRUE或FALSE
字符类型
CHAR类型的字面量使用单引号括起来的。'A'
string类型 就是System.String.
其输出结果为:
if语句
if(condition)
statement(s)
else
statement(s)
如果在条件中执行多个语句,就需要用花括号({...})把这些语句结合为一个块(这也适用于其他可以把语句组合为一个块的c#结构,如for和while循环)
bool iszero;
添加到if子句中的else if语句的个数不受限制。
if子句中的表达式必须等于布尔值。不能直接测试整数,而必须明确地把返回的整数转换为布尔值TRUE或FALSE如,将值与0或null进行比较:
switch语句测试intergerA变量的值:
下面代码说明了如何使用goto模拟失败,得到的代码会非常混乱:
另一种情况,如果一条case语句为空,就可以从case调到下一条case上,就不用goto语句都可以处理两条或多条case子句了。
c#中的switch语句与c++中的switch的语句的另一个不同之处:在c#中,可以把字符串用作测试的变量。
for循环语句如下:
for循环典型用法,输出0——99的整数:
实际上c#在给变量加1时有一种简化方式,即不使用i=i+1,而简写为:i++.
下面的代码显示数子行,他还使用另一个Console方法Console.Write(),该方法的作用与Console.WriteLine()相同,但不在输出中添加回车换行符:
结果是:
while循环:
while循环体中的语句把布尔标志设置为FALSE,结束循环,如:
do...while循环:
forreach循环语法:
goto语句:
break语句——在switch语句中使用它推出某个case语句。break也可以用于退出for,foreach,while或do。。。while,该语句会使控制流执行循环后面的语句。
枚举:枚举可以使代码更易于维护,有助于确保给变量指定合法的,期望的值。枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊,变化多端的数来表示,。
timeofday枚举:
会返回字符串Afternoon.
名称空间
名称空间提供了一种组织相关类和其他类型的方式。与文件或组件不同,名称空间是一种逻辑组合,而不是物理组合。
在名称空间中嵌套其他名称空间,为类型创建层次结构:
using语句类型:
假如类NamespaceExample同时存在于Work.proCSharp.Basics和Work.proCSharp.oop名称空间中,如果要在名称空间Worx.ProCSharp中创建一个类test,并在该类中实例化一个NameespaceExample类,需要指定使用的类:
名称空间的别名语法:using alias=NamespaceName;
多个Main()方法:
错误:
如果有多个Main()方法,编译器就会返回一个错误消息。可以使用/main选项,其后跟Main()方法所属类的全名(包括名称空间),明确告诉编译器把那个方法作为程序的入口点:
给Main()方法传递参数
下面的例子ArgsExample.cs是在传递给Main()方法的字符串数组中循环,并把每个选项的值写入控制窗口:
有关编译c#文件的更多内容。
如果想得到一个可由.NET运行库加载的非执行文件比如DLL就必须把它编译为一个库。
下面的例子说明如何编译类库,并在另一个程序集中引用这个库。包含两个文件。
类库。控制台应用程序,该应用程序调用库中的一个类。
控制台调用其Add()方法,在控制台窗口中显示结果:
控制台I/O
要从控制台窗口中读取一行文本,可以使用Console.ReadLine()方法,它会从控制台窗口中读取一个输入流,并返回输入的字符串。所有的预定义类型在大多数情况下,在显示值之前不必将他们转换为字符串。Console.WriteLine()还允许用与c的printf()函数类似的方式显示格式化的内容。
每个标记都包含一个基于0的索引,表示列表中参数的序号,如,{0}表示列表中的第一个参数,代码:int i=10;
int j=20;
Console.WriteLine("{0} plus{1} equals {2}",i,j.i+j);
会显示:
10 plus 20 equals 30
如果要使用格式字符串,应把它放在给出参数个数和字段宽度的标记后面,并用一个冒号把它们隔开。例如,要把decimal值格式化为货币格式,且使用计算机上的地区设置,精度为两位数,使用C2:
使用注释
单行//...,多行/*...*/;
XML文档
功能:根据特定的注释自动创建XML格式的文档说明,这些注释都是单行注释,但都以3条斜杠开头。
#define和#undef
#define用法#define DEBUG #undef正好相反——他删除符号的定义:#undef DEBUG 如果符号不存在,那么就无意义。同样,如果符号已经存在,则#define也没有作用。必须把#define和#undef命令放在c#源文件的开头位置,在声明要编译的任何对象的代码之前。#define本身没有啥作用,但如果与其他预处理命令放在一起,那么功能就强大了。
#if,#elif,#else,#endif
#warning #erro
#line指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息。
#pragma指令可以抑制或还原指定的编译警告。
c#编程规则
尽管可以包含数字字符,但它们必须以字母或下划线开头。不能把c#关键字作为标示符。
c#中的约定是命名变量时不使用任何前缀:string Result;string Message;.
名称的大小写:注意,名称空间和类,以及基类中的成员等的名称都应遵循该规则。
类型中所有私有成员字段的名称都应是camel大小写形式:
private int subscriberId;注意成员字段的前缀常常用一条下划线开头;private int_stuscriberId;
传递给方法的所有参数的名称都应该是camel大小写形式:public void RecordSale(string salesmanName,int quantity);
名称空间的名称非常重要。微软建议使用如下
名称不应与任何关键字冲突。
字段用法
字段应总是私有的,但在某些情况下也可以把常量或只读字段设置为共有。因为如果把字段设置为共有,就不利于以后的扩展或修改之类。