C#.Net筑基-类型系统②常见类型--结构体类型Struct

简介: 本文介绍了C#中的结构体(struct)是一种用户自定义的值类型,适用于定义简单数据结构。结构体可以有构造函数,能定义字段、属性和方法,但不能有终结器或继承其他类。它们在栈上分配,参数传递为值传递,但在类成员或包含引用类型字段时例外。文章还提到了`readonly struct`和`ref struct`,前者要求所有字段为只读,后者强制结构体存储在栈上,适用于高性能场景,如Span和ReadOnlySpan。

结构体 struct 是一种用户自定义的值类型,常用于定义一些简单(轻量)的数据结构。对于一些局部使用的数据结构,优先使用结构体,效率要高很多。

  • 可以有构造函数,也可以没有。因此初始化时可以new,也可以用默认default。但当给字段设置了初始值时,则必须有显示的构造函数。
  • 结构体中可以定义字段、属性、方法,不能使用终结器。
  • 结构体可继承接口,并实现接口,但不能继承其他类、结构体。
  • 结构体是值类型,被分配在栈上面,因此在参数传递时为值传递。

⁉️结构体始终都是分配在栈上吗?—— 不一定,当结构体是类的成员时,则会随对象一起分配在堆上。同时当结构体上有引用类型字段时,该字段只存储引用对象的地址,引用对象还是分配在堆上。

void Main()
{
  Point p1 = default;
  //Point p1 = default(Point);
  Point p2 = new Point(1, 2);
  p1.X = 100;
  p2.X = 100;
}
public struct Point
{
  public int X;
  public int Y;
  public Point(int x, int y)
  {
    X = x;
    Y = y;
  }
}

1.1、只读结构体与只读函数

readonly struct申明一个只读的结构体,其所有字段、属性都必须是只读的。

public readonly struct Point
{
  public readonly int X,Y;
}

用在方法上,该方法中不可修改任何字段值。这只能用在结构体中,结构体不能继承,不知道这个特性有什么用?

public struct Point
{
  public int X;
  public int Y;
  public readonly int GetValue()
  {
    X--;   //Error:不可修改
    return X + Y;
  }
}

1.2、Ref 结构体

ref 结构类型ref struct申明,该结构体只能存储在栈上,因此任何会导致其分配到堆上的行为都不支持,如装箱、拆箱,作为类的成员等都不支持。

Ref 结构体 可用于一些高性能场景,System.SpanReadOnlySpan 都是 readonly ref struct结构体。

public ref struct Point
{
  public int X,Y;
}
相关文章
|
23小时前
|
Java C# 数据安全/隐私保护
|
2天前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
11 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
6天前
|
存储 编解码 算法
C#.NET逃逸时间算法生成分形图像的毕业设计完成!晒晒功能
该文介绍了一个使用C#.NET Visual Studio 2008开发的程序,包含错误修复的Julia、Mandelbrot和优化过的Newton三种算法,生成色彩丰富的分形图像。作者改进了原始算法的效率,将内层循环的画点操作移至外部,提升性能。程序提供五种图形模式,支持放大缩小及颜色更新,并允许用户自定义画布大小以调整精度。还具备保存为高质JPG的功能。附有四张示例图片展示生成的分形效果。
|
8天前
|
Cloud Native API C#
C#的现代化:.NET Core引领的技术革命
【6月更文挑战第9天】`.NET Core引领C#现代化,实现跨平台革命,提升性能并支持云原生应用。异步编程模型优化体验,统一API简化开发流程。C#应用场景扩展,开发效率提高,技术创新加速,预示其未来在技术领域将持续发挥关键作用。`
25 10
|
12天前
|
XML 开发框架 人工智能
C#/.NET/.NET Core拾遗补漏合集(24年5月更新)
C#/.NET/.NET Core拾遗补漏合集(24年5月更新)
|
12天前
|
前端开发 Java C#
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
|
12天前
|
SQL 设计模式 开发框架
.NET异步有多少种实现方式?(异步编程提高系统性能、改善用户体验)
想要知道.NET异步有多少种实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解.NET异步实现的四种方式。
|
13天前
|
XML 开发框架 .NET
【.NET Core】常见C#代码约定
【.NET Core】常见C#代码约定
15 5
|
13天前
|
编译器 C#
【.NET Core】C#编程规范
【.NET Core】C#编程规范
10 0
|
13天前
|
编译器 C#
【.NET Core】深入理解C#中的特殊字符
【.NET Core】深入理解C#中的特殊字符
10 0