C# 学习笔记(2)—— 语言基础

2023-10-20 18:46:50 浏览数 (1)

标识符和关键字

只要是语言,就会有标识符和关键字的概念

标识符

如示例代码,字符串 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 关键字来声明

0 人点赞