c#基础系列之值类型和引用类型的深入理解

C#基础系列之值类型和引用类型的深入理解

值类型和引用类型

C#中的变量可以分为值类型和引用类型两种。所谓值类型,就是它们在内存中直接存储它们的值,而引用类型则存储对象在内存中的地址。常见的值类型包括整型、浮点型、布尔型和枚举类型,而常见的引用类型包括类、接口、数组和委托等。

值类型使用堆栈空间存储,可以直接访问,速度较快,但是数据量较小,一般在32位系统中为4字节,在64位系统中为8字节。而引用类型的大小是由它们指向的对象所决定的,通常要进行堆内存的分配和释放,速度较慢。

值类型的特点

  1. 存储在堆栈中;
  2. 直接包含变量的值,速度快;
  3. 分配和销毁速度快;
  4. 值类型不能为 null;
  5. 值类型实例之间的比较,是比较它们的值是否相等;

下面以整型变量为例展示值类型:

int x = 10; // x 是值类型
int y = x;
y = 20; // x 不会改变

同样是整型,x和y是两个不同的变量,它们在内存中分别存储它们的值,x=10,y=20。将y赋值给x之后,x和y的值都是10。当我们将y的值修改为20时,x的值不会随之改变。

引用类型的特点

  1. 存储在堆中;
  2. 存储的是一个指向对象的地址;
  3. 分配和销毁需要额外的处理;
  4. 引用类型可以为 null;
  5. 引用类型实例之间的比较,是比较它们的引用是否相等;

下面以类为例展示引用类型:

class Person {
    public string Name { get; set; }
}

Person p1 = new Person() { Name = "Jay" }; // p1 是引用类型
Person p2 = p1; // p1 和 p2 引用同一个对象
p2.Name = "Bob";
Console.WriteLine(p1.Name); // 输出 "Bob"

在这个例子中,我们使用了一个Person类,它存储了一个人的姓名。首先,我们创建了一个名为p1的Person对象,并设置了它的Name属性为"Jay"。然后,我们将p1赋值给了p2,这样p1和p2都指向同一个Person对象。当我们修改p2的Name属性时,p1的Name属性也会发生改变,这是因为它们引用同一个对象。

总结

值类型和引用类型有各自的特点。在开发过程中,我们需要根据实际情况使用不同的类型。通常情况下,如果我们需要存储一个简单的数值类型或者枚举类型等,那么我们可以使用值类型,如果我们需要使用一个较为复杂的对象,那么我们可以使用引用类型。

示例1:值类型

enum Gender { Male, Female }
struct Person {
    public string Name { get; set; }
    public Gender Gender { get; set; }
}
Person p1 = new Person { Name = "Tom", Gender = Gender.Male };
Person p2 = p1;
p2.Name = "Jerry";
Console.WriteLine(p1.Name); // 输出 "Tom"

在这个示例中,我们定义了一个结构体Person,它包含一个Name属性和一个Gender属性。我们创建了一个Person对象p1,并设置它的Name为"Tom",然后将其赋值给p2。接着,我们修改了p2的Name属性为"Jerry",但p1的Name属性却没有发生改变,这是因为Person是一个结构体,它是一个值类型。

示例2:引用类型

class Cat {
    public string Name { get; set; }
    public void Speak() {
        Console.WriteLine($"{Name}说:喵~");
    }
}
Cat c1 = new Cat { Name = "Tom" };
Cat c2 = c1;
c2.Name = "Jerry";
c1.Speak(); // 输出 "Jerry说:喵~"

在这个示例中,我们定义了一个Cat类,它包含一个Name属性和一个Speak方法。首先,我们创建了一个Cat对象c1,并设置它的Name为"Tom",然后将其赋值给c2。接着,我们修改了c2的Name属性为"Jerry",并调用c1的Speak方法,发现输出的是"Jerry说:喵~",这是因为Cat是一个类,它是一个引用类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#基础系列之值类型和引用类型的深入理解 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 数据库 数据类型float到C#类型decimal, float数据类型转化无效

    问题描述: 在将数据库中的float数据类型转换成C#的decimal类型时,有些数据会发生转化无效的情况。这是由于float数据类型的精度问题所导致的。本文将详细介绍如何解决这个问题,并提供两个演示示例。 解决步骤: 1.使用double类型进行过渡转换 当我们将数据库中的float类型转化成decimal类型时,可以使用double类型作为过渡类型。这是…

    C# 2023年5月15日
    00
  • c# 使用handle.exe解决程序更新文件被占用的问题

    c#使用handle.exe解决程序更新文件被占用的问题攻略 在程序更新过程中,经常会遇到文件被占用的问题导致更新失败。此时可以使用handle.exe工具定位占用文件的进程并关闭占用进程,以解决文件被占用的问题。下面是使用c#调用handle.exe工具实现解决文件被占用问题的步骤: 1.下载handle.exe handle.exe是Sysinterna…

    C# 2023年5月14日
    00
  • c# 动态加载dll文件,并实现调用其中的方法(推荐)

    C# 动态加载 DLL 文件并实现调用其中的方法是一个在编写 C# 程序时常见的需求,下面将介绍如何实现此功能。 1. 加载 dll 文件 调用 DLL 文件中的方法,需要先将 DLL 加载到当前进程中。有两种方式可以加载 DLL 文件: 1.1. 使用 Assembly 类加载 DLL using System.Reflection; // 加载 mydl…

    C# 2023年6月7日
    00
  • EF Core基础入门教程

    EF Core是一个轻量级、可扩展的ORM框架,提供了一种使用C#代码进行数据库访问和操作的方式。在本篇文章中,我们将介绍EF Core的基础入门教程。 安装EF Core 首先,下载并安装.NET Core SDK。然后,可以使用以下命令安装EF Core: dotnet add package Microsoft.EntityFrameworkCore …

    C# 2023年6月3日
    00
  • Entity Framework使用LINQ操作实体

    让我来详细讲解一下“Entity Framework使用LINQ操作实体”这个主题的完整攻略。 什么是Entity Framework? Entity Framework (EF) 是一个面向对象的关系数据库数据访问框架, 功能十分强大,能够提供对多种数据库的支持,包括 SQL Server、Oracle、MySQL 和 SQLite 等等。使用 Entit…

    C# 2023年6月1日
    00
  • C#实现窗体淡入淡出效果的方法总结

    C#实现窗体淡入淡出效果的方法总结 1. 引言 在C#编写窗体应用程序时,我们可能会需要为窗体增加各种特效来增强用户的体验感。其中,淡入淡出效果是一种比较常见的特效方式,可以使窗体的显示效果更加平滑自然。那么,本篇文章将对C#实现窗体淡入淡出效果的方法进行总结。 2. 方法总结 2.1 使窗体透明度渐变 首先,我们可以通过改变窗体的透明度,来实现窗体淡入淡出…

    C# 2023年6月7日
    00
  • layui实现显示数据表格、搜索和修改功能示例

    以下是将layui用于显示数据表格、搜索和修改功能的完整攻略。 前置条件 首先你需要安装layui包,你可以从layui官网下载或使用CDN链接 引入layui.js和layui.css文件 显示数据表格 这是一个基于layui table模块的示例。下面是一个基本的HTML结构,它定义了一个table和一个div包含分页: <table id=&qu…

    C# 2023年5月31日
    00
  • ASP.NET Core依赖注入DI容器的方法实现

    ASP.NET Core依赖注入DI容器的方法实现攻略 ASP.NET Core依赖注入(DI)是一种设计模式,它允许我们将对象的创建和管理从应用程序代码中分离出来。在ASP.NET Core中,我们可以使用内置的DI容器来实现依赖注入。本攻略将介绍如何使用ASP.NET Core的DI容器。 步骤 以下是使用ASP.NET Core的DI容器的步骤: 在S…

    C# 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部