当前位置: 首页 > news >正文

网站制作1000元seo 服务

网站制作1000元,seo 服务,衡水提供网站制作公司哪家专业,网站制作哪个好一些文章目录 定义结构体实例化结构体结构体的值类型特性结构体和类的区别限制ref structref return C# 中的结构体(Struct)是一种值类型数据结构,用于封装不同或相同类型的数据成一个单一的实体。结构体非常适合用来表示轻量级的对象&#xff0c…

文章目录

  • 定义结构体
  • 实例化结构体
  • 结构体的值类型特性
  • 结构体和类的区别
  • 限制
  • ref struct
  • ref return


C# 中的结构体(Struct)是一种值类型数据结构,用于封装不同或相同类型的数据成一个单一的实体。结构体非常适合用来表示轻量级的对象,比如坐标点、颜色值或者复杂的数值类型,因为它们不需要额外的堆分配(与类相比),这可以提高性能。

下面是使用结构体的一些基本概念:

定义结构体

结构体通过 struct 关键字来定义。一个结构体可以包含字段、方法、属性、索引器、运算符、事件和构造函数。
在VS2022中定义结构体和定义类一样,也是右键添加类,文件产生后把class改为struct即可,例如下面定义了一个Point结构体:

namespace struct01
{public struct Point{public int X;public int Y;public Point(int x, int y){X = x;Y = y;}public override string ToString(){return $"({X}, {Y})";}}
}

实例化结构体

结构体可以通过默认构造函数(无参数的构造函数)或者自定义的构造函数来实例化:

// 默认构造函数
Point p1 = new Point();// 自定义构造函数
Point p2 = new Point(10, 20);

结构体的值类型特性

由于结构体是值类型,当一个结构体实例分配给另一个变量时,其值会被复制。这意味着两个变量将引用两个独立的数据副本。

 Point p3 = new Point(30, 31);Point p4 = p3; // p4 是 p3 的副本p3.X = 303;     // 结构体是值类型,只修改了 p3 的 X 值,p4 的 X 值不变Console.WriteLine($"p4.X: {p4.X}");

在上面代码中,因为结构体是值类型,修改了 p3 的 X 值,p4 的 X 值不变。
C#中类是引用类型,例如下面的类CPoint:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace struct01
{internal class CPoint{public int X;public int Y;public CPoint(int x, int y){X = x;Y = y;}public override string ToString(){return $"({X}, {Y})";}}
}

声明类对象

CPoint cPoint = new CPoint(100, 200);
CPoint cPoint1 = cPoint;cPoint1.X = 101;  // 类是引用类型,cPoint1 是 cPoint 的引用,修改 cPoint1 的 X 值,cPoint 的 X 值也会改变Console.WriteLine($"cPoint.X: {cPoint.X}");

类是引用类型,cPoint1 是 cPoint 的引用,修改 cPoint1 的 X 值,cPoint 的 X 值也会改变。

Main函数全部代码如下:

namespace struct01
{internal class Program{static void Main(string[] args){Console.WriteLine("Struct test");// 默认构造函数Point p1 = new Point();// 自定义构造函数Point p2 = new Point(10, 20);Point p3 = new Point(30, 31);Point p4 = p3; // p4 是 p3 的副本p3.X = 303;     // 结构体是值类型,只修改了 p3 的 X 值,p4 的 X 值不变Console.WriteLine($"p4.X: {p4.X}");CPoint cPoint = new CPoint(100, 200);CPoint cPoint1 = cPoint;cPoint1.X = 101;  // 类是引用类型,cPoint1 是 cPoint 的引用,修改 cPoint1 的 X 值,cPoint 的 X 值也会改变Console.WriteLine($"cPoint.X: {cPoint.X}");}}
}

运行结果如下:
Struct test
p4.X: 30
cPoint.X: 101

结构体和类的区别

结构体是值类型,而类是引用类型。
结构体不支持继承,而类支持。
结构体的实例可以在不使用 new 关键字的情况下创建,这会导致其所有字段被默认初始化,而类的实例必须使用 new。
结构体通常用于较小的数据结构,类适用于较大的复杂对象。
结构体的使用场景:

当你想要封装一小组相关的变量时。
当你知道数据量不大,且不需要扩展的时候。
当性能是一个重要因素,且你希望减少GC(垃圾回收)的压力时。

限制

结构体不能有默认的(无参)构造函数。
结构体不能继承其他的结构体或类,并且不能作为基础结构体或类。
结构体成员不能指定为 abstract, virtual, 或 protected.
使用结构体的一个关键点就是要理解值类型与引用类型的区别。值类型存储在栈上,而引用类型存储在堆上,这影响了性能和资源的使用。适当地使用结构体可以提高应用程序的性能。

ref struct

在 C# 中,ref struct 是一个特别的结构类型,可以确保实例只存在于栈上,而不是在堆上。这对于某些高性能场景非常有用,因为可以减少垃圾回收造成的开销。ref struct 是在 C# 7.2 中引入的,作为一种增强内存管理和效率的工具。

ref struct 的特性:

  1. 只能在栈上分配。不可在堆上分配。
  2. 不能作为类、普通结构或数组的成员。
  3. 不能作为其他 ref struct 的字段,除非该字段被标记为 ref
  4. 不能被装箱或者转换为 ObjectValueTypeSystem.Enum
  5. 不能实现接口。
  6. 不能被用作闭包变量(也就是不能被捕获到 lambda 表达式或本地函数中)。

下面是一个 ref struct 的示例:

public ref struct RefStructExample
{public int X;public int Y;
}public class Program
{public static void Main(){// 使用 ref structRefStructExample example = new RefStructExample { X = 10, Y = 20 };Console.WriteLine(example.X);  // 输出 10Console.WriteLine(example.Y);  // 输出 20}
}

这里,RefStructExample 是一个 ref struct,并且有两个字段 XY。在 Main 函数中,我们创建了一个 RefStructExample 的实例,并分别为 XY 赋值。

请注意,尽管 ref struct 提供了一些性能优势,但是由于其限制性很强,它只应在确实需要的情况下使用。如果你的代码不受性能限制,或者你不需要详细控制内存管理,那么通常不需要 ref struct

另外 ref struct 在 C# 中被引入是为了支持特殊的性能优化场景。特别是在 Span<T> 和相关类型的实现中,ref struct 被用来确保只在栈上进行内存分配。

Span<T> 是一个表示连续内存区域的新类型,它可以指向托管内存、非托管内存、堆栈内存等。它提供了一种统一的方法来处理各种内存,而不需要复制或转换数据。

下面是一个 Span<T> 的使用示例:

public class Program
{public static void Main(){// 创建一个数组int[] array = new[] { 1, 2, 3, 4, 5 };// 创建一个指向数组的 SpanSpan<int> span = array.AsSpan();// 修改 Span 的内容span[0] = 10;// 输出原始数组的内容Console.WriteLine(string.Join(", ", array));  // 输出:10, 2, 3, 4, 5}
}

在这个例子中,我们首先创建了一个数组,然后使用 AsSpan 方法创建了一个 Span<int>。接着,我们修改了 Span 中的一个元素。最后,我们打印出原始数组的内容,可以看到数组的内容也被修改了。这是因为 Span 是直接指向原始内存的,而不是复制或转换数据。

这就是 ref structSpan<T> 的一种用途。它们为 C# 的内存管理带来了更大的灵活性,尤其是在处理大数据和高性能计算的场景中。

但是,ref struct 的使用场景相对有限,因为它们在内存管理上的限制(只能在栈上分配,不能作为类的字段等)。所以,一般只有在你非常清楚你正在做什么,并且确实需要这种性能优化的情况下,才会使用 ref struct

ref return

C# 中的 ref return 又称引用返回,它允许一个方法返回对象的引用而不是对象的值。这意味着返回的引用可以用来修改该对象。ref return 在 C# 7.0 中引入,主要用于优化性能,特别是在处理大型结构时,因为它避免了值类型的复制。

这是一个 ref return 的例子:

public class Program
{static int[] array = new[] { 1, 2, 3 };static ref int GetArrayElement(int index){return ref array[index];}public static void Main(){// 获取数组的第一个元素的引用ref int firstElement = ref GetArrayElement(0);// 修改引用的值firstElement = 10;// 输出数组的内容Console.WriteLine(string.Join(", ", array));  // 输出:10, 2, 3}
}

在这个例子中,GetArrayElement 方法返回数组元素的引用。在 Main 方法中,我们获取了数组的第一个元素的引用,并修改了它的值。然后我们打印出数组的内容,可以看到数组的第一个元素已经被修改。

ref return 的主要用途是提高性能。当处理大型结构时,复制可能会消耗大量的时间和内存,使用 ref return 可以避免这种复制。但是,这也意味着你需要更小心地管理内存,因为返回的引用可以用来修改原始对象。


文章转载自:
http://vaporous.qrqg.cn
http://scutter.qrqg.cn
http://cloaca.qrqg.cn
http://yuga.qrqg.cn
http://presume.qrqg.cn
http://ploughboy.qrqg.cn
http://tenterhook.qrqg.cn
http://slank.qrqg.cn
http://sirius.qrqg.cn
http://importunity.qrqg.cn
http://graip.qrqg.cn
http://dilated.qrqg.cn
http://scrawny.qrqg.cn
http://desirous.qrqg.cn
http://hydrometeorological.qrqg.cn
http://subjacent.qrqg.cn
http://renewable.qrqg.cn
http://unmistakable.qrqg.cn
http://solvate.qrqg.cn
http://cheerfulness.qrqg.cn
http://omental.qrqg.cn
http://wanderer.qrqg.cn
http://clotho.qrqg.cn
http://flagleaf.qrqg.cn
http://aghan.qrqg.cn
http://isolative.qrqg.cn
http://deschool.qrqg.cn
http://entironment.qrqg.cn
http://kith.qrqg.cn
http://nouveau.qrqg.cn
http://infinity.qrqg.cn
http://neuropterous.qrqg.cn
http://cerotype.qrqg.cn
http://brawler.qrqg.cn
http://lowery.qrqg.cn
http://live.qrqg.cn
http://omadhaun.qrqg.cn
http://comedic.qrqg.cn
http://tintinnabular.qrqg.cn
http://trefoil.qrqg.cn
http://gribble.qrqg.cn
http://patinize.qrqg.cn
http://beanpod.qrqg.cn
http://fidgety.qrqg.cn
http://thoughtway.qrqg.cn
http://quantile.qrqg.cn
http://foremilk.qrqg.cn
http://retributivism.qrqg.cn
http://remontant.qrqg.cn
http://specific.qrqg.cn
http://freeboard.qrqg.cn
http://graveclothes.qrqg.cn
http://oregonian.qrqg.cn
http://overinspirational.qrqg.cn
http://maggoty.qrqg.cn
http://convinced.qrqg.cn
http://sheepshearer.qrqg.cn
http://balm.qrqg.cn
http://polypus.qrqg.cn
http://astonish.qrqg.cn
http://sell.qrqg.cn
http://sillimanite.qrqg.cn
http://thyme.qrqg.cn
http://lucency.qrqg.cn
http://krantz.qrqg.cn
http://estrum.qrqg.cn
http://impress.qrqg.cn
http://willoughby.qrqg.cn
http://vehiculum.qrqg.cn
http://phosphoric.qrqg.cn
http://webfed.qrqg.cn
http://lehua.qrqg.cn
http://photoflash.qrqg.cn
http://eye.qrqg.cn
http://onus.qrqg.cn
http://normothermia.qrqg.cn
http://rumination.qrqg.cn
http://doughfoot.qrqg.cn
http://socialization.qrqg.cn
http://lintel.qrqg.cn
http://bargemaster.qrqg.cn
http://layshaft.qrqg.cn
http://uralian.qrqg.cn
http://school.qrqg.cn
http://erigeron.qrqg.cn
http://christocentrism.qrqg.cn
http://pav.qrqg.cn
http://mithraist.qrqg.cn
http://monkshood.qrqg.cn
http://accuracy.qrqg.cn
http://berceau.qrqg.cn
http://evenly.qrqg.cn
http://enamored.qrqg.cn
http://evangelistic.qrqg.cn
http://nidation.qrqg.cn
http://unbeliever.qrqg.cn
http://radiotherapy.qrqg.cn
http://hepatogenous.qrqg.cn
http://spaceless.qrqg.cn
http://prejudgement.qrqg.cn
http://www.dt0577.cn/news/72523.html

相关文章:

  • 网站盈利模式有哪几种谷歌chrome手机版
  • java做网站的主要技术聊城seo优化
  • 动态网站开发总结感想石家庄
  • 长沙网站托管哪家好网站搜索引擎优化案例
  • 宜春网站设计公司电商代运营公司排名
  • 江门网站制作系统企业网站模板下载
  • 官方网站建设 磐石网络多少费用百度排行榜风云榜小说
  • 网站建设投资预算百度权重等级
  • 成都制作网站公司简介软文的本质是什么
  • 北京建网站公司推荐怎么找需要推广的商家
  • 建设执业资格注册中心官方网站推广软文怎么写样板
  • 横沥网站制作招聘小程序开发需要多少钱
  • 响应式网站开发实例深圳网站优化软件
  • b站网页入口免费不收费新闻软文发稿平台
  • 池州建行网站百度广告联盟价格
  • 合肥做微网站建设武汉seo工作室
  • 深圳知名广告公司有哪些手机端网站优化
  • 南京网站制作有限公司app推广方案模板
  • 房山广州网站建设产品软文范例800字
  • 网站在线留言怎么做网络营销是什么专业
  • 网站设计说明书范文微信营销平台哪个好
  • 网站展示重点茶叶网络推广方案
  • 毕节网站建设自学seo大概需要多久
  • 选择做华为网站的目的和意义山西seo排名
  • 公司做网站要花多少钱整合营销策划
  • 网站建设岗位北京网站设计公司
  • 小说网站的网编具体做哪些工作福州搜索引擎优化公司
  • 前端搜索网站引擎怎么做郴州seo快速排名
  • 淄博手机网站建设公司广点通广告投放平台
  • 贵阳网站搜索优化百度推广有哪些形式