这里系统自动创建了一个叫做Program的类,并且里面有个默认的Main方法。在这里,我们程序的类名可以任意的修改,但是Main()方法却必须唯一,修改之后运行会出错。因为Main()方法是我们这个应用程序的入口。错误提示如下:
Main方法是引用程序的入口,处理逻辑都在Main方法内部。而默认,我们生成了一个静态的、有void(空)返回值,接受一个参数字符串数组的形式。不过,这不是Main方法的唯一形式,除此之外,我们还有以下几个签名形式。如果定义的入口函数非空返回值,那么我们必须要程序结束的时候提供一个返回值。(返回值0表示正常结束):
static int Main()
{
return 0;
}
查看参数,可以通过System.Environment类的成员来实现。(Environment.GetCommandLineArgs()),该函数返回一个string数组,可以通过遍历查询该返回数组得到参数。
System.Console类,该类主要有如下三个功能:
1、进行基本的输入输出。如上代码WriteLine方法表示输出在控制台,而ReadLine则表示接受一个输入。除此之外,还有Write和Read方法,用法和他们类似。
2、格式化控制台输出。可以用占位符来格式化,形式如:Console.WriteLine("{0},{1}",123,456);其中占位符的数字对应后面输出参数的次序,从0开始。并且占位符可以不分先后。
3、格式化数值数据。类似于C语言和C++里面的%d,%x的表示输出数字和十六进制格式,这里面可以用D/d和X/x。用法:Console.WriteLine("c format:{0:c}", 9999);
4、除此之外,在控制台应用程序外格式化数值数据。利用string.Format()方法来格式化,用法:string userNum = string.Format("100000 in hex is {0:x}", 100000);
系统数据类型和C#简化符号:
和任何编程语言一样,C#定义了一组用于表示局部变量、成员变量、返回值以及输入参数的基本数据类型。如bool、byte、short、int、long等。不过,和其他的编程语言不同,这些关键字不只是简单的编译器可以识别的标记,C#数据类型关键字其实是System命名空间中完整类型的简化符号,如ulong是System.UInt64的简写。
变量声明和初始化:int myInt; string myString;初始化可以直接赋值int myInt=0;也可以如此,int a=1,b=2,c=a;
内建数据类型和new操作符:所有的内建数据类型都支持默认构造函数,这些类型可以用new开创建。如bool类型,也可以如此表示:bool b=new bool();
数据类型类的层次结构:.net基本数据类型都有一个类层次结构,累的层次结构顶端的类型会为派生类型提供一些默认行为。这些核心类型之间的关系如下图所示:
数值数据类型的成员:我们为了继续研究C#的数据类型,必须知道.net的数值类型支持MaxValue和MinValue属性,这两个属性说明了给定的类型可以存储的范围。用法,int.MaxValue,double.MaxValue等。
System.Boolean成员:它不支持MinValue和MaxValue,因为他只能来源于集合{true|false}。但却支持TrueString和FalseString属性集合(相应地返回True或False)。
System.Char成员:C#的文本数据是由string和char关键字表示的,两者都是基于Unicode的。string表示连续字符,char表示单个字符。
从字符串数据中解析数值(.Parse()方法):这个技术在想把用户输入的数据转换成一个数值的时候非常有用。用法int i=int.Parse("8");
System.DateTime和System.TimeSpan:DateTime表示日期时间,而TimeSpan则允许你方便的使用各个成员定义和转换时间单位。
.net 4 System.Numerics命名空间:它定义了一个BigInteger结构,用来表示较大的数值,它没有固定的上下限。
使用字符串数据:
基本字符串操作:string.Length获取字符串长度、string.ToUpper获取字符串变成大写的值、string.ToLower获取字符串变成小写的值。
字符串拼接:string.Concat(),不过我们也可以通过+号来表示拼接。两者的编译结果是一样的。
转义字符:和C一样,都是反斜杠\,可以将C#中的特殊字符原本的表达出来。
定义逐字字符串:C#中引入了以@为前缀的字符串字面量激发,属于称为逐字字符串。使用它的字符串就不用使用转义字符了。
字符串和相等性:用String的Equals方法或内嵌的相等操作符(==等)来进行相等性操作,这里表示指的是区分大小写、逐字符的相等性操作,虽然String类型是引用类型。
字符串是不可变的:string类型的方法,气势反悔了一个按修改格式的新字符串对象,原来的字符串不会改变的。所以,string类如果被滥用,它就会变得低效、并导致代码膨胀,特别是在字符串拼接的时候。(因为每次操作都要在托管堆上加载一个新的字符串对象,原有的最终会被垃圾回收)
System.Text.StringBuilder类型:此类和System.String类相似,不过为了防止String类出现的低效问题,StringBuilder定义了很多用来替换和格式化片段的方法。它的独特之处在于,当我们调用这个类型的成员时,都是直接修改对象内部的字符数据(因此更高效),而不是或许按修改后格式的数据副本。
窄化和宽化数据类型转换:
即大值和小值只见的运算由于C#是类型安全的,窄化运算会有错误,不过,可以通过强制转换来窄化,但这样很可能造成数据丢失。
C#提供的checked和unchecked关键字将确保数据修士肯定会被检测到。
checked的用法:
用在一句代码里如下:byte sum=checked((byte)Add(b1,b2));
用在一个语句块上,检测是不是强制溢出:
checked
{
byte sum=(byte)Add(b1,b2);
Console.WriteLine(sum);
}
unchecked关键字和checked的关键字用法一样,只不过他会检查所有运算逻辑,进制个别情况系跑出语出的异常。
System.Convert的作用:使用它的一个好处是,它提供了语言无关的方式来进行数据类型的转换(例如,VB的类型转换完全不同的C#)。
隐式类型本地变量(var):
C#语言定义了一种可以使用var关键字创建隐式类型的本地变量。使用var关键字不必指定具体的数据类型(如int、bool、string)。这么做时,编译器将根据本地数据点的初始值类自动推断实际的数据类型。用法如下:
var myInt=0;//表示定义的是个整形,var等同于int
var myBool=true;//表示定义是个布尔值。其中var等同于bool
隐式类型变量的限制:首先,隐式类型只能用于方法或属性范围内的本地变量。用var关键字定义返回值、参数或者自定义类型的字段数据都是不合法的。同样,用var关键字声明的本地变量必须在声明时分配初始值,并且这个初始值不能为null。最后,用C#的?标记定义可控的隐式类型本地变量是不合法的。
隐式类型数据是强类型数据:隐式类型变量在编译时影响变量的生命,之后该数据点将被视为它生命的类型,为该变量分配不同的类型将会导致编译时错误。
隐式类型变量用途:在Linq查询中将会变得非常有用。
C#迭代结构:
for循环,同C和C++中的for循环用法一样,我们可以创建复杂的终止条件,构建无限循环,使用goto、continue、break关键字。
foreach/in循环:C#foreach关键字允许遍历数组中的所有项,不需要测试数组的上线。
foreach结构中使用var,此时,编译器可以准确的判断出该类型的准确的类型。
while和do/while循环:当希望执行一段语句直到满足某个终止条件时,while循环结构很有用。和简单的while循环类似,当我们需要进行一些次数补丁的动作时,可以使用do/while循环。两者的区别是,do/while循环肯定会执行至少一次对应的代码块,而while循环则有可能不会执行就结束。
条件结构和关系/相等操作符:
if/else语句:C#中的if/else语句只能作用域布尔表达式,不能用于诸如-1、0这样的值,因此if/else语句通常会包含一些C#操作符。(==、!=、<、>、<=、>=以及逻辑操作符&&、||、!)。说明:&&和||操作符在必要时都会‘短路’,也就是说,如果一个表达式被确定为false,其他的表达式就不会被检查了。
switch语句:和C系列语言中的一样,switch语句允许我们根据定义的选择来处理程序流程。C#要求每一个case(包含default)包含以break或goto终止的可执行语句来避免失败。
小结:
这一小节我们了解了每一个C#可执行程序的一些基本的结构,以及探讨了一些C#内建数据类型的细节。并且介绍了var隐式关键字和C#支持的条件和迭代语句。接下来的一小节我们将会完成对和新语言特性的研究