C# 结构体和类

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

写单片机习惯了结构体的方式 定义数据;导致现在写C# 忽略了类的方式定义


一、类(Class)

  1. 引用类型:类是引用类型,当一个类的实例被创建时,变量指向堆上的对象
  2. 继承:类支持继承,可以派生自另一个类,并且可以实现多个接口。
  3. 构造函数:类可以有无参或有参构造函数,默认情况下会有一个无参构造函数。
  4. 成员访问修饰符:类可以包含私有、受保护、公共等不同访问级别的成员。
  5. 垃圾回收:由于类是引用类型,所以不再使用的类实例将由CLR的垃圾收集器自动清理。

二、结构体(Struct)

  1. 值类型:结构体是值类型,意味着它们直接存储数据,而不是引用数据的位置。因此,当一个结构体实例被赋值给另一个变量时,实际上是复制了整个结构体的数据。
  2. 不支持继承:结构体不能从其他类或结构体继承,也不能作为其他类型的基类型。但是,结构体可以实现接口。
  3. 构造函数:结构体可以拥有有参构造函数,但默认情况下不会提供无参构造函数。如果定义了任何构造函数,则必须显式地定义无参构造函数。
  4. 成员访问修饰符:结构体也可以包含私有、公共等不同访问级别的成员,但是默认字段和事件是私有的。
  5. 性能:因为结构体是值类型,所以在某些场景下(如频繁创建和销毁的小型数据结构),使用结构体可能比使用类更高效。

示例代码(定义类和结构体)

代码如下(示例):

csharp 复制代码
// 定义一个类
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 Introduce()
    {
        Console.WriteLine($"Hello, my name is {Name} and I'm {Age} years old.");
    }
}

// 定义一个结构体
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 PrintPoint()
    {
        Console.WriteLine($"Point: ({X}, {Y})");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 使用类
        Person person1 = new Person("Alice", 30);
        Person person2 = person1;
        person2.Age = 35;
        person1.Introduce(); // 输出 "Hello, my name is Alice and I'm 35 years old."

        // 使用结构体
        Point point1 = new Point(1, 2);
        Point point2 = point1;
        point2.Y = 10;
        point1.PrintPoint(); // 输出 "Point: (1, 2)"
        point2.PrintPoint(); // 输出 "Point: (1, 10)"
    }
}

类的继承

C#中的类的继承是指一个类(派生类)从另一个类(基类)中继承属性和方法。这允许代码的重用和扩展,使派生类可以继承基类的特性,并在其基础上添加或覆盖特定的行为。

代码示例(类的继承)

c 复制代码
// 基类
public class Animal
{
    public string Name { get; set; }

    public void Speak()
    {
        Console.WriteLine("Animal speaks");
    }
}

// 派生类
public class Dog : Animal
{
    public string Breed { get; set; }

    public new void Speak()
    {
        Console.WriteLine("Dog barks");
    }
}

// 另一个派生类
public class Cat : Animal
{
    public string Color { get; set; }

    public void Meow()
    {
        Console.WriteLine("Cat meows");
    }
}

// 程序入口
class Program
{
    static void Main(string[] args)
    {
        // 创建一个Dog对象
        Dog myDog = new Dog();
        myDog.Name = "Fido";
        myDog.Breed = "Golden Retriever";

        // 调用基类的Speak方法
        myDog.Speak(); // 输出: Dog barks

        // 创建一个Cat对象
        Cat myCat = new Cat();
        myCat.Name = "Kitty";
        myCat.Color = "White";

        // 调用基类的Speak方法
        myCat.Speak(); // 输出: Animal speaks

        // 调用派生类的Meow方法
        myCat.Meow(); // 输出: Cat meows
    }
}

总结

结构体对内存友好,用完及时释放,但是对面向对象编程不友好,当大量数据时操作繁琐复杂(不是老手不建议使用);类的方式适合面向对象编程,特别是处理大量数据的时候更能体现其价值;

相关推荐
你不是我我1 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
tjl521314_212 小时前
04C++ 名称空间(Namespace)
开发语言·c++
赏金术士2 小时前
Kotlin 数据流与单双向绑定
android·开发语言·kotlin
逻辑驱动的ken3 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ5 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D6 小时前
Java 面向对象高级 接口
java·开发语言
两年半的个人练习生^_^7 小时前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范
杨凯凡7 小时前
【032】排查入门:jstack、heap dump、Arthas 初识
java·开发语言·后端
其实防守也摸鱼7 小时前
无线网络安全--实验 规避WLAN验证之发现隐藏的SSID
java·开发语言·网络·安全·web安全·智能路由器·无线网络安全