C#学习记录2——语言基础
第二部分关于c#语言的一些基础,大部分学过Java,C++的就差不多,so我就只写写C#里面特有的了
1.输出语句带参数列表
其实就是上一节里面的那个System.Console.WriteLine()方法,C#为这个方法提供了一个很灵活的输出形式
1 System.Console.WriteLine("myInt : {0}, myInt1 : {1}", myInt, myInt1);
很简单,就是在双引号里面用大括号{}和参数index来代表后面的参数列表;实例中:{0}表示myInt,{1}表示myInt1
不过有几点需要注意:一个是保证myInt和myInt1在前面已经被声明并且赋值,否则不能通过编译。
另一个就是要保证{}里面的数不要超过后面参数和列表的有效范围(从0开始)。
2.有关调试和运行
如果直接通过调试然后直接运行程序,你会发现程序运行之后直接就退出,没有时间查看结果。
解决方法就是,在程序的结尾加入一句话
Console.ReadKey();
它将使程序在此暂停等待用户输入任意一个字符。
3.枚举类型
这个在其他语言里面也有,不过C#里面有一些区别
class Program { enum ClothSize : uint { Small = 1, Large = 2, } static void Main(string[] args) { System.Console.WriteLine("Size: {0}",ClothSize.Large); System.Console.WriteLine("Size2: {0}", (uint)ClothSize.Small); Console.ReadKey(); } }
通过枚举声明了一种称为ClothSize的类型,来表示衣服的尺码。:unit表示它的基类型,也就是里面是使用unit(即unsigned int)表示。这里如果不说明的话则默认为是int,并且这里不可以使用char!!!一定注意。
例外枚举的声明要在任何方法之外,作为类里面的一个成员变量存在,如果将其写在例如Main()的方法里面是不可以的。做好准备之后,可以调试运行了
结果如上图。这里体现了枚举值得两种表现形式。如果不加说明,默认的将使用其符号名,也就是枚举声明时使用的名字(如Large,Small);如果想使用枚举常量的值(具体的1或2等等),需要通过类型转换,在前面加上(unit)等。
3.判断语句
在if,while,do_while,for等语句里面包含了一个判断语句,如果之前习惯使用其他的语言,那么可能已经养成了一个习惯,就是用0和非0这样的表示方法代替true或false。这种方法在C#里面是不允许的。C#里面所有的判断语句必须使用返回值为布尔类型的语句。这样做保证不会出现一些没有注意到的错误。例如,常见的if( temp = 2)。本意是使用==,这样一个=会返回2这个值,如果是在其他语言里是能够通过的,但是C#会保证进行提醒,要求更正。
4.switch语句
C#里面的switch语句,不允许在某一case不是空的情况下继续向下进行。不过既然这个case里面没有任何动作,何必加它呢·······
如果希望进行某一个case之后转换到其他的case,使用goto。<但是强烈不建议,会使程序变得很难读,转来转去的@@>
5.foreach语句
这个在java里面有,C++11里面也添加了。但是还是特别的说一下。
1 int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 2 foreach (int num in arr) 3 { 4 System.Console.Write(num + " "); 5 } 6 Console.WriteLine("遍历"); 7 Console.ReadKey();();
通过foreach对数组进行遍历。这里说一个要注意的事情,writeline()里面通过+来将两段文字组合,要注意如果只是想添加一个空格隔开,一定要用双引号“ ”将空格包起来。如果用单引号‘ ’,那么根据引号之外的类型:如果是可以转换成int型的,例如char,那么会把两部分都转换成int(空格的int为32),然后两部分相加;如果不能转换成int,例如string,那么就会被当成空格输出。所以为了保证是空格,使用双引号更保险。
另外,不能通过foreach对in前面的变量进行赋值等改变,例如
1 foreach (int num in arr) 2 { 3 num--; 4 } 5 Console.WriteLine("遍历");
这样是会出现错误的。可以理解为,num只是一个引用变量(C/C++里面概念),即通过指针进行访问,改变它也没有任何意义。
~~~!!!求更详细的解释!!!~~~
下面一个尝试在foreach里面对arr数组进行改变
static void Main(string[] args) { int [] arr= {1,2,3,4,5,6,7,8,9,10}; int temp =0; Console.WriteLine("声明数组后"); foreach (int num in arr) { System.Console.Write(num + " "); } Console.WriteLine("\n下面再foreach里面尝试改变arr数组"); foreach (int num in arr) { System.Console.Write(num + " "); arr[temp]++; temp++; System.Console.Write(num + " "); } Console.WriteLine("\n尝试改变之后的数组"); foreach (int num in arr) { System.Console.Write(num + " "); } Console.WriteLine(); Console.ReadKey(); }
注意看到,在第二个foreach语句中,是能够对arr数组里面的值进行修改的,也就是说这个集合是实实在在存在的,可以对它操作。但是in前面的这个num还是不会变。
~~~~!!!求解释!!!~~~~
6.short circuit evaluation
中文为“短路测试”。其实所有语言都有,但是因为当时我学的时候就有点不理解,所以在这还是说一说。
这个短路主要是指在AND与,和OR或判断时,可以只判断前面一个,而忽略后面一个。
if( (x !=null) && (x.instance>=50))
这个AND判断,如果第一句返回false,就会跳过后面第二句话的判断。
if( (x == null) || (x.instance<50))
这个OR判断和上面相反,如果第一句为true就不会进行后面一句了
这样做的好处是,有时后一句话的判断要建立在第一句成立的情况下,否则会出项异常。
向上述的两个例子,如果x是空,那么久不应该再进一步对它的成员变量进行判断,否则会出NullPointerException