csharp:变量

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

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

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • csharp/变量.1763686695.txt.gz
  • 最后更改: 2025/11/21 08:58
  • 张叶安