C#——结构和类问题总结


前言

很久没有更新,C#相关的东西了,项目中正好碰到结构体和类对象,在此做梳理总结,对比两个的差异,从而引导出项目中区别使用的地方。


一、结构体是什么?

结构体(struct)是C#中的一种值类型,用于定义一个数据结构,其中可以包含字段、方法、属性、事件、运算符、索引器等成员。

1)定义

public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }

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

    public void Display()
    {
        Console.WriteLine($"X: {X}, Y: {Y}");
    }
}

2)特点

  • 值类型
    结构体是值类型,分配在栈上,而不是堆上。当结构体变量被赋值给另一个变量时,实际的数据会被复制,而不是引用。这意味着对一个结构体变量的修改不会影响另一个结构体变量。
  • 无继承
    结构体不能从其他结构体或类继承,但是可以实现接口
  • 内存高效
    由于结构体在栈上分配内存,因此在处理小型数据对象时,结构体通常比类更高效
  • 默认构造函数
    每个结构体都有一个隐式的无参构造函数,该构造函数会将所有字段初始化为其默认值。你不能定义一个显式的无参构造函数,但可以定义有参数的构造函数
  • 初始化要求
    在使用结构体实例之前,必须初始化所有字段,否则会导致编译错误。

二、类(对象)是什么?

类(class)是C#中的一种引用类型,用于定义对象的模板。它封装了数据和行为,可以包含字段、属性、方法、事件,运算符等成员。类是面向对象编程(OOP)的基础,可以通过继承和多态等特性来实现代码的重用和扩展。

1)定义

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

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

    public void Display()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}

2)特点

  • 引用类型
    类是引用类型,实例化时存储在堆上。当一个类的实例被传递给另一个变量时,两个变量引用的是同一个对象,因此对其中一个变量的修改会影响另一个变量
  • 继承
    类支持继承,可以有一个基类(父类)和多个派生类(子类)。通过继承,子类可以重用父类的代码,并可以重写或扩展父类的行为
  • 多态性
    通过继承和接口,类可以实现多态性,允许使用基类类型的变量来引用派生类的对象,从而实现灵活的代码设计。
  • 构造函数
    类可以有一个或多个构造函数,用于在创建对象时初始化对象的状态。如果没有定义构造函数,编译器会提供一个默认的无参构造函数。
  • 垃圾回收
    类实例的内存由垃圾回收器管理,当对象不再被引用时,垃圾回收器会自动释放内存

三、两者的差异性与选择环境?

1)差异性

由上述描述的来看我们不难发现以下几点:

  • 类型差异:
    结构体是值类型,类是引用类型。我们延伸以下:
    a.回收上:值类型脱离域后自动释放,引用类型需要等待GC管理。
    b.性能上:结构在栈上内存分配和释放更高效,类在堆上分配和回收内存的开销较大。
    c.传递方式上:值类型传递时是数据副本传递,副本修改不影响源数据。引用类型是传递引用,对引用改变源数据也会改变。
  • 继承差异:
    结构体只能实现接口,无法继承其他结构体。
    类能实现接口,也支持继承,可以有基类和派生类。
  • 构造差异:
    结构体有隐式的无参构造函数,但不能显式定义无参构造函数。在使用结构体实例之前完全初始化所有字段,否则会导致编译错误。
    类可以有显式定义的无参构造函数和有参构造函数。可不实例化默认值为null。

2)选择环境

通过上述分析不同后,可对应下面的场景。
选择类

  • 需要引用语义时(多个引用指向同一个实例)。
  • 需要继承和多态时。
  • 实例的生命周期较长,且大小较大时。

选择结构体

  • 需要值语义时(副本之间相互独立)。
  • 数据结构较小且简单时。
  • 实例的生命周期较短,且频繁创建和销毁时。

总结

类和结构体在C#中有各自的适用场景。类适用于复杂、需要引用语义的数据结构,而结构体适用于小型、简单且频繁操作的数据结构。了解它们上述的差异和使用场景,可以帮助我们在开发过程中做出更好的设计选择。

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 C# WinForm 中实现修改密码功能,可以按照以下步骤进行: 1. 在 WinForm 中添加两个文本框和一个按钮,一个文本框是用于输入旧密码,另一个文本框是用于输入新密码,按钮是用于提交修改密码的操作。 2. 在按钮的 Click 事件中,编写代码实现密码修改的逻辑。首先,可以将用户输入的旧密码和新密码保存到字符串变量中,然后可以使用一些条件语句对密码进行验证,例如,旧密码是否正确,新密码是否符合要求等等。如果密码验证通过,可以调用相应的方法将新密码保存到数据库中。 下面是一个简单的密码修改示例代码: ```csharp private void btnChangePassword_Click(object sender, EventArgs e) { string oldPassword = txtOldPassword.Text.Trim(); string newPassword = txtNewPassword.Text.Trim(); // 验证旧密码是否正确 if (!ValidateOldPassword(oldPassword)) { MessageBox.Show("旧密码不正确!", "提示"); return; } // 验证新密码是否符合要求 if (!ValidateNewPassword(newPassword)) { MessageBox.Show("新密码不符合要求!", "提示"); return; } // 将新密码保存到数据库中 if (!SaveNewPassword(newPassword)) { MessageBox.Show("密码修改失败!", "提示"); return; } MessageBox.Show("密码修改成功!", "提示"); } private bool ValidateOldPassword(string password) { // TODO: 根据需要实现旧密码验证逻辑 return true; } private bool ValidateNewPassword(string password) { // TODO: 根据需要实现新密码验证逻辑 return true; } private bool SaveNewPassword(string password) { // TODO: 根据需要实现保存新密码到数据库的逻辑 return true; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值