第二章:C#基础(c#高级编程 第6版)(未完)
1. 除了使用VS编译C#源文件,还可以使用CSC.exe编译器编译。
- 最方便的办法是运行 开始->程序->VS-> VS Tools-> VS command prompt
在目录下运行:
csc fileName.cs - 或者在配置了相应的环境变量后在cmd窗口运行上述命令
- 如果要将文件编译成dll:
csc /t:library fileName.cs - 如果要在编译的时候引入dll:
csc fileName.cs /r:dllName.dll
2. C#变量名区分大小写
3. C#把“未初始化变量”当做错误来处理
- 变量是类或者结构中的字段,如果没有显示初始化,创建这些变量时,会总动初始化默认值
- 变量是方法的局部变量,必须显示初始化,之后才能使用,否则会产生错误。
4. 声明一个变量仅为对象创建一个引用。但这个引用还没有指向任何对象(有别于c++)
5. 变量的作用域冲突
- 局部变量之间的作用域冲突
- 在循环语句内声明的变量,作用域仅在循环体内
- 同名的变量不能在同一个作用域内声明两次(即不像c++那样允许变量隐藏)
- 字段和局部变量的作用域冲突
using System; namespace Wrox.ProCSharp.Basics { class ScopeTest2 { static int j = 20; //字段 Console.WriteLine(j); public static void Main() { int j = 30; // 局部变量 Console.WriteLine(j); return; } } }
-
输出结果:30
-
6. 常量
- 常量必须在声明时进行初始化
- 初始化的值不能从一个变量中提取(如果要这么做需要使用只读字段)
- 常量总是静态的,不能使用static修饰
- 示例
Const int a = 100;
7. 值类型和引用类型
8. String
- 虽然String是引用型的变量,但是与一般的引用类型有所区别,如有代码:
using System; class StringExample { public static int Main() { string s1 = "a string"; string s2 = s1; Console.WriteLine("s1 is " + s1); Console.WriteLine("s2 is " + s2); s1 = "another string"; Console.WriteLine("s1 is now " + s1); Console.WriteLine("s2 is now " + s2); return 0; } }
- 输出结果为:
s1 is a string
s2 is a string
s1 is now another string
s2 is a string - 即对s1的改动没有影响对s2的改动。
- 过程是这样的:开始创建并初始化s1, 会在堆上分配一个新的string对象,在初始化s2的时候,s2的引用也指向这个对象。但是改变s1的值,而不是替换的时候,堆上会新的值分配一个新的对象,而s2变量仍指向原来的对象。
- 输出结果为:
9. Switch语句
- 示例
switch (integerA) { case 1: // do something break; case 2: // do something break; default: // do something break; }
- case 的值必须是常量表达式
- 如果case子句不含break或者goto跳转语句,将编译错误
- 例外:如果一个case子句为空,就可以从这个case跳转到下一个case上
- case子句的排放顺序无关紧要,但是不能有相同值的case语句
- 与c++不同,可以使用字符串作为测试变量
10. foreach循环不能改变集合中各项的值,如要改变,需使用for循环
11. goto跳转语句
- 示例:用于跳转到用户指定标签处
goto label1; // other code label1: Console.WriteLine(" jump to here...");
- 限制
- 不能跳到for循环这样的代码块中
- 不能跳出类的范围
- 不能退出到try…catch块后面的finally块
- 好处:在switch语句的case子句之间跳转
12. 枚举类型
- 示例
using System; namespace Wrox.ProCSharp.Basics { public enum TimeOfDay { Morning = 0, Afternoon = 1, Evening = 2 } class EnumExample { public static int Main() { WriteGreeting(TimeOfDay.Morning); return 0; } static void WriteGreeting(TimeOfDay timeOfDay) { switch(timeOfDay) { case TimeOfDay.Morning: Console.WriteLine("Good morning!"); break; case TimeOfDay.Afternoon: Console.WriteLine("Good afternoon!"); break; case TimeOfDay.Evening: Console.WriteLine("Good evening!"); break; default: Console.WriteLine("Hello!"); break; } } } }
- 从字符串中提取枚举值
TimeOfDay time = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), "afternoon", true); Console.WriteLine((int)time);