差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| csharp:变量 [2025/11/21 08:58] – [引用类型的理解2] 张叶安 | csharp:变量 [2025/12/22 11:23] (当前版本) – 张叶安 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== 变量作用域使用范围 | + | ====== |
| - | 一个类里面定义的变量不能在该类之外使用 | + | ===== 变量作用域使用范围 ===== |
| - | 除非使用静态修饰[变量的修饰符、默认私有] | + | 在 C# 中,变量的可访问性取决于其定义的位置和修饰符。 |
| - | ====== | + | * **类级变量(字段)**:一个类里面定义的变量,默认情况下不能在该类之外直接使用。 |
| + | * **默认修饰符**:类成员默认是 `private`(私有),仅限类内部访问。 | ||
| + | * **公开访问**:若需外部访问,需使用 `public` 修饰。 | ||
| + | * **静态访问**:若使用 `static` 修饰,则该变量属于类本身,而非类的实例,可通过 `类名.变量名` 访问。 | ||
| - | ===== 类型种类 | + | ===== 变量类型 ===== |
| + | |||
| + | C# 的数据类型主要分为三大类: | ||
| {{.: | {{.: | ||
| - | * 值类型:值存在栈上 | + | |
| - | * 引用类型:值存在堆上 | + | |
| - | * 指针类型:需打开安全模式 | + | |
| - | ===== 值类型范围 | + | 引用类型不进行转换,直接引用地址,程序效率会快一点。 |
| + | |||
| + | ===== 值类型详解 ===== | ||
| + | |||
| + | ==== 基础值类型范围 ==== | ||
| {{.: | {{.: | ||
| - | ==== 浮点数类型注意 ==== | + | ==== 浮点数类型注意事项 |
| {{.: | {{.: | ||
| - | 浮点数后没有f默认为double 类型 | + | 在 C# 中,带小数点的数值默认为 |
| + | |||
| + | <code csharp> | ||
| + | // 错误写法:编译器报错,无法将 double 隐式转换为 float | ||
| + | float myFloat = 3.14; | ||
| + | |||
| + | // 正确写法 | ||
| + | float myFloat = 3.14f; | ||
| + | double myDouble = 3.14; | ||
| + | decimal myDecimal = 3.14m; // 金额计算通常使用 decimal | ||
| + | </ | ||
| {{.: | {{.: | ||
| - | ===== 引用类型 ===== | + | ===== 引用类型详解 |
| {{.: | {{.: | ||
| - | ===== 引用类型的理解1 | + | ==== 引用类型的内存理解 |
| - | 区别: | + | **核心区别:** |
| - | - 1:创建的值类型存在栈里、 | + | - **值类型**:创建时,值直接保存在**栈**里。 |
| - | - 2:创建的引用类型是对象存在栈、存在值是指向堆里、 | + | - **引用类型**:创建时,对象(数据实体)保存在**堆**里,而**栈**里保存的是指向该堆内存地址的“指针”(引用)。 |
| {{.: | {{.: | ||
| 行 42: | 行 61: | ||
| {{.: | {{.: | ||
| - | 总结:使用值类型时对一个变量的修改不会影响其他的值、 | + | > **总结**: |
| - | + | > | |
| - | 而使用引用类型时、你对一个引用类型变量的值进行修改、会影响到与它相同引用的其他变量的值、 | + | > |
| - | + | ||
| - | ===== 引用类型的理解2 ===== | + | |
| - | 考虑以下打印的值 | + | ==== 引用类型的内存理解 (2) - 代码案例 ==== |
| + | |||
| + | 请看以下代码示例,观察 `Stime2` 和 `Stime3` | ||
| <code csharp> | <code csharp> | ||
| - | class ceshi | + | class Ceshi |
| { | { | ||
| - | | + | |
| - | public int age { get; set; } | + | public int Age { get; set; } |
| } | } | ||
| - | static class tes | ||
| - | { | ||
| - | | + | static class TestClass |
| - | { | + | { |
| - | + | | |
| - | ceshi Stime1 = new ceshi() { name = " | + | { |
| - | ceshi Stime2 = new ceshi() { name = " | + | // 1. 值类型赋值(结构体或基本类型) |
| - | int age = Stime1.age; | + | // 假设 int 是值类型 |
| - | | + | |
| + | int age = Stime1.Age; // age 获得了 25 的副本 | ||
| + | Stime1.Age = 35; // 修改 Stime1 不会影响局部变量 age | ||
| - | | + | // 2. 引用类型赋值(类) |
| - | | + | Ceshi Stime2 = new Ceshi() { Name = " |
| + | |||
| + | // 关键点:这里是将 Stime2 的引用(地址)赋给了 Stime3 | ||
| + | // 此时 Stime2 和 Stime3 指向堆内存中的同一个对象 | ||
| + | Ceshi Stime3 = Stime2; | ||
| + | |||
| + | // 修改 Stime2 指向对象的属性 | ||
| + | | ||
| - | Console.WriteLine(" | + | // 输出结果 |
| - | | + | |
| - | | + | Console.WriteLine(" |
| - | | + | Console.WriteLine(" |
| + | Console.WriteLine(" | ||
| | | ||
| } | } | ||
| </ | </ | ||
| - | 总结:使用值类型时对一个变量的修改不会影响其他的值、 | + | ==== 通用类型 |
| - | + | ||
| - | 而使用引用类型时、你对一个引用类型变量的值进行修改、会影响到与它相同引用的其他变量的值、 | + | |
| - | ==== 引用类型、通用类型object | + | `object` 是所有类型的基类。任何类型都可以赋值给 `object`。 |
| {{.: | {{.: | ||
| <code csharp> | <code csharp> | ||
| - | object num1 = 3.14; | + | object num1 = 3.14; // 装箱:值类型转引用类型 |
| - | object num2 = " | + | object num2 = " |
| object num3 = 145; | object num3 = 145; | ||
| </ | </ | ||
| - | | + | |
| ==== 类的引用与绑定理解 ==== | ==== 类的引用与绑定理解 ==== | ||
| - | 使用fuka对象就等于使用zhuka对象成员 | + | 当多个引用变量指向同一个实例时,使用其中任何一个变量操作成员,效果是等同的。 |
| + | 例如:使用 | ||
| {{.: | {{.: | ||
| - | ==== 指针类型 ==== | + | ===== 指针类型 |
| - | ===== 自定义变量类型[枚举enum] ===== | + | 指针类型用于直接操作内存地址,类似于 C/C++。在 C# 中使用指针必须在 `unsafe` 代码块中,并且项目属性需要开启“允许不安全代码”。 |
| + | |||
| + | ===== 自定义变量类型:枚举 | ||
| ==== 简介 ==== | ==== 简介 ==== | ||
| - | 枚举里定义的成员变量为 | + | 枚举 |
| - | 使用定义枚举变量时、必须为它赋一个枚举内部值、 | + | * **特点**:增强代码可读性,避免使用魔术数字。 |
| - | + | * **赋值**:定义枚举变量时,必须为其赋一个枚举内部定义的值。 | |
| - | 枚举可以当做参数来传递 | + | * **传递**:枚举可以像普通变量一样作为参数传递。 |
| {{.: | {{.: | ||
| 行 115: | 行 142: | ||
| ==== 使用步骤 ==== | ==== 使用步骤 ==== | ||
| - | - 1:创建枚举类型、写出包含的成员变量 | + | - **Step |
| - | - 2:用创建枚举类型定义变量、此时该变量拥有枚举内的成员 | + | - **Step |
| - | + | ||
| - | ==== 枚举案例1 ==== | + | |
| - | + | ||
| - | 枚举是一种值类型,它由一组命名的常数组成。这些常数被称为枚举成员。枚举提供了一种方便的方式来定义和使用一组相关的常量值。 | + | |
| - | //创建枚举类型 | + | ==== 枚举案例 1:星期 ==== |
| <code csharp> | <code csharp> | ||
| + | // 创建枚举类型 | ||
| public enum DaysOfWeek | public enum DaysOfWeek | ||
| { | { | ||
| - | Sunday, | + | Sunday, |
| - | Monday, | + | Monday, |
| Tuesday, | Tuesday, | ||
| Wednesday, | Wednesday, | ||
| 行 135: | 行 159: | ||
| Saturday | Saturday | ||
| } | } | ||
| - | </ | ||
| - | 定义了一个名为'' | + | // 使用枚举 |
| + | class Program { | ||
| + | static void Main() { | ||
| + | // 定义枚举类型变量并赋值 | ||
| + | DaysOfWeek today = DaysOfWeek.Monday; | ||
| - | 可以像使用其他数据类型一样使用这个枚举: | + | |
| - | + | { | |
| - | // | + | Console.WriteLine(" |
| - | + | } | |
| - | <code csharp> | + | else |
| - | DaysOfWeek | + | { |
| - | + | Console.WriteLine(" | |
| - | if (today == DaysOfWeek.Saturday || today == DaysOfWeek.Sunday) | + | } |
| - | { | + | } |
| - | Console.WriteLine(" | + | |
| - | } | + | |
| - | else | + | |
| - | { | + | |
| - | Console.WriteLine(" | + | |
| } | } | ||
| </ | </ | ||
| - | 在这个示例中将'' | + | ==== 枚举案例 2:数学运算 ==== |
| - | ==== 枚举案例2 ==== | + | 假设有一个名为 |
| - | + | ||
| - | 假设有一个名为'' | + | |
| <code csharp> | <code csharp> | ||
| 行 170: | 行 190: | ||
| Divide | Divide | ||
| } | } | ||
| - | </ | ||
| - | 我们可以使用这个枚举来定义一个函数,该函数根据传入的操作执行相应的数学运算: | + | // 定义一个静态函数,参数3为枚举类型 |
| - | + | ||
| - | <code csharp> | + | |
| - | // | + | |
| public static double PerformOperation(double num1, double num2, Operations operation) | public static double PerformOperation(double num1, double num2, Operations operation) | ||
| { | { | ||
| 行 197: | 行 213: | ||
| </ | </ | ||
| - | 在这个示例中,我们定义了一个名为'' | ||
| - | |||
| - | ===== 结构体[struct ] ===== | ||
| - | |||
| - | ==== 简介 ==== | ||
| - | |||
| - | 理解为一个新的数据类型 | ||
| - | |||
| - | {{.: | ||
| - | |||
| - | <code csharp> | ||
| - | struct Axis // | ||
| - | { | ||
| - | public string Axis_num { get; set; } //轴号 | ||
| - | public string Jog_Z { get; set; } // | ||
| - | public string Jog_F { get; set; } // | ||
| - | public double Vosti { get; set; } //轴速度 | ||
| - | public double Add_Vosti { get; set; } // | ||
| - | public double Add_Vosti_time { get; set; } // | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ===== 结构体与枚举的区别 ===== | ||
| - | - 1. 枚举里定义的成员变量为整型常量、是一种描述性的词、 | ||
| - | - 2. 结构体是一种重新规划的类型集合群、 | ||