No title

结构和类

在 C# 中,struct(结构)是一种值类型的数据结构,它有一些特定的特点和使用场景。以下是 C# 结构的主要特点:

1. 值类型

  • 结构是值类型,而不是引用类型。这意味着当你将结构赋值给另一个结构时,会复制结构的所有字段的值,而不是复制引用。
  • 结构的实例存储在栈上(在方法内)或在内存中的数据区域中(作为类的字段时)。

2. 内存分配

  • 结构通常比类更节省内存,因为它们存储在栈上(当它们是局部变量时),而不是堆上。
  • 对于小型的数据类型,使用结构可以减少垃圾回收的开销。

3. 无继承

  • 结构不能继承自其他结构或类,也不能作为基类被其他结构或类继承。
  • 结构可以实现接口,但不能继承其他类型。

4. 默认构造函数

  • 结构不能定义显式的无参数构造函数。编译器会提供一个默认的无参数构造函数,初始化所有字段为其默认值(例如,0falsenull)。

5. 字段和方法

  • 结构可以包含字段、属性、方法、事件和构造函数(除了无参数构造函数外)。
  • 结构可以有静态成员,但不能有实例字段和静态字段的混合。

6. 内存布局

  • 结构的字段是按声明的顺序在内存中排列的。它们的内存布局通常比类更紧凑。

7. 复制行为

  • 由于结构是值类型,当你将一个结构赋值给另一个结构时,所有字段都被复制。这意味着改变一个结构的副本不会影响原始结构。

8. 默认值

  • 结构的默认值是所有字段的默认值(例如,0falsenull)。

9. 可空类型

  • 结构可以使用 Nullable<T> 类型(或简写 T?)来表示可以赋值为 null 的结构。例如:int? 表示可以为 null 的整数。
  • 值类型默认不能设置成 null,

10. 实例化

  • 结构可以用 new 关键字实例化,或在定义时直接初始化,但即使不使用 new 关键字,结构的字段仍会被初始化为默认值。

11.结构使用的场景:

1,一般储存少量且简单的数据结构,追求性能,(如int,long,bool)等
2,存储大量且复杂的数据结构,且性能高(场景少一些)

ref struct 的特点总结

  • 栈分配: ref struct 只能在栈上分配,无法在堆上分配。
  • 性能优化: 适用于需要严格控制内存分配和优化性能的场景。
  • 限制: 不支持装箱、继承和实现接口,不能作为类的字段。

return ref的特点总结

  • **return ref**:使得方法能够返回对结构体字段或数组元素的引用,而不是值的副本,适用大型结构。

  • 性能优化:减少不必要的数据复制,适用于需要直接修改数据的场景。

  • 生命周期:确保引用的生命周期是有效的,不会超出数据的有效范围。

  • public ref int GetElement(int index)
        {
            
    
            return ref data[index];//返回的地址
        }
        
        
        // 获取对数组元素的引用
            ref int element = ref example.GetElement(5);