C#第二章--变量
1 初始化
C#会把没有初始化的标记为错误。确保变量会在使用前初始化:
- 变量是类或结构体里的字段,没有显示初始化,默认值是0;
- 方法的局部变量必须在使用前显示初始化;
2 var
根据变量的初始化值推断变量的类型,之后就不能再改变变量的值了。
匿名类型 :var doctor = new{ FirstName = '"w", LastName = "m"};
3 变量的作用域
- 只要类的局部变量在某个作用域内,其字段也在该作用域内;
- 局部变量存在于表示声明该变量的块语句或方法结束的花括号之前的作用域内;
- for,while或类似的语句中声明的变量作用域在该魂环提内;
4 常量
const int a =10; 常量必须初始化,之后不能改变;
5 值类型和引用类型
值类型直接存储其值,存储在stack里;引用类型存储对值的引用,存储在heap里。
C#结构没有性能损失?
C#的声明一个int类型的数据时,声明的实际是.NET struct:System.Int32的一个实例。这表示在语法上可以把基本数据类型看成支持某些方法的类,例如string s = i.ToString();
类型实际上仍存储为基本类型。
6 预定义的值类型
- 整型:sbyte byte short int long ushort uint ulong
- C#中所有数据类型都是以平台无关的方式定义。
- byte与char不同,要显示转换;sbyte是有符号的版本;
- C#7.0新增数字分割符,在任何位置放置(除最前面)下划线,提高可读性,编译器会忽略用于分隔符的下划线:uint b = 0b1111_0010_0000;
- 浮点类型: double,float
- decimal: 128位高精度十进制数decimal d = 1.22M;
- bool类型,不能用0表示false,不能用非0表示true;
- 字符类型:char是16位的Unicode字符。
- 可表示为字符字面量;
- 可以用4位16进制的Unicode值‘\u0041';
- 带有强制类型转换的整数值(char)65;
- 或者16进制数'\x0041'表示;
- 还可以用转义序列表示,比如\n
7 预定义的引用类型
- object最终的父类型;
- string引用类型,把一个字符串变量赋予另一个字符串时,会得到内存中同一个字符串的两个引用。但是string与其他引用类型不同的是:string是不可变类型,字符串是不可改变的,修改其中一个字符串的值,就会创建一个新的string对象,而另一个字符串不发生任何变化。(从两个变量指向同一内存,变成两个变量指向不同内存)
- string定义了新的字符串插值格式$:字符串钱加上$,允许把花括号放在包含一个变量或者代码表达式的字符串中,变量或代码表达式的结果放在字符串中花括号所在位置:$"if you {name}"
8 程序流控制
- 条件语句
- if else
- switch语句里condition是常量,可以是字符串;C#一般把没有break语句的case标记为错误,特殊的是一个case为空,可以从这个case跳到下个case,即用相同的方式处理多条case语句;
- 循环for,while,do...while, foreach(循环不能更改集合中各项的值,foreach(var item in arrays) item不能更改,想更改用for循环);
- 跳转语句:goto,break(跳出本层循环),continue(退出循环当前迭代,开始执行循环的下一次迭代),return(退出类的方法,把控制权返回给方法的调用者)
9 名称空间
- 名称空间提供了一种组织相关类和其他类型的方式,是一种逻辑组合。
- using再文件顶部列出类的名称空间,文件的其他地方就可用其类型名称来引用名称空间中的类型了;
- using也可以用来给类和名称空间指定别名。文件顶部using Name=Wrox.NameSpace;文件内用到时Name::Example();名称空间别名的修饰符是::
10 注释
C#可以根据特定的注释自动创建XML格式的文档说明,这些注释是单行注释,但以///开头。
///<summary>提供类型或成员的简短小结。 ///</summary>
11 预处理器指令
- #define DEBUG #undef
- #if #else #elif #endif
- #warning #error 编译器遇到时会产生警告或者错误
- #region #endregion 代码布局
- #line 改变编译器在警告和错误信息中显示的文件名和行号信息
- #pragma 抑制或者还原指定的编译警告
12 C#编程准则
(1) 标识符的规则
- 区分大小写,可以包含数字,但必须以字母或者下划线开头
- 不能把关键字作为标识符,但是@abstract,告知编译器后面是标识符不是关键字
- 标识符也可以用\uxxxx形式的unicode字符
新版协议添加的新关键字没加到保留字列表里。因为添加进去的话会给现有代码造成破坏,解决办法是把新关键字设置为上下文关键字,只能用在某些具体的代码中。
(2) 用法约定
命名约定:
- Pascal大小写准则:常量,名称空间,类,基类中的成员等都遵循,即ConnectionLine;
- camel大小写准则:类型中私有成员字段,传递给方法的所有参数名称,区分同名的两个对象(常见的是属性封装字段),即connectionLine;
属性和方法:
一般如果该对象的外观像变量就该用属性表示,即:,以下满足为属性,否则方法;
- 客户端能读取它的值,只写用方法
- 读取值不该花太长时间
- 读取值不该有负面效应
- 可以按照任何顺序设置属性
- 顺序读取属性应有相同的结果
字段,字段总是私有的;