0 思维导图
如图 1.1,图片较大建议展开观看。
1 变量和常量
变量是我们给一份内存空间所命的名字。我们使用变量来向内存中存储一个临时的值。
常量是一个不可以被改变的值。我们使用常量来确保在某些情境中某个值不会被改变。比如说,当我们想计算圆的面积时,我们需要用到 π,我们就需要将 Pi 定义为一个常量来保证 Pi 不会在计算过程中被不小心改变。
如果我们要声明一个变量,我们需要指定类型和标识符:
int number;
此处,int 代表了整型,占用 4 个字节。
number 是我们变量的标识符。我们可以在声明时选择性地为变量设一个值。这被称为 “变量初始化”。
int number = 5;
在 C# 中,我们不可以读取一个没有被赋值的变量。
2 原始类型
Type | Bytes |
---|---|
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
decimal | 16 |
bool | 1 |
char | 2 |
这些类型在.NET 框架中有等价的类型。当应用程序被编译后,编译器会将我们在 C# 中使用的类型映射到 .NET 框架的底层类型。
C# Type | .NET Type |
---|---|
byte | Byte |
short | Int16 |
int | Int32 |
long | Int64 |
float | Single |
double | Double |
decimal | Decimal |
bool | Boolean |
char | Char |
对于几种整型类型的简单记忆方法就是记住它们所占用的位数,比如说 short 占 2 个字节,一个字节是 8 位,因此它是 16 位,所以 short 的 .NET 底层类型是 int16。
3 作用域
作用域决定了一个值在哪里有意义且可以访问。一个变量的作用域是在包围它本身的块和其子块中。在块之外它不能被访问??槭褂梅趾虐鹄?,例如:
{
int a = 1;
{
int b = 2;
b = a;
Console.WriteLine(b); // 1
}
}
4 溢出
根据分配的内存空间,我们可以知道每种类型所能保存的值的范围。如果我们将某个值存在一个变量中,但是这个值超出了这个变量底层类型的边界,就会发生溢出。比如说,我们可以将 0 到 255 中的任何一个值存在一个字节中,如果超出这个范围,就会发生溢出:
byte b = 255;
b = (byte) (b + 1); // 因为没有 byte 型加法,因此我们需要使用到类型转换
Console.WriteLine(b); // 0
5 类型转换
有时,我们需要暂时地将一个变量的值转换成另一种类型。这种转换操作并不会影响到原来的变量,因为 C# 是一个强类型语言,一旦你声明了一个变量的类型,你就不能再改变它。但有时候我们也会需要将某个变量的值分配另一种类型的变量。
如果两个类型可以相互兼容,且目标类型的取值范围大于待转换的类型,我们就可以直接赋值,这个值会在运行时自动被转换并存储在目标类型中。
byte b = 1;
int i = b;
由于 b 和 i 都是数值类型,且 b 只占 1 个字节而 i 占 4 个字节,因此我们不需要做额外的操作。
如果目标类型比待转换的类型的取值范围小,那么编译器会抛出异常。因为这种转换可能会导致溢出。比如说,如果我们将 1000 赋给 byte 类型的变量,那么我们就无法存储它,因为我们的范围只有 [0, 255]。在这种情况下高位的数据就会丢失。如果我们可以确定不会有数据丢失,我们就可以显式地进行类型转换:
int i = 1;
byte b = (byte) i;
注意,如果进行了显式类型转换,编译器就会忽视溢出的问题,高位会被直接截断,因此如果真的发生了溢出,我们就会得到一个错误的值。
最后,如果待转换的类型和目标类型之间互不兼容,我们就需要使用 Convert 类或者 对应类型的 Parse 方法:
string number = "1234";
int num = Convert.ToInt32(number); // 1234
int n = int.Parse(number); // 1234
Convert 类中有大量的类型转换方法。
6 运算符
在 C# 中有 5 种类型的运算符:
- 算术运算符
- 比较运算符
- 赋值运算符
- 逻辑运算符
- 位运算符
算术运算符:
Operator | Description |
---|---|
+ | Add |
- | Subtract |
* | Multiply |
/ | Divide |
% | Remainder of Division |
++ | Increment by 1 |
-- | Decrement by 1 |
比较运算符:
Operator | Description |
---|---|
> | Greater than |
>= | Great than or equal to |
< | less than |
<= | less than or equal to |
== | Equal |
!= | Not equal |
赋值运算符:
Operator | Description |
---|---|
= | Assignment |
+= | Addition Assignment |
-= | Subtraction Assignment |
*= | Multiplication Assignment |
/= | Division Assignment |
逻辑运算符:
Operator | Description |
---|---|
&& | Logical AND |
|| | Logical OR |
! | Logical NOT |
位运算符:
Operator | Description |
---|---|
& | Bitwise AND |
| | Bitwise OR |
7 注释
注释是我们用于提升代码可读性和可维护性的一段文本。C# 程序中有两种常见的风格:单行注释和多行注释
// 单行注释
/*
多行注释
*/
根据代码整洁之道,我们只用注释来解释为什么而不解释做了什么。你的代码应该简洁而不言自明。但如果代码使用了特别地方法或者你的代码有特殊的限制,你就需要使用注释来解释它们。