第二章: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);

posted on 2010-12-05 20:08  I过T  阅读(332)  评论(0编辑  收藏  举报

导航