C# 中的类与结构:了解差异和性能比较

  1. 介绍

您准备好将您的 C# 编程技能提升到一个新的水平了吗?

然后,您需要了解类和结构之间的区别。作为 C# 编程的两个最基本的构建块,知道如何以及何时使用它们对于创建高效、有效的代码至关重要。

在本文中,我将为您提供了解 C# 中的类和结构的综合指南。我们将首先简要概述一下类和结构是什么。然后,我们将深入探讨它们之间的主要区别,并提供真实示例来帮助说明它们的用法。

但这还不是全部。我们还进行了性能测试,以比较 C# 中类和结构的速度和资源消耗。你将深入了解我们的结果,并了解它们对 C# 开发人员的意义。

那么,让我们开始吧!

II. 什么是类?

类是面向对象编程的构建块,它们是每个开发人员都需要理解的基本概念。在 C# 中,类用于封装数据和行为,允许您创建可重用的模块化代码。

若要在 C# 中创建类,请使用 class 关键字,后跟类的名称。例如:

class Person  
{  
    // Class members go here  
}

定义类后,可以使用关键字从中创建对象。例如:new

Person john = new Person();

这将创建一个名为 的类的新实例。现在,您可以使用对象访问类的属性和方法。PersonjohnPersonjohn

让我们仔细看看班级内部的内容。可以在类中定义两种主要类型的成员:字段和方法。

字段是存储数据的变量,通常用于表示对象的状态。例如,一个类可能包含人员姓名、年龄和地址的字段:Person

class Person  
{  
    string name;  
    int age;  
    string address;  
}

另一方面,方法是执行操作或计算的函数。它们可以访问和操作对象的字段,以及执行其他操作。例如,一个类可能有一个根据其出生日期计算此人的年龄的方法:Person

class Person  
{  
    string name;  
    DateTime dateOfBirth;  
      
    public int GetAge()  
    {  
        DateTime today = DateTime.Today;  
        int age = today.Year - dateOfBirth.Year;  
        if (dateOfBirth > today.AddYears(-age))  
            age--;  
        return age;  
    }  
}

在此示例中,该方法使用人员的出生日期字段根据当前日期计算其年龄。GetAge

使用类的主要好处之一是它们允许您封装数据和行为,这意味着您可以隐藏代码的实现细节,并仅公开其他开发人员使用所需的部分。这使您的代码更加模块化且更易于维护。

除了字段和方法之外,还可以定义其他类型的类成员,包括构造函数、属性、事件和嵌套类。其中每一种都有特定的用途,可以帮助您创建更强大、更灵活的代码。

构造函数是用于在创建对象时初始化对象字段的特殊方法。它们与类同名,并使用关键字定义。下面是一个示例:public

class Person  
{  
    public string Name;  
      
    public Person(string name)  
    {  
        Name = name;  
    }  
}

在此示例中,该类具有一个构造函数,该构造函数采用参数并将字段设置为该值。当您创建一个新对象时,您可以传入一个名称,该名称将被分配给该字段:PersonnameNamePersonName

Person john = new Person("John");

构造函数可以有多个参数,也可以重载。这意味着您可以使用不同的参数列表定义多个构造函数。下面是一个示例:

class Person  
{  
    public string Name;  
    public int Age;  
      
    public Person(string name)  
    {  
        Name = name;  
        Age = 0;  
    }  
      
    public Person(string name, int age)  
    {  
        Name = name;  
        Age = age;  
    }  
}

在此示例中,该类有两个构造函数:一个采用参数并将字段设置为 ,另一个同时采用 a 和参数并设置这两个字段。PersonnameAge0nameage

析构函数用于执行对象被销毁时需要执行的任何清理任务。它们是使用符号后跟类名称定义的。下面是一个示例:~

class Person  
{  
    public string Name;  
      
    public Person(string name)  
    {  
        Name = name;  
    }  
      
    ~Person()  
    {  
        Console.WriteLine("Person object destroyed.");  
    }  
}

在此示例中,该类具有一个析构函数,该析构函数只是在对象被销毁时将消息写入控制台。您不直接调用析构函数;相反,当不再使用对象时,垃圾回收器会自动调用它们。Person

值得注意的是,您并不总是需要在类中定义析构函数。事实上,在大多数情况下,您根本不需要。析构函数主要用于释放非托管资源,例如文件句柄或数据库连接。如果类不使用任何非托管资源,则无需定义析构函数。

除了析构函数之外,C# 还提供了称为终结器的功能。

终结器与析构函数类似,因为它们用于执行清理任务,但它们的工作方式略有不同。终结器使用符号后跟类名进行定义,垃圾回收器在销毁对象之前调用它们。但是,由于终结器是由垃圾回收器调用的,因此无法准确预测何时调用它们,甚至无法预测它们是否会被调用。出于这个原因,应谨慎使用终结器,并且仅在您别无选择时才使用。~

现在我们已经深入介绍了类,让我们继续讨论一个相关主题:C# 中的结构。

III. 什么是结构体?

结构体是“结构体”的缩写,是 C# 中用户定义的值类型。它类似于类,因为它可以包含数据成员和成员函数(方法),但两者之间存在一些关键差异。

结构和类之间的主要区别之一是结构是值类型,而类是引用类型。这意味着,当您创建结构的实例时,它会在堆栈上分配,而类的实例会在堆上分配。

另一个区别是结构不能继承自基类或用作基类。但是,结构体可以实现接口,就像类一样。

结构体的目的是将相关数据组合成一个单元。这可以使您的代码更有条理、更易于理解,并且在内存使用方面更有效(您将在本文末尾看到性能测试结果。所以,继续阅读)。

下面是 Employee 结构在 C# 中可能是什么样子的示例:

struct Employee  
{  
    public string name;  
    public int id;  
    public double salary;  
}

在此示例中,结构包含三个公共数据成员:name(字符串)、id(int)和 payual(双精度)。

在 C# 中,可以使用或不使用“new”关键字创建结构体的实例。

// Creating a struct instance with the "new" keyword  
struct Person  
{  
    public string name;  
    public int age;  
}  
  
Person person1 = new Person();  
person1.name = "John";  
person1.age = 30;

在此示例中,我们定义了一个名为“Person”的结构,其中包含两个公共数据成员:“name”(字符串)和“age”(整数)。然后,我们使用“new”关键字创建一个名为“person1”的结构的新实例,并使用点表示法设置其数据成员。

// Creating a struct instance without the "new" keyword  
struct Point  
{  
    public int x;  
    public int y;  
}  
  
Point point1;  
point1.x = 5;  
point1.y = 10;

在此示例中,我们定义了一个名为“Point”的结构,其中包含两个公共数据成员:“x”(一个 int)和“y”(一个 int)。然后,我们在不使用“new”关键字的情况下创建一个名为“point1”的结构的新实例,并使用点表示法设置其数据成员。

这是可能的,因为结构是值类型,并且在声明时会自动初始化为其默认值(例如,0 表示整数)。

但是,通常最好使用“new”关键字来创建结构实例,即使您最初不需要设置其数据成员。

IV. C# 中类和结构之间的一些主要区别:

**内存分配:**创建类的实例时,将在堆上分配内存。创建结构体的实例时,会在堆栈上分配内存。这意味着结构的分配和解除分配通常比类更快。

**遗产:**类支持继承,这意味着您可以创建一个新类来继承现有类的数据和行为。结构不支持继承。

**多态性:**类支持多态性,这意味着您可以创建共享公共基类或接口的不同类的对象。结构不支持多态性。

**装箱和拆箱:**装箱是将值类型(如结构)转换为对象引用类型(如类)的过程。取消装箱是将对象引用类型转换回值类型的过程。装箱和拆箱可能很慢,并可能导致内存碎片。类不需要装箱和拆箱,但结构需要。

**易变性:**在 C# 中,可变性是指对象在创建后更改其内部状态的能力。这意味着可以通过添加、删除或更改可变对象的属性、字段或元素来修改可变对象。

另一方面,不可变对象是创建后状态无法更改的对象。

一旦创建了不可变对象,其内部状态就会被固定,任何修改它的尝试都将导致创建一个新对象。由于这个问题很重要,我想我会在另一篇文章中深入解释。

类和结构可以是可变的,也可以是不可变的,这取决于它们的设计方式。

但是,由于结构是值类型,因此默认情况下,它们通常被设计为不可变的。

V. 您可能希望使用类或结构的一些方案:

如果需要支持继承或多态性,或者需要创建将通过引用传递的大型对象,请使用类

如果需要创建一个将按值传递的小对象,或者需要创建一个不会经常变异的对象,请使用结构

由于“EmployeeStruct”的实例是在堆栈上分配的,因此可以比在堆上分配的“EmployeeClass”实例更快地访问和操作它们。

然而,在大多数应用中,这种性能差异通常可以忽略不计。

在检查了类和结构之后,如何从资源消耗和速度方面进行比较?

五、基准测试

对于基准测试,我想到了两种情况。我根据日常生活中经常遇到的情况创造了这两个场景。

测试一

根据第一种情况,需要将应该从服务中获取的数据模型记录在不同的表中。

因此,从服务接收的数据必须映射到两个不同的数据模型。

我通过使用类和结构创建数据模型来测试资源消耗和处理速度。

让我们看看你对结果的看法?

1,000 条记录的测试结果:

图片

包含 10,000 条记录的测试结果。 

图片

具有 100,000 条记录的测试结果。 

图片

具有 1,000,000 条记录的测试结果。 

图片

根据测试结果可以看出,使用 struct 时消耗的资源更少,获得的结果更快。

您可以通过单击此处在我的 GitHub 帐户上访问测试的源代码。

如果你给我的项目一颗星,我会非常高兴。
提前感谢您的好意。

测试二

在第二种情况下,我尝试通过向数组数据结构添加指定数量的值来测试资源消耗和处理速度。

结果如下所示。

从这两个测试的结果来看,我们可以说_结构比类的性能更高。_

图片

总之,了解 C# 中的类和结构对任何开发人员都至关重要。

它们用途广泛、灵活,易于维护和组织代码。

通过利用这些,您可以创建满足项目需求的强大而高效的计划。

如果你喜欢我的文章,请给我一个赞!谢谢

  • 51
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: vb.net与c#是微软公司开发的两种面向对象的程序设计语言。 vb.net是Visual Basic的一种改进版本,它是一种易学易用的语言,适合初学者入门。它的语法结构简单清晰,代码书写风格更接近自然语言,因此比较容易理解和编写。vb.net提供了很多方便的功能和工具,可以快速开发Windows应用程序。与c#相比,vb.net对于处理COM组件和互操作性更为方便,适用于一些老式的系统和项目迁移。 c#是一门更加强大和灵活的语言,它的语法和C/C++似,同时又结合了面向对象和组件开发的特点。c#拥有更多的功能和特性,比如匿名方法、泛型、LINQ等,可以编写更高效和复杂的程序。c#广泛应用于Web应用程序、手机应用程序和游戏开发等领域。与vb.net相比,c#更加注重性能和效率,适用于大型的项目开发。 虽然vb.net和c#语言上存在一些不同,但它们都是面向对象的语言,只是在语法和特性上略有差异。所以对于有基础的程序员来说,学习另一种语言并不困难,只需花一些时间来了解和适应其差异。 总的来说,vb.net适合初学者或者对简单程序需求的开发者,c#对于需要性能、复杂性和灵活性较高的项目更为适用。无论选择哪种语言,掌握基本的编程原理和逻辑思维都是非常重要的。 ### 回答2: VB.NET和C#是.NET平台上两种常见的编程语言,它们都是由微软公司开发的,并且都具备似的语法和功能。 首先,VB.NET是Visual Basic的后续版本,在语法上保留了部分Visual Basic 6.0的特性。它的语法相对来说更加容易学习和理解,代码的可读性较高。VB.NET的开发速度较快,适合用于快速原型的开发和初学者学习编程。此外,VB.NET支持事件驱动编程,有丰富的图形用户界面(GUI)开发工具和库。虽然VB.NET在一些社区和开发者群体之间不如C#流行,但仍然在一些特定的应用场景有着广泛的应用。 而C#是一种更加现代化和强大的编程语言,更加严格和规范。C#拥有更多的编程特性,比如面向对象编程和泛型等高级功能,开发者可以更加灵活地处理复杂的问题。C#的代码更加简洁、规范,可读性较高,它的运行效率也相对较高。C#在跨平台和服务器端开发领域有着广泛的应用,特别是在.NET Core的推动下,C#已经成为了一种非常受欢迎的编程语言。 总之,VB.NET和C#在语法和功能上存在一些差异,选择使用哪种语言主要取决于开发者的个人喜好、项目需求以及技术栈。无论选择VB.NET还是C#,都可以在.NET平台上进行完美的应用开发。 ### 回答3: # VB.NET和C#都是微软公司为开发者提供的两种主要的编程语言。它们都属于.NET平台下的语言,并且都可以用于开发各种型的应用程序,包括桌面应用、Web应用、移动应用等。 VB.NET(即Visual Basic .NET)是VB语言的升级版本,在.NET框架下具有更强大的功能和更高的性能。它是一种易学易用的编程语言,注重可读性和可维护性,适合初学者入门。VB.NET采用面向对象的编程思想,具有丰富的库和快速开发工具,能够快速构建应用程序。VB.NET在Windows平台下得到了广泛应用,并且具有优秀的可视化编程能力,可以通过拖拽控件的方式进行UI设计。 C#(即C Sharp)是一种现代化的面向对象编程语言,由微软开发。C#语言的语法与C和C++较为相似,易于掌握。它具有高效的执行速度和强大的功能,支持LINQ查询、异步编程等特性。C#适用于跨平台开发,并且具有良好的可扩展性和可移植性。C#在.NET平台下得到了广泛应用,尤其适合开发Web应用和桌面应用,其对于.NET平台的集成开发环境(IDE)Visual Studio也非常强大。 总结来说,VB.NET和C#是两种功能强大的编程语言,它们在语法、语义等方面虽有一定的差异,但都可以用于.NET平台下的应用程序开发。选择VB.NET还是C#主要取决于个人偏好、项目需求以及和其他开发人员的协作等因素。无论选择哪种语言,都可以通过学习它们的特性和使用场景,为开发高质量的应用程序提供支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值