### 深入C#数据类型巩固 #### 一、值类型与引用类型 在.NET框架中,所有的数据类型都可以归类为两大类:值类型和引用类型。 **1. 值类型** - **定义**:值类型的变量直接存储数据本身。 - **存储位置**:通常位于内存中的栈中。 - **特点**: - 数据直接存储在变量所在的内存位置。 - 当赋值给另一个变量时,实际上是复制了一个新的副本。 - 由于数据直接存储在栈中,因此访问速度较快。 **2. 引用类型** - **定义**:引用类型的变量存储的是指向数据的实际内存地址,而非数据本身。 - **存储位置**:数据存储在堆中,而变量则存储在栈中,指向堆中的数据。 - **特点**: - 变量中存储的是内存地址。 - 当赋值给另一个变量时,实际上是将指向同一内存地址的引用复制给了另一个变量。 - 访问速度略慢于值类型,但可以管理更大的数据结构。 #### 二、详解值类型 值类型包括基本数据类型如整数、浮点数、布尔型等,还包括枚举和结构体。 - **基本数据类型**: - `byte`、`sbyte`、`short`、`ushort`、`int`、`uint`、`long`、`ulong`、`float`、`double`、`decimal` - `bool`、`char` - **枚举**:用于定义一组命名的常量。 - **结构体**:一种特殊的类,用于封装相关的数据成员和成员函数。 **案例分析**: 假设有一个简单的例子:`int a = 10; int b = a; b = 20;`。这里展示了值类型的赋值和修改过程。 - 第一步:创建一个名为`a`的整型变量,并赋值为10。 - 第二步:创建一个名为`b`的整型变量,并将其初始化为`a`的值,即10。 - 第三步:修改`b`的值为20。此时`a`的值仍然是10。 这说明,当我们将一个值类型变量赋值给另一个变量时,实际上是在创建一个新的副本,而不是引用同一个值。 #### 三、引用类型详解 引用类型包括但不限于`string`、数组、类、接口和委托等。 - **字符串(string)**:不可变的对象,一旦创建后其内容就不能更改。 - **数组**:用于存储同类型元素的集合。 - **类**:面向对象编程的基本单元,可以包含字段、属性、方法等成员。 - **接口**:定义了类应该实现的方法和属性。 - **委托**:一种引用类型,用于封装方法的引用。 **案例分析**: 假设我们有一个简单的类`Person`,包含一个名字字段和一个打印方法。 ```csharp public class Person { public string Name { get; set; } public void PrintName() { Console.WriteLine("Name: " + Name); } } ``` 当我们创建一个`Person`对象并赋值给另一个变量时,这两个变量实际上指向同一个对象。 ```csharp Person p1 = new Person { Name = "Alice" }; Person p2 = p1; p2.Name = "Bob"; ``` 在这个例子中,即使我们通过`p2`修改了`Name`字段,`p1`的`Name`也会随之改变,这是因为`p1`和`p2`都指向同一个对象。 #### 四、参数传递 在调用方法时,我们需要传递参数。根据参数的类型不同,传递的方式也有所不同。 - **按值传递**:对于值类型,传递的是变量的值。 - **按引用传递**:对于引用类型,传递的是变量的引用。 **案例分析**: - **按值方式传递值类型**:直接传递变量的值。 - **按值方式传递引用类型**:传递变量的引用。 - **按引用方式传递值类型**:使用`ref`关键字,此时形参和实参共享同一内存位置。 - **按引用方式传递引用类型**:同样使用`ref`关键字,实现形参和实参共享同一内存位置。 #### 五、装箱与拆箱 **装箱**:将值类型的数据包装成引用类型的数据。 **拆箱**:将引用类型的数据转换回值类型的数据。 - **优点**: - 支持更多的数据类型转换。 - **缺点**: - 性能损失,尤其是在频繁进行装箱和拆箱操作时。 **案例分析**: 假设有一个值类型变量`int num = 10`,我们需要将其转换为引用类型`object obj`。 ```csharp int num = 10; object obj = num; // 装箱 int num2 = (int)obj; // 拆箱 ``` 在这个例子中,首先将`num`装箱为`obj`,然后又从`obj`中拆箱回`num2`。 #### 六、静态 在C#中,类可以包含静态成员和实例成员。 - **静态成员**:在整个程序运行期间只有一份拷贝。 - **实例成员**:每个对象有一份拷贝。 **区别**: - 静态成员在定义时需要使用`static`关键字。 - 实例成员不需要使用`static`关键字。 - 静态成员的调用必须使用类名。 - 实例成员的调用必须使用对象名。 **案例分析**: ```csharp public class MyClass { public static int StaticField = 10; public int InstanceField; public static void StaticMethod() { Console.WriteLine("StaticMethod called."); } public void InstanceMethod() { Console.WriteLine("InstanceMethod called."); } } // 使用示例 MyClass.StaticMethod(); // 调用静态方法 MyClass myObject = new MyClass(); myObject.InstanceMethod(); // 调用实例方法 ``` 在这个例子中,我们定义了一个包含静态成员和实例成员的类`MyClass`。可以看到静态方法可以直接通过类名调用,而实例方法需要通过对象来调用。
剩余9页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助