结构体

有时候我们仅需要一个小的数据结构,类提供的功能多于我们需要的功能;考虑到性能原因,最好使用结构体。

结构体是值类型,存储在栈中或存储为内联(如果结构体是存储在堆中的另一个对象的一部分)。

例如类class:

public class Dimensions
{
public Dimensions(double length, double width)
{
Length = length;
Width = width;
}
public double Length { get; set; }
public double Width { get; set; }
}

可以使用结构体struct替换:

public struct Dimensions
{
public Dimensions(double length, double width)
{
Length = length;
Width = width;
}
public double Length { get; set; }
public double Width { get; set; }
}

也可以为结构体struct创建函数,和给类创建函数完全相同:

public struct Dimensions
{
public Dimensions(double length, double width)
{
Length = length;
Width = width;
}
public double Length { get; set; }
public double Width { get; set; }
public double Diagonal => Math.Sqrt(Length * Length + Width * Width);
}

结构体初始化

结构体是值类型,但在使用时的语法和类基本一模一样。例如对于上面定义的类或结构体,均可使用代码:

Dimensions point = new Dimensions(3, 6);

注意:

因为结构体是值类型,所以new运算符与类和其他引用类型的工作方式不同。

用于结构体struct的new运算符并不分配堆中的内存,而是只调用相应的构造函数,根据传送给它的参数,初始化所有字段。

对于结构,变量声明实际上是韦整个结构在栈中分配空间。例如用如下语法(如果是类的话,就会编译错误):

Dimensions point; //直接省略new
point.Length = 3;
point.Width = 6;

结构体遵循其他数据类型都遵守的规则:在使用前所有元素都必须进行初始化。

结构体的初始化方法:

  • 使用new运算符
  • 给所有的字段直接赋值

结构体性能影响

  • 为结构体分配内存时,速度非常快,因为它们将内联或者保存在栈中。结构体超出作用域被删除时,速度也很快,不需要等待垃圾收集。
  • 如果把结构体作为参数来传递,或者把一个结构体赋值给另一个结构体,结构体的所有内容就会被复制;这样就会有性能损失。这也是为什么结构体主要用于小的数据结构。
  • 把结构体作为参数传递给方法时,应该把它作为ref参数传递 - 此时只传递了结构体在内存中地址。

只读结构体

C#7.2开始,readonly修饰符可以应用于结构体struct,因此编译器保证结构体的不变性。

public readonly struct Dimensions
{
public Dimensions(double length, double width)
{
Length = length;
Width = width;
}
public double Length { get; }
public double Width { get; }
public double Diagonal => Math.Sqrt(Length * Length + Width * Width);
}

对于readonly修饰符,如果在创建对象后类型更改了字段或属性,编译器就会报错。

使用readonly编译器可以生成优化的代码,使其在传递结构体时不会复制结构体的内容;

相反,编译器使用引用,因为它永远不会改变。

注意:上面readonly结构体的属性是只读的,只有get;如果有set的话,编译会报错:

error CS8341: Auto-implemented instance properties in readonly structs must be readonly.

  

C#结构体struct -0029的更多相关文章

  1. C语言结构体-struct

    知识点: 1)结构体的定义. 2)结构体的sizeof. 3)  结构体的指针. 1) 结构体的定义: 在逻辑上有一定关联的多个数据类型做为一整体进行操作的数据结构,它的关键字是struct.下面我将 ...

  2. 内核中用于数据接收的结构体struct msghdr(转)

    内核中用于数据接收的结构体struct msghdr(转) 我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,pin ...

  3. Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别

    Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始- ...

  4. C语言 - 结构体(struct)比特字段(:) 详细解释

    结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...

  5. Go语言学习笔记(四)结构体struct & 接口Interface & 反射

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  6. 结构体(struct)大小

    结构体(struct)大小 本文参考链接:C语言结构体(struct)常见使用方法,链接中的实例代码经实践有几处不准确,本文在引用时已做更改 注意:在结构体定义时不能申请空间(除非是结构体变量),不可 ...

  7. 结构体struct sockaddr_in, struct sockaddr,struct in_addr

    一.结构体 struct sockaddr_in,  struct sockaddr,  struct in_addr struct sockaddr_in,  struct sockaddr,str ...

  8. GO开发[五]:golang结构体struct

    Go结构体struct Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性 ...

  9. 结构体struct、联合体union、枚举类型enum

    1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...

随机推荐

  1. 关于Java Web结构和SSM框架的理解

    Java Web常见的三层结构 表现层:也就是Web层,常见的框架有Spring MVC.Struts2 ,并包括用于展示的界面,如JSP界面:业务层:Service层,专注于业务逻辑的实现:持久层: ...

  2. Redis数据迁移同步工具(redis-shake)

    前言 最近线上一台自建redis服务的服务器频繁报警,内存使用率有点高,这是一台配置比较简陋(2C8G)的机子了,近期也打算准备抛弃它了.抛弃之前需对原先的数据进行迁移,全量数据,增量数据都需要考虑, ...

  3. Golang源码学习:调度逻辑(四)系统调用

    Linux系统调用 概念:系统调用为用户态进程提供了硬件的抽象接口.并且是用户空间访问内核的唯一手段,除异常和陷入外,它们是内核唯一的合法入口.保证系统的安全和稳定. 调用号:在Linux中,每个系统 ...

  4. JSP指令 & 中文乱码问题

    1. JSP 指令: JSP指令(directive)是为JSP引擎而设计的,     它们并不直接产生任何可见输出, 而只是告诉引擎如何处理JSP页面中的其余部分. 2. 在JSP 2.0中,定义了 ...

  5. Django ListView DetailView等基于类的视图如何添加装饰器?

    场景: Django开发中,如果我们使用了类视图,如:ListView.DetailView.UpdateView等,这时我们又想要对这个视图添加一个装饰器,来实现某种功能,这时候该怎么处理呢? 环境 ...

  6. PAT 1036 Boys vs Girls (25分) 比大小而已

    题目 This time you are asked to tell the difference between the lowest grade of all the male students ...

  7. Chisel3 - model - when

    https://mp.weixin.qq.com/s/YGTXky4wff7LXUphUxISQg   介绍创建模块判断逻辑的when命令.   1. when/elsewhen/otherwise ...

  8. JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.关键字 abstract 1.1.abstract可以修饰:类,方法 1.2.abstract修饰方 ...

  9. Java实现 蓝桥杯VIP 算法提高 扫雷

    算法提高 扫雷 时间限制:1.0s 内存限制:256.0MB 问题描述 扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相 ...

  10. java实现第七届蓝桥杯抽签

    抽签 抽签 X星球要派出一个5人组成的观察团前往W星. 其中: A国最多可以派出4人. B国最多可以派出2人. C国最多可以派出2人. .... 那么最终派往W星的观察团会有多少种国别的不同组合呢? ...