标识符和关键字
只要是语言,就会有标识符和关键字的概念
标识符
如示例代码,字符串 Demo、Program、Main、args、text 都是标识符。可以看出,标识符就是我们命名用的字符串,当然这个字符串不能随心所欲的命名,必须遵守语言的规则。我们平时开发也很少会起一些奇奇怪怪的名字,这里我也不去多介绍规则了。值得注意的是,C# 是一门大小写敏感的语言,所以 hello 和 Hello 不冲突
代码语言:javascript复制namespace Demo
{
class Program
{
static void Main(string[] args)
{
string text = "Welcome";
Console.WriteLine(text);
Console.ReadKey();
}
}
}
关键字
关键字很好理解,就是语言对应的单词都是关键字。如上示例中的 namespace、class、void 等等都是关键字,一般情况关键字是不能用作标识符,但是如果前面加上 @ 前缀后就没有了限制。举个实际场景就是你的关键字和实体属性冲突的情况下,我们会在实体字段前加上 @ 前缀
数据类型
通用类型系统(CTS)将类型分为两大类:值类型和引用类型
值类型包含:数值类型、布尔类型、枚举类型、结构体类型
引用类型包含:数组、类、接口、委托、object
数值类型
数值类型分为:整型、浮点型、十进制型 3 种
int、long、char、byte、short 等等这些都是整形
float、double 这些都是浮点型,前者是单精度,后者是双精度
decimal 是十进制型,表示 128 位的数据类型,和浮点数相比,它具有更高的精度和更小的范围,适用于财务和货币计算
布尔类型
布尔类型(bool)用于存储布尔值 true 和 false
字符串类型
string(字符串)类型是 System.String 的别名,表示由零个或多个字符组成的不可变序列,可使用 [] 运算符来访问 string 中的每个字符
string 具有不可变性,看下面这个示例
代码语言:javascript复制class Program
{
static void Main(string[] args)
{
string text = "Welcome";
text = "Hi";
Console.WriteLine(text);
Console.ReadKey();
}
}
我们知道内存分为栈内存和堆内存,栈内存我们创建了 text 这个变量,紧接着我们在堆内存里创建了一个 Welcome,text 指向了 welcome。当 text = "Hi" 执行后,系统在堆内存创建了 Hi,随后把 text 重新指向了 Hi。这就是 string 的不可变性,所以,如果你一个字符串频繁的进行修改,会增加内存开销
枚举类型
枚举类型属于值类型,它用于声明了一组命名了的常数
代码语言:javascript复制enum Gender
{
Female,
Male
}
很少有人知道我们还可以给枚举添加继承
代码语言:javascript复制enum Gender : byte
{
Female,
Male,
}
结构体
C# 中的结构体是一种值类型,通常适用于表示诸如 Point、Rectangle 和 Color 等轻量级对象
代码语言:javascript复制public struct Point
{
public int x;
public int y;
public Point(int px, int py)
{
x = px;
y = py;
}
}
结构体与类有着相同的语法,这里不去多做介绍,后面详细展开
数组类型
数组是一种引用类型,代表了相同类型元素的集合
变量和常量
变量代表了一块内存空间,它存储的值是可以变化的。因为有了变量,我们不需要再去记忆复杂的内存地址,而是转为通过变量名来完成内存数据的存取操作。与变量不同,常量不能在赋值之后发生变化,而其对应内存中的值不能被改变
变量的使用
语法很简单:数据类型 变量名
如果要同时声明多个同类型变量,可以用这种语法:
代码语言:javascript复制int a, b, c;
如果在声明之后,未进行初始化就提前使用变量,则会在编译时出现 “使用了未赋值的局部变量” 的错误
变量的作用域
作用域的作用就是控制变量的声明周期和访问范围,C# 有函数作用域和块作用域
代码语言:javascript复制public static void TestMethod()
{
string[] foo = new string[3] { "1", "2" ,"3" };
foreach (string item in foo)
{
Console.WriteLine(item);
};
// 这里访问不到 item
Console.WriteLine(item);
}
常量
常量语法如下:
const 数据类型 常量名 = 数据类型相对于的值
我们声明并初始化常量时,应注意以下几点:
- 因为后续无法更改,常量必须在声明时就进行初始化
- 常量无法接受变量的赋值,即使变量是 readonly 也不行
- 常量默认是静态的,不允许显示使用 static 关键字来声明