C#基础教程之类class与结构struct的区别

下面是对于C#基础教程中class与struct的区别的详细讲解:

什么是class与struct

classstruct都是C#中用于封装数据和行为的能力。他们两个非常相似,并且可以实现相同的功能。

class是引用类型,struct是值类型。使用class类型创建的对象,会在堆中分配内存。当你使用new操作符实例化一个类对象时,实际上是在堆上为类分配了一块内存空间。唯一标识这块内存空间的是该对象的引用地址。而struct类型则会在栈中分配内存,在定义值类型变量时,变量实际上存储的是值类型对象的副本,而不是引用,因此它的操作更快。

class与struct的区别

  1. 封装性

在C#中,classstruct都可以用来封装数据和行为;但是他们的封装方式不同。

class是引用类型,因此使用class定义的对象始终是基于对象引用的概念。换句话说,使用class处理数据,就是让类实例引用数据,并且通常情况下,只会创建一个类实例来引用这些数据。

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

class Example
{
    static void Main()
    {
        Animal firstAnimal = new Animal();
        Animal secondAnimal = new Animal();
        firstAnimal.Name = "Tiger";
        secondAnimal.Name = "Lion";
        Console.WriteLine(firstAnimal.Name); // Output: Tiger
        Console.WriteLine(secondAnimal.Name); // Output: Lion
    }
}

struct是值类型,因此使用struct封装的数据通常是基于值的概念。使用struct时,每个结构实例都有自己的数据和状态。结构的实例通常都是基于值类型分配的组合类型。

struct Animal
{
    public string Name { get; set; }
}

class Example
{
    static void Main()
    {
        Animal firstAnimal = new Animal();
        Animal secondAnimal = firstAnimal;
        firstAnimal.Name = "Tiger";
        secondAnimal.Name = "Lion";
        Console.WriteLine(firstAnimal.Name); // Output: Tiger
        Console.WriteLine(secondAnimal.Name); // Output: Lion
    }
}

结果显示,使用结构实例时,数据值真正地根据值属性定义,并且每个实例都包含此特定值。

  1. 继承

在C#中,class支持类的继承,而且继承是OOP程序设计中非常常见的技术。而struct则不支持继承。

class Animal
{
    public string Name { get; set; }
    public virtual void Move()
    {
        Console.WriteLine("I am animal and I can move!");
    }
}

class Mammal : Animal
{
    public bool Fur { get; set; }
}

class Example
{
    static void Main()
    {
        Animal animal = new Animal();
        Mammal mammal = new Mammal();
        mammal.Fur = true;
        mammal.Move(); // Output: I am animal and I can move!
    }
}
  1. 可空性

在C#中,可以使用可空类型定义类型的可空属性。这在某些代码中非常有用。

由于struct是值类型,因此它可以被定义为可空类型。class是引用类型,不能直接定义可空属性。

struct Animal
{
    public string Name { get; set; }
}

class Example
{
    static void Main()
    {
        Animal? animal = null;
        Console.WriteLine(animal.HasValue); // Output: False
    }
}
  1. 默认继承

在C#中,所有的类都是object的派生类,这意味着类具有object类的所有成员。而struct则不是由object派生的,因此它们需要单独实现任何成员。

以下是来自classstruct的默认派生类的示例:

class ExampleClass
{
    // The class inherits from object, so it has ToString
    public override string ToString()
    {
        return "I am a class.";
    }
}

struct ExampleStruct
{
    // The struct doesn't inherit from object, so it doesn't
    // have ToString
    //public override string ToString()
    //{
    //  return "I am a struct.";
    //}
}

class Example
{
    static void Main()
    {
        ExampleClass a = new ExampleClass();
        ExampleStruct b = new ExampleStruct();
        Console.WriteLine(a.ToString());  // Output: I am a class.
        //Console.WriteLine(b.ToString());  // Error CS1061 类型“ExampleStruct”上不存在“ToString”的定义,且找不到可接受该名称的第一个参数的扩展方法
    }
}

结论

classstruct在C#中都是封装数据和行为的优秀工具。但是,它们有不同的特征和限制用法。一般来说,开发人员可以根据特定的开发场景和需要决定使用哪种类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基础教程之类class与结构struct的区别 - Python技术站

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

相关文章

  • C#调用python.exe使用arcpy方式

    下面是详细讲解“C#调用python.exe使用arcpy方式”的完整攻略。 一、前置准备 在 C# 中调用 Python 脚本需要借助于 Process 类,同时需要安装好 python 的开发环境以及第三方库 arcpy。 安装 arcpy: 安装 ArcGIS Desktop 或者 ArcGIS Engine。 执行 ArcGIS Desktop 安装…

    C# 2023年5月15日
    00
  • 如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    当我们使用Spring Boot 2.x版本时,发现Velocity模板不被支持,我们需要重新配置才能使其正常工作。下面是一些解决方法: 1. 添加Velocity的依赖 在pom.xml文件中添加如下代码,引入Velocity的依赖 <dependency> <groupId>org.apache.velocity</grou…

    C# 2023年5月31日
    00
  • C# 添加、修改以及删除Excel迷你图表的实现方法

    这里是详细的攻略: C# 添加、修改以及删除Excel迷你图表的实现方法 1. 前置条件 在开始实现前,需要准备以下环境: Visual Studio或其他开发环境。 Microsoft Office Excel。 在代码中,我们需要用到以下几个命名空间: using Microsoft.Office.Interop.Excel; using System.…

    C# 2023年6月8日
    00
  • C#动态加载dll扩展系统功能的方法

    我会详细讲解“C#动态加载dll扩展系统功能的方法”的完整攻略。首先,我们需要了解何时需要动态加载dll文件。在某些情况下,我们可能需要扩展我们的应用程序的功能或根据用户需求加载插件。这时候,我们可以使用动态加载dll文件的方法来实现。下面我会详细介绍C#动态加载dll扩展系统功能的方法,并提供两个示例说明。 1. 解析dll与加载dll dll文件是由各种…

    C# 2023年6月7日
    00
  • C#自定义基于控制台的Timer实例

    下面就为大家详细讲解如何自定义基于控制台的Timer实例。 准备工作 在使用C#自定义基于控制台的Timer实例之前,我们需要先在命名空间中引用System.Threading命名空间。 using System.Threading; 接着我们需要定义Timer对象和定时器事件处理程序,代码如下: //定义Timer对象 Timer timer = null…

    C# 2023年6月1日
    00
  • asp.net repeater手写分页实例代码

    下面是详细讲解“asp.net repeater手写分页实例代码”的完整攻略,包括以下内容: 实现分页的原理 asp.net repeater手写分页实例的步骤 示例代码说明 实现分页的原理 asp.net中实现自定义分页的原理是先查询出所有数据,再通过页面传递参数来获取当前页码,根据当前页码将所有数据分页显示出来。 具体实现方式是,先使用SQL语句查询出所…

    C# 2023年5月31日
    00
  • .NET Core 2.2新增的部分功能使用尝鲜指南

    .NET Core 2.2 新增的部分功能使用尝鲜指南 .NET Core 2.2 是一个重要的版本,它引入了许多新功能和改进。本攻略将介绍其中的一些新功能,并提供两个示例说明。 新功能 以下是 .NET Core 2.2 中的一些新功能: SignalR SignalR 是一个实时通信库,它可以帮助我们在 Web 应用程序中实现实时通信。在 .NET Co…

    C# 2023年5月16日
    00
  • C#中ArrayList 类的使用详解

    C#中ArrayList 类的使用详解 在C#语言中,ArrayList类是一个非常重要的类,它允许我们在一个集合中存储对象数组。ArrayList类在.NET Framework中作为一个动态数组使用,这就意味着可以在运行时自由地增加或者减少数组的大小,而且类型也是可以变化的。下面我们来详细分析ArrayList类的使用方法。 初始化ArrayList类 …

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