C#预定义数据类型详解:值类型与引用类型的区别

Oliver
Oliver
发布时间:2026-10-13 | 5人浏览过
原创

C#将预定义数据类型划分为值类型和引用类型两大类。理解两者的内存分配与数据传递机制是编写高效代码的基础。本文将通过具体示例,解析如何在C#中正确使用这两类数据类型。

结果或目标

C#的数据体系主要依据内存分配方式分为两种:值类型(Value Types)和引用类型(Reference Types)。掌握它们的区别能够避免程序运行中的逻辑错误,特别是在处理复杂数据结构时。

准备条件

  1. 安装 .NET SDK 开发环境。
  2. 配置好支持 C# 的集成开发环境(IDE),如 Visual Studio 或 VS Code。

真实操作顺序

第1步:认识值类型及其内存特征

值类型的变量直接在堆栈中存储其实际数据。当发生赋值或参数传递时,系统会在内存中复制一份全新的副本。这意味着两个独立的变量互不影响。

实例演示:计算圆的面积

此示例展示了如何使用 const 声明浮点常量,并使用 int 等值类型接收用户输入并进行数学运算。

using System;

namespace area
{
  class Program
  {
    static void Main(string[] args)
    {
      const double PI = 3.14; // 定义只读常量
      Console.WriteLine("请输入一个整数为圆的半径:");
      
      // Convert.ToInt32() 将输入的字符串转换为整型 (int)
      int r = Convert.ToInt32(Console.ReadLine());
      
      // 使用值类型计算并输出结果
      double Area = PI * r * r;
      Console.WriteLine("所求圆的面积为:" + Area);
      
      Console.ReadLine();
    }
  }
}

第2步:掌握引用类型之 object 类型的使用

object 是C#中所有其他类型的基类,因此它可以容纳任何类型的值。在使用时,会发生“装箱”过程(将值类型转换为引用类型)。

using System;

namespace objectType
{
  class Program
  {
    static void Main(string[] args)
    {
      object a;
      
      a = 10;                 // 存入整型
      Console.WriteLine(a);   
      Console.WriteLine(a.GetType()); // 获取当前数据的实际类型
      
      a = true;               // 存入布尔型
      Console.WriteLine(a);   
      Console.WriteLine(a.GetType());
      
      a = 10.0M;              // 存入十进制型
      Console.WriteLine(a);
      Console.WriteLine(a.GetType());
      
      Console.ReadLine();
    }
  }
}

从上述输出的控制台截图可以看到,同一个 object 变量随着赋值的改变,其内部承载的实际数据类型(GetType()返回值)也在实时更新。

第3步:探究引用类型之 string 的赋值原理

字符串(string)是一种特殊的引用类型。虽然它表现为简单的文本,但在进行复制赋值操作时,实际上是创建了一个指向相同内存地址的新引用。不过需要注意,由于字符串具有“不可变性”,一旦对字符串内容进行了修改,系统实际上是在内存中开辟了新的空间存放修改后的新字符串。

using System;

namespace str
{
  class Program
  {
    static void Main(string[] args)
    {
      string str1 = "hello";
      string str2 = str1;     // 初始时 str2 和 str1 指向同一块内存
      
      Console.WriteLine("str1=" + str1);
      Console.WriteLine("str2=" + str2);
      
      str1 = "after";         // 修改 str1,系统会重新开辟一块内存给 str1
      
      Console.WriteLine("str1=" + str1);
      Console.WriteLine("str2=" + str2); // str2 依然指向原来的 "hello"
      
      Console.ReadLine();
    }
  }
}

输出的结果为:

 

从运行结果来看:在首次赋值后,如果单独修改了 str1 的值,原字符串并没有被破坏,而是 str1 指向了新创建的内存地址,str2 仍然保持原状。这体现了字符串在处理过程中的不可变特性。

完成判断

成功编译并运行以上三个示例代码,观察到控制台分别输出了预期的圆面积数值、System.Int32/System.Boolean/System.Decimal 动态切换的类型信息,以及字符串截断前后的不同地址表现,即为完成学习目标的标志。

简要总结

C#预定义数据类型包含两类核心模型:值类型(如 int, double 等)直接在内存栈中存留数据副本;引用类型(主要是 object 和 string)则保存数据在堆内存中的引用地址。在实际开发中,合理利用这两种类型的特性,能有效优化程序的内存占用和执行效率。

以上就是C#预定义数据类型的详细内容,更多关于CSharp基础知识方面的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表