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

其实所谓核心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 中国大陆许可协议进行许可。

转载于:https://www.cnblogs.com/heylon/archive/2012/10/27/2742175.html

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

  1. 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  2. 文件io(一)--unix环境高级编程读书笔记

    unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...

  3. 高级IO(一)--UNIX环境高级编程读书笔记

    在前面学习了文件IO,标准IO和终端IO,现在学习高级IO,UNIX中怎么有这么多的IO. 1.非阻塞IO 可以将系统调用分为两类:低速系统调用和其他.低速系统调用是可能会使进程永远阻塞的一类系统调用 ...

  4. APUE Unix环境高级编程读书笔记

    .. 转载于:https://www.cnblogs.com/solitrarychen/p/5407536.html

  5. WCF 4 高级编程 - 读书笔记

    第2章 服务契约与数据契约 在SOA架构中,契约提供了服务通信所必需的元数据.契约用来定义数据类型.操作.消息交换模式和消息交换使用的传输协议.契约通常是XML格式发布的.在WCF中,服务元数据通常是 ...

  6. unix进程的环境--unix环境高级编程读书笔记

    1.进程的启动 进程总是从   main   函数开始执行的,main函数的函数原型如下: int main(int argc,char* argv[]); 当内核启动  c   程序时,使用一个   ...

  7. linux系统数据文件和信息--unix环境高级编程读书笔记

    linux系统中的数据文件有很多,在这一章里介绍的主要内容是和系统有关的一系列文件,包括passwd,shadow,group,utmp,wtmp以及一些系统的相关信息和时间的相关操作. 1.pass ...

  8. 标准IO库--unix环境高级编程读书笔记

    标准IO库是C语言提供的一个库,不光存在于linux中,在windows中也是有的.标准IO库和文件IO的不同是,标准IO库是对文件IO(即系统调用)的封装,并且在用户层添加了一些缓冲区. 文件IO的 ...

  9. 终端IO--unix环境高级编程读书笔记

    终端IO部分整体上读了两遍,感觉这一部分的内容又乱又碎,不太好理解.读完了之后,仍然感觉什么也没有学到.先做一个肤浅的记录,等到以后要用到的时候,再回来补充. 1.终端IO的工作方式 终端IO有两种不 ...

最新文章

  1. Neumorphism.io一个神奇的网站,满足各种圆角矩形ICON图表立体化效果要求,这种样式的名称——新拟态
  2. Ubuntu18.04 误删/usr/bin/python3的解决方案
  3. java读取本地文件下载_java 读取本地的json文件
  4. Android Studio使用Lint进行代码检查
  5. MYSQL内置函数总结
  6. python操作php文件,python怎么操作文件
  7. linux下gcc编译使用opencv的源文件时报错的处理:undefined reference to symbol '_ZNSsD1Ev@@GLIBCXX_3.4'
  8. php中加载图片淡入淡出,jQuery实现滚动图片淡入淡出功能
  9. Hadoop之HDFS(二)HDFS基本原理
  10. 三星S4使用体验(Markdown版)
  11. 如何在网站上设置在线QQ客服
  12. 01-ECAM、发展史、JS值、编程语言、变量
  13. Java实现 LeetCode 109 有序链表转换二叉搜索树
  14. 语c语言描写,【萌°语c】『语c』语c基本知识的简单介绍
  15. 谁锁了我的帐号?(AD账号的锁定状态查询)
  16. cPanel 开启 FastCGI
  17. [linux小水滴]工具安装与使用
  18. 钉钉免费内网穿透工具使用
  19. 二手书交易系统用例图2.0
  20. 手把手教你用 wxPython 设计一个可以弹琴的计算器

热门文章

  1. 指定jdk8_动图+源码+总结:深度解析 JDK8 中的数据结构(珍藏版)
  2. python程序控制结构_python程序控制结构
  3. Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  4. 迅为linux下串口,迅为iMX6UL开发板多路串口开发板接口详解
  5. Fiddler的常用功能(Web断点调试)
  6. 动态毛玻璃特效html,js和CSS3炫酷毛玻璃面板特效
  7. matlab四条曲线围成面,matlab中怎么给四条曲线作出图例啊?求大神指导
  8. 【AI学院】有三AI博士小姐姐带你学深度学习之图像识别下篇,附上篇回顾
  9. 速卖通新手入驻必须了解的“9大知识点”
  10. php中获取ip的地域信息比较精准