EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

C#struct关键字

struct的关键字

写法与类相似,

但是只能放值类型变量,

struct是从C语言继承过来的东西,

C语言里面的结构体可以存放变量,不能直接放方法,但是可以存放函数指针,

不过结构体成员中的函数不能访问结构的成员,

所以后来出现了类。


再次提醒

在 C# 中,结构体是值类型数据结构。

✦ 类是引用类型,结构是值类型

✦ 结构不支持继承。

✦ 结构不能声明默认的构造函数。


另外,

C# 中的结构与传统的 C 或 C++ 中的结构完全不同,

C#结构可带有方法、字段、索引、属性、运算符方法和事件,

这些看起来就是个Class的基本功能了,

 

但是注意,

Struct是专门对值类型的,它是存放在栈里面,而不是堆。(就像其它值类型一样)

✦ 它不会触发GC垃圾回收。

✦ 它比Class功能少。

 

应用场景

✦ 新手建议使用Class,只有后期存在性能优化的需求的时候才考虑Struct。

✦ 我们应当避免 定义struct。

 

除非满足以下任意条件:
① 逻辑上表达了一个单一值,类似基本数据类型(int, double)。
② 实例大小低于16字节。(放心你普遍达不到这种要求)
③ 不可改变。
④ 不会被频繁装箱。

 

举个例子

你需要定义桌面坐标(x,y),

那么使用结构体是合适的,

比如

public struct Point
{
    public int x;

    public int y;
}

 


 

解释一下为什么说用Struct性能优化

 

值类型的实例所占的内存=它的字段需要的内存的总和。

CLR会把该类型内的字段大小设置为该字段实际大小的整数倍。

举例:

public struct A
{
    byte b;   // 1 byte,8 byte
    long l;   // 8 byte
}

byte只占1个字节,但实际会占8个字节。
long占8个字节,实际也只能占8个字节。
所以struct A实际上占16个字节。(当然你还可以用特殊方法再减少开销)


当你用class的时候的内存开销远大于struct。

class

✦ 需要为 引用 和 对象单独分配内存。

✦ 对象所占内存=其字段所占内存总和+[额外至少8字节管理开销]

✦ 每个对象的引用,还需要额外的4或8字节。(取决于平台是32还是64位)
 


 

内置类型

✦ 内置类型又被称为原始类型。

✦ 内置类型分为值类型和引用类型。

✦ 有内置类型就有自定义类型。

✦ 内置类型是直接底层处理器支持的。

 

扩展阅读:

[1] C#struct关键字(补充)

This article was last edited at 2020-03-30 19:29:29

* *