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日

相关文章

  • 基于.Net实现前端对话框和消息框

    基于 .Net 实现前端对话框和消息框 在 .Net 中,可以通过使用 Microsoft 提供的 System.Windows.Forms 命名空间来创建前端交互式窗口和对话框。 创建消息框 消息框可用于向用户显示信息并等待用户的响应。在 .Net 中,可以使用 MessageBox 类来创建消息框。下面是创建消息框的示例代码: MessageBox.Sh…

    C# 2023年6月3日
    00
  • C# 如何实现一个带通知的List

    实现一个带通知的List需要使用C#的事件机制。当List中的数据发生变化时,我们需要通知事件的订阅者。下面是完整攻略和两个示例说明: 1. 定义类 我们需要定义一个新的类来扩展List,在这个新类中,我们将使用C#的事件机制来实现通知功能。下面是示例代码: using System; using System.Collections.Generic; na…

    C# 2023年6月1日
    00
  • ASP.NET MVC把数据库中枚举项的数字转换成文字

    以下是“ASP.NET MVC把数据库中枚举项的数字转换成文字”的完整攻略: 什么是枚举 枚举是一种特殊的数据类型,它定义了一组命名的常量。在.NET MVC中,枚举通常用于表示状态、类型等。 ASP.NET MVC把数据库中枚举项的数字转换成文字的过程 以下ASP.NET MVC把数据库中枚举项的数字转换成文字的详细过程: 步骤1:定义枚举 首先,我们需要…

    C# 2023年5月12日
    00
  • C#如何删除指定文件或文件夹

    当我们需要在C#中删除指定的文件或文件夹时,可以使用.NET框架中的System.IO命名空间提供的相关类和方法来实现。 删除指定的文件 使用System.IO.File类的静态方法Delete()可以删除指定的文件,代码示例如下: using System.IO; string filePath = @"C:\test\test.txt&quot…

    C# 2023年6月1日
    00
  • C#实现数组元素的数据类型转换方法详解

    C#实现数组元素的数据类型转换方法详解 在C#的开发中我们可能会面临需要对数组中的元素进行数据类型的转换,下面详细介绍C#中实现数组数据类型转换的方法。 转换方法1:使用Convert类的To()方法 Convert类有多个静态方法可以实现数据类型转换,其中To()方法可以转换大部分常量类型。下面是使用Convert类的To()方法进行数据类型转换的方法: …

    C# 2023年6月7日
    00
  • 一文详解C#中重写(override)及覆盖(new)的区别

    一文详解C#中重写(override)及覆盖(new)的区别 背景 在C#中,类成员的重写和覆盖是比较常见的概念,但很多人容易混淆二者的区别。本文将详细解释重写和覆盖的概念,并提供示例代码进行解释。 重写(override) 重写表明一个子类的方法将重写基类的方法。必须在子类中使用与父类相同的方法名称、返回类型和参数列表,才能重写基类的方法。子类的方法的访问…

    C# 2023年5月31日
    00
  • c#转换全角半角方法示例

    当我们需要对用户输入的字符或文本进行处理时,经常需要将全角字符转换为半角字符或者将半角字符转换为全角字符。c#中提供了相应的方法来实现这些功能。下面是一个完整的示例说明“c#转换全角半角方法”的攻略。 1. 转换全角到半角 使用 System.Text.RegularExpressions.Regex 类的 Replace 方法可以实现将全角字符转换为半角字…

    C# 2023年6月8日
    00
  • 详解C#实现MD5加密的示例代码

    下面是详解“详解C#实现MD5加密的示例代码”的完整攻略 一、概述 C#语言是微软公司开发的一种面向对象、类型安全、高效的编程语言,常用来开发桌面应用程序、Web应用程序、Windows服务和游戏等。而MD5则是常见的加密算法,可以将任意长度的消息压缩到一个128位的摘要中,通常用来存储密码或验证文件的完整性。 本文主要介绍如何在C#中实现MD5加密算法,并…

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