C#中struct与class的区别详解

  1. 标题

C#中struct与class的区别详解

  1. 简介

在C#中,struct和class是两种定义类型的方式。它们有着许多相似之处,但也有着许多不同。正确理解和使用struct和class,能够更好的设计可维护、可扩展的程序,提高代码的表现力和效率。

  1. 区别

  2. struct是值类型,class是引用类型

  3. struct和class都可以有方法、属性和字段
  4. struct不支持继承,class支持继承
  5. struct不支持实现接口的默认实现,必须每个位置实现接口的方法,class支持默认实现
  6. struct适用于小型且不需要在堆中分配内存的对象,而class适用于更复杂的对象,需要在堆中分配内存

  7. 示例1

public struct Point
{
    public int X;
    public int Y;

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Point point1 = new Point(0, 0);
        Point point2 = point1;
        point2.X = 10;
        Console.WriteLine($"point1.X: {point1.X}, point2.X: {point2.X}");
    }
}

在上述示例中,我们定义了一个Point结构体,它包含了两个int类型的字段X和Y;然后我们创建Point类型的point1实例,并将它的值赋给point2。接下来,我们将point2的X属性值修改为10。最后,我们可以看到point1.X和point2.X的值是不同的。这是因为我们操作的是两个不同的值类型对象,它们在内存中的位置不同,修改一个不会影响到另一个。

  1. 示例2
public class Rectangle
{
    private int _width;
    private int _height;

    public Rectangle(int width, int height)
    {
        _width = width;
        _height = height;
    }

    public virtual int Area()
    {
        return _width * _height;
    }

    public int Width
    {
        get { return _width; }
        set { _width = value; }
    }

    public int Height
    {
        get { return _height; }
        set { _height = value; }
    }
}

public class Square : Rectangle
{
    public Square(int size) : base(size, size)
    {
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Rectangle rectangle = new Rectangle(2, 3);
        Console.WriteLine("Rectangle area: " + rectangle.Area()); //输出:Rectangle area:6

        Square square = new Square(3);
        Console.WriteLine("Square area: " + square.Area()); //输出:Square area:9
        square.Width = 2;
        Console.WriteLine("Square area after setting width: " + square.Area()); //输出:Square area after setting width: 6

        Rectangle square2 = new Square(4);
        Console.WriteLine("Square2 area: " + square2.Area()); //输出:Square2 area:16
        square2.Width = 3;
        Console.WriteLine("Square2 area after setting width: " + square2.Area()); //输出:Square2 area after setting width: 12
    }
}

在上述示例中,我们定义了一个Rectangle类,它包含了两个int类型的字段Width和Height;然后我们创建Rectangle类型的rectangle实例,输出它的面积;接着我们定义一个Square类,它是继承自Rectangle的,同时它重写了Area方法,使Square类可以根据宽和高计算出它的面积;我们创建Square类型的square实例,并输出它的面积,接着设置它的宽度为2并输出面积,我们可以看出这样的设置不影响它的面积计算。最后,我们将Square类型的square2实例赋值给Rectangle类型的变量square2,输出它的面积,接着设置它的宽度为3并输出面积,我们可以看到square2的宽度变大后,由于修改了父类Rectangle的Width值,其面积也相应变化了。

  1. 总结

通过上面两个示例和本文对struct和class的详细说明,我们可以清楚的认识到它们之间的区别,更好的把握它们的各自优势和局限性。无论选择哪种类型,都需要仔细考虑其适用情况并满足需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中struct与class的区别详解 - Python技术站

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

相关文章

  • C#调用C++动态库接口函数和回调函数方法

    C#调用C++动态库接口函数和回调函数方法是一个常见的集成方式,下面是完整的攻略。 一、准备工作 在开始之前,需要先准备好以下内容: 编写C++动态库代码,并编译成DLL文件。 编写C#代码,用于调用C++动态库的接口函数和回调函数。 二、调用C++动态库接口函数 1. 导入DLL 在C#代码中导入C++动态库,可以使用DllImport特性。在此之前,需要…

    C# 2023年6月1日
    00
  • windows中使用C# 调用 C语言生成的dll

    准备工作 首先,确保你会C#开发,并且已经安装好了Visual Studio。其次,我们需要准备一个C语言的dll,作为我们的示例,我们将使用以下的代码: #include <stdio.h> int add_numbers(int a, int b) { return a + b; } 保存以上代码到一个add_numbers.c的文件中。接下…

    C# 2023年6月1日
    00
  • C#如何在窗体程序中操作数据库数据

    你好,操作数据库是窗体程序的一个关键功能之一,C#通过ADO.NET技术来实现数据库连接,并且提供了丰富的工具和类实现数据的访问、读写和更新等操作。下面是C#在窗体程序中操作数据库数据的完整攻略。 步骤一:创建数据库连接 连接数据库是操作数据库的第一步,C#通过SqlConnection类来创建数据库连接,构造方法的参数是连接字符串,其中包含数据库的地址、用…

    C# 2023年5月15日
    00
  • C#发送邮箱实现代码

    当需要在C#代码中实现邮件发送时,我们可以选择使用System.Net.Mail命名空间中的SmtpClient类和MailMessage类。以下是基本的实现步骤: 引入命名空间System.Net.Mail; 创建一个MailMessage对象,用于指定邮件的发送者、接收者、主题和正文等内容; 创建SmtpClient对象,用于连接SMTP服务器,并发送邮…

    C# 2023年5月15日
    00
  • 在C#中global关键字的作用及其用法

    在C#中global关键字的作用及其用法 在C#中,global关键字可以用来指示某个标识符是全局的,从而可以在任何地方都可以访问到。 用法一:全局命名空间 在C#中,全局命名空间是由所有不属于其他命名空间的类型、函数和变量组成的空间。可以使用global关键字来引用全局命名空间中的类型或变量,例如: global::System.Console.Write…

    C# 2023年5月15日
    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
  • Android实现TCP断点上传 后台C#服务接收

    服务端C#代码示例: using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace TcpServerDemo { c…

    C# 2023年5月15日
    00
  • 在 C# 中使用 Span 和 Memory 编写高性能代码的详细步骤

    在 C# 中,Span 和 Memory 是用于优化代码性能的关键类型。Span 是一种结构体类型,它将对象内存表示为连续的、可编辑的范围。Memory 则是一个类类型,可以包装一段内存以及操作该内存的方法。使用这两种类型,可以使代码更高效地使用内存和更快地执行。 下面介绍一些使用 Span 和 Memory 编写高性能代码的详细步骤。 步骤一:创建 Spa…

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