《C#高级编程》 读书心得1--核心C# 几点你可能没注意,但很基础的小东西。

这是本系列读书心得第一篇。

其实所谓核心C#也就是C#的语法基础,相信大家应该已经非常熟悉了,在这里说一下在书中看到,大家可能平时没有太注意到的。此篇比较基础,也是第一次写读书心得,请勿喷啊。

变量以及其作用域。

     首先声明变量:可以直接用int i; 其实它是声明一个名为i 的System.Int32的一个实例。 像int, long这样的关键字都是指向.NET预定义类型,也就是说用他们声明的变量是他们所指向的.NET预定义类型的一个实例。在.net中一共有15个这样的预定义类型,13个值类型,2个引用类型(object和string)。如int 对应的System.Int32, long对应System.Int64。 就像大学的时候我们C语言的老师一直都说int变量的值范围为-32768~32767,是因为当时的C语言编译环境为16位。 还要强调一点就是string字符串在C#中为引用类型,也就是说一个string变量是存储在托管堆上的,而像int这样的值类型是存储在堆栈上。

    我们在int上按F12跳转到定义就会看到它其实是一个结构体:public struct Int32, 所一它存储在堆栈上,而string的定义是public sealed class String是一个类。

    在定义一个string a后,并没有为其初始化a的值为null,而int a后a默认为0。 再有string a="123" 声明了一个string类型,然后对其再次赋值a="456",会再次创建一个值为456的实例,而不是修改值为123的实例。int a=9之后int b=a 这样在内存中会生成两个值为9的int结构体实例在堆栈中。还有bool变量只接受true或者false,而不会接受0或者1不会对其隐式类型转换。bool变量的默认值为false。

    关于int对应System.Int32,bool对应System.Boolean等其实都是结构,他们都是继承于System.ValueType, 而System.VauleType又继承与System.Object. 所以他们的实例都可以进行ToString()这样的操作。String就直接继承与System.object。

    关于变量的作用域有这样一个有趣的事,请看下面两段代码

 1     class Program1
 2     {
 3         private static void Main(string[] args)
 4         {
 5             int j = 20;
 6             for (int i = 0; i < 10; i++)
 7             {
 8                 int j = 30;
 9                 Console.WriteLine(j + 1);
10             }
11         }
12     }
 1 class Program2
 2     {
 3         private static int j = 20;
 4         static void Main(string[] args)
 5         {
 6             int j = 30;
 7             Console.WriteLine(j);
 8             return;
 9         }
10     }

 

        第一段代码运行后会报错,变量j重复定义。

        而对于第二段,有人也会认为他会报错,但运行后会输出变量j 为30。 这是因为变量声明在类中,C#就认为它为类的字段,Main方法中的j为局部变量。在main方法中声明j局部变量后类中的字段j被隐藏,所以编译成功,如果要类级别上的j可以用Program2.j。但为了代码的可读性我们在代码中避免这样的写法。

 

关于常量 const 和readonly的区别。

        先说常量,常量必须在声明时初始化,之后不可修改,常量的值必须在编译时就可以计算出来,不可以用一个变量中提取出的值来初始化常量。常量是静态的,但要是加上static关键字会报错。

        而只读字段readonly,它要比const常量要灵活,他一般在生成实例,在构造函数中初始化,实例生成后其值也就不可变化了,所以自读字段的值只要在生成实例之前能够计算出来就是可以的。

 预处理指令

        书中列举了很多预处理指令,有很多之前都没有用过,但相信应该都有用过#region  #endregion 去折叠一段代码。这里要说明一下#if DEBUG #else #endif(请注意,在C#预指令里是也是区分大小写的)。请看下段代码。

 1  static void Main(string[] args)
 2         {
 3             Console.WriteLine("Always write");
 4 
 5 #if DEBUG
 6      Console.WriteLine("Write When Debug");
 7 #else
 8      Console.WriteLine("Write When Release");
 9 #endif
10 
11             Console.ReadLine();
12 
13             return;
14 
15 
16         }

 

  运行的话会看到效果,当选择DEBUG 模式进行调试的话,DEBUG就会为真,当选择Release的话,DEBUG就会为假。当然可能有的版本VS会要进行一下设置,右键点击项目,选择属性,“生成”选显卡里,选定“定义DEBUG常量”。这样DEBUG常量才会生效。此方法在调试一些登陆后后才可见的功能比较有用,调试的时候谁也不想每次登录这么麻烦吧。

 

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

 

 

posted @ 2012-10-27 15:32  Heylon  阅读(2637)  评论(3编辑  收藏  举报