C#结构的使用

C#中何时使用结构体而非类 在C#开发中,结构体(struct)和类(class)是两种不同的数据结构。类是引用类型,实例化的对象存储在堆上,通过引用进行操作;结构体是值类型,实例存储在栈上,直接存储数据。了解何时使用结构体而非类,对于提高程序性能、优化内存使用和避免意外行为非常重要。 阅读详情

1.结构的声明

·       结构是用户自定义的值类型

struct Pair

{

    public int X, Y; //公有变量名单词的首字母大写(PascalCase规则)

}

struct Pair

{

    private int x, y; //非公有变量名第一个单词的首字母小写(camelCase规则)

}

struct Pair

{

    int x, y; //缺省的访问修饰符是private

};//可以有结尾分号

结构是C#程序员用来定义自己的值类型的最普遍的机制。结构比枚举更强大,因为它提供函数、字段、构造函数、操作符和访问控制。结构成员的缺省访问权限是private(在C++中是public)。当你定义结构的成员名时,不要忘了对公有成员使用PascalCase规则,而对非公有成员使用camelCase规则。

结构类的声明中虽然可以使用结尾分号,但建议你不要使用,这只不过是为了照顾C++程序员的习惯。

2.值的产生

·        一个结构类的变量存在于栈(stack)中

w       字段不是被预先赋值的

w       字段只有被赋值后才能读

w       使用点操作符来访问成员

下面的例子假设Pair是一结构,它有两公有整数类成员X,Y

static void Main()

{

    Pair p;

    Console.Write(p.X); //错误

    ...

}

 

static void Main()

{

    Pair p;

    p.X = 0;

    Console.Write(p.X); //正确

    ...

}

结构类的变量存在于栈中。在上面的例子中,虽然声明了一个叫p的Pair类结构变量,但实际上只是声明两个局部变量p.X和p.Y的一种简写形式。

上面例子中的第一段程序的Console.Write试图使用p.X的值,但它是错误的,因为p.X没有被赋初值。

3.值的初始化

·       一个结构变量:

w       总是能使用缺省构造函数来进行初始化

w       缺省构造函数把字段初始化为0/false/null

static void Main()

{

    Pair p;

    Console.Write(p.X); //错误,p.X没有初始化

    ...

}

static void Main()

{

    Pair p = new Pair();

    Console.Write(p.X); //正确,p.X=0

    ...

}

除了上面介绍的初始化方法外,还可以使用缺省构造函数来初始化一个结构变量。调用构造函数总是使用new关键字。一个结构变量是值类型的,它直接存在于栈中,new关键字的使用不会在堆中开辟内存。结构的缺省构造函数总是把结构变量中的所有字段初始化(你不能改变这一行为,在下面一节会讲到)。

如果你有C++或Java背景,你可能会很难相信使用new关键字来调用构造函数不会在堆中分配内存,但在C#中就是这样。结构变量存在于栈中,调用构造函数初始化它的字段,没有发生堆的内存分配。

C++程序员注意:在C#中调用缺省构造函数必须使用括号。

Pair p = new Pair; //错误

Pair p = new Pair();//正确

4.值的构造函数

·       一般规则

w       编译器声明缺省构造函数

w       你不能声明缺省构造函数

w       缺省构造函数把所有的实例字段初始化为0/false/null

struct Pair

{

}

//编译器声明一缺省构造函数

struct Pair

{

    public Pair()

    { ... }

}

//错误,不能自己声明缺省构造函数

struct Pair

{

    public Pair(int x, int y)

    { ... }

}

//正确,但编译器声明的缺省构造函数仍存在

结构类总有一编译器声明的公有的缺省构造函数。不管你有没有声明构造函数,编译器声明的公有的缺省构造函数总是存在的。所以你不能定义缺省构造函数,这样会出现两个缺省构造函数,这是不允许的。但要注意的是,这只适合于结构,对于类是不适用的。编译器产生的缺省构造函数把所有的实例字段归零化:

l         bool型化为false

l         整型(包括字符型)化为0

l         实型化为0.0

l         枚举型化为0

l         引用型(包括字符串)化为null

用户自定义的结构类的构造函数的默认访问权限是private,和结构类的字段一样。

C#不允许你声明一个和构造函数名字一样的函数。

5.:this(…)

·        一个构造函数可以调用另一构造函数

struct ColouredPoint

{

    public ColouredPoint(int x, int y)

        : this(x, y, Colour.Red)

    {

    }

 

    public ColouredPoint(int x, int y, Colour c)

    {

        ...

    } 

    ...

    private int x, y;

    private Colour c;

}

【Unity 15】 C# 结构体Struct的定义及使用 PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为日更。 笔记内容均为 自己理解,不保证每个都对。 C#笔记未按照难度排列 Part 1 结构体的定义: 在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。结构体是用来代表一个记录。假设您想跟踪图书馆中书的动态。 定义结构体:必须用到Str... 阅读详情

相关推荐

IPD的分析工具与模型(十六)CBB公用基础模块管理实现资源共享,缩短开发周期

CBB流程的开发环节,基于CBB规划中所识别和设计的CBB,进行CBB的详细设计(包括参数设计和接口设计),并最终实现CBB的落地开发。作为特殊类型的技术构件,CBB的开发流程,可沿用技术开发中的构件开发流程,具体包括概念、计划、开发和迁移等步骤,具体可参见前文的相关介绍。有了蓝图与架构设计,落地实施是关键攻坚。具体工作内容包括:具体工作内容包括:a. 以相似性、聚类、相对独行性、可组合、可扩展性、可维护性等原则为指导,按照产品的功能特征和业务类型,聚焦零散的功能点,形成功能模块,实现产品功能模块的划分;

corgi2020的博客 2006

C#学习——语法——Struct(结构)

结构类型(“structure type”或“struct type”)是一种可封装数据和相关功能的值类型。使用struct关键字定义结构类型。

2026

Vensim系统动力学建模实战:从理论到仿真优化【案例详解】

本文详细介绍了Vensim在系统动力学建模中的实战应用,从基础理论到仿真优化全面解析。通过人口增长、供应链库存优化等典型案例,展示如何利用Vensim构建动态模型并进行参数优化,帮助读者掌握系统动力学建模的核心技术与实践技巧。

weixin_29231725的博客 481

一周学会C#(结构一)

一周学会C#(结构一)C#才鸟(QQ:249178521)1.结构的声明·       结构是用户自定义的值类型struct Pair {     public int X, Y; //公有变量名单词的首字母大写(PascalCase规则)}struct Pair {     private int x, y; //非公有变量名第一个单词的首字母小写(cam

zhf7878的专栏 1158

AMESim柱塞泵建模全指南:从HCD库搭建到联合仿真

液压系统仿真中,轴向柱塞泵的建模始终是难点与热点。柱塞泵结构紧凑、功率密度高,在工程机械与航空航天领域应用广泛,然而其运动学与流体细节深度耦合,给仿真带来不小挑战。AMESim平台中的HCD库提供了一种从物理结构出发的建模思路,将柱塞泵分解为容积腔、节流口与机械约束等基础单元,从而真实刻画柱塞腔压力波动、配流特性和容积效率等关键行为,摆脱黑盒模型的局限。基于机理建模的仿真结果,可用于泵参数优化、故障特征分析以及控制策略验证。进一步结合AMESim与Simulink联合仿真,可以高效开发变量泵排量控制系统,研

weixin_29159441的博客 290

Qt+OpenGL+Cesium三件套:打造高性能3D GIS界面的5个关键技巧

本文深入探讨了如何利用Qt、OpenGL与Cesium三件套打造高性能3D GIS界面的5个核心技巧。内容涵盖多线程渲染架构设计、OpenGL状态管理与批处理优化、内存与显存高效管理、Qt UI与3D场景深度集成,以及跨平台部署与性能调优实战,旨在帮助开发者解决海量3D Tiles数据渲染的性能瓶颈,实现流畅的交互体验。

t8u9v0的博客 551

C# 结构

在C#中,结构(Structure)是一种用户定义的值类型(Value Type)。它类似于类(Class),但有一些重要的区别。结构在C#中用struct关键字定义,并且通常用于表示简单的数据结构,如坐标、日期、时间等。与类不同,结构是值类型,而不是引用类型。这意味着结构的实例在被赋值或传递给其他变量时会被复制,而不是传递引用。结构的特点包括:值类型:结构是值类型,它存储在栈上,并直接包含其数据。当结构被赋值给另一个变量或作为参数传递时,将进行值的复制。

江江的博客 2288

高速设计注意事项总结——MDI篇

在以太网高速通信系统中,MDI(Medium Dependent Interface,介质相关接口)是连接物理层芯片(PHY)与传输介质(如网线)的关键接口,其设计直接影响信号完整性、传输速率和抗干扰能力。本文围绕 MDI 及 RJ45 接口电路、关键参数、设计与布线要点展开,为高速以太网设计提供参考。本文包含MDI 及 RJ45 接口电路组成、电路设计注意事项、布局布线要求等内容

qq_16237389的博客 1454

C#结构(Struct)

在C#中,结构体(struct)确实不支持类(class)所拥有的继承特性,但正如前面提到的,结构体可以实现接口(interface)。性能:由于结构体是值类型,并且通常比类具有更小的内存占用,因此在处理大量数据时,结构体可能具有更好的性能。在C#中,结构体可以嵌套在其他结构体内部。在C#中,结构体(Struct)是一种轻量级的值类型数据结构,它允许程序员将多个相关的变量组合成一个单一的类型。结构体和类在C#中都扮演着重要的角色,但它们在类型、内存管理、继承、默认构造函数、性能和用途等方面存在显著的差异。

humorous01的博客 2941

寒武纪AI芯片业务解析:从云端到边缘,如何布局智能计算未来?

本文深入解析了寒武纪在AI芯片领域的业务布局,重点探讨了其从云端到边缘的智能计算战略。文章分析了寒武纪云端“思元”系列芯片如何作为数据中心的高性能计算基石,以及思元220等边缘芯片如何满足碎片化场景的低功耗实时处理需求。同时,也阐述了其IP授权业务模式与技术生态构建,揭示了寒武纪在激烈市场竞争中,通过软硬件全栈方案布局智能计算未来的核心路径。

weixin_29271053的博客 405

RSA算法详解:万字文章详解RSA的加密与解密

为了彻彻底底的研究明白RSA算法,真的是。。煞(lei)费(si)苦(wo)心(le),首先我希望自己前前后后、彻彻底底的琢磨明白,其次我也希望我把他分享出来以后,大家都能读得懂,这篇文章真的是我迄今为止写的又臭又长的一篇文章了,但是我能保证的是,你读完了以后,绝对不会再问RSA是啥玩意儿了。。

布啦啦 7669

C# ④ 结构类型struct的使用

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _10_25_struct { class Program { struct IS //定义一个结构类型 { public string w; public .

人间十年 679

【全局路径规划模块全覆盖算法】(三)代码实现:Boustrophedon Cellular Decomposition Path Planning用珊格地图生成每个cell的覆盖路径

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Boustrophedon Cellular Decomposition Path Planning用珊格地图生成每个cell的覆盖路径做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1834

C# 结构体的定义和基本使用

平常使用中,我们经常需要定义多个变量,变量的类型也可能不同,这就需要我们定义很多的变量,比较繁琐。 比如需要定义场景中两个游戏物体的位置: //物体一 float GameObjectx=1; float GameObjecty=2; float GameObjectz=3; //物体二 float GameObject1x = 1; float G...

点点滴滴,记录成长!~~~~~~ 3273

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# 结构使用

上位机(C#)需要和单片机通过串口传输数据,本人也是踩了几个坑之后才将该功能实现,时间比较匆忙,写的潦草,有不清楚的可以追问。 单片机上已经定义好了接口和数据格式(结构) 上位机上处理方法: 1、串口接收到byte数组,从数组中按下标获取 如果数据结构单一这个方法未尝不可,如果数据结构较多,结构体较大 那么需要认真的计算下标,否则很容易出现问题,且不易维护。 例如: private...

yi_tianchou的博客 1870

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C#基础】unity中结构体的使用

结构体(Struct)是值类型数据结构,在栈上分配内存,可以包含字段,属性,方法,构造函数。结构体可以实现接口,但是不能继承

发布unity,三维模型的相关内容 2617

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c# 结构的使用

   类的定义的是引用类型,重点在堆上创建,有的时候类只包含极少的数据,因为管理堆而造成的开销是很大的。这时候更好的做法就是将类型定义成结构。结构是值类型,在栈上存储,能有效的减小内存管理的开销。c#基元类型在Microsoft.NET Framework中对应的类型,string和object类型是类而不是结构。 一、声明结构   声明结构要以struct关键字开头,后面跟上类型名...

weixin_30376083的博客 127

C# 结构体的创建和使用

结构体的创建和使用

害怕也得前进 6283

C#理论 —— C# 程序结构与Visual Studio 的使用

文章目录

- 3953

C#调用C++接口时,如何使用结构体参数

C#调用C++接口时,如何使用结构体参数

wangnaisheng的专栏 1884

C# 中使用结构体

今天做一个东西需要用到C#的结构体 本来以为可以像VC++里面一样这样写: 1publicstructcontent 2{ 3stringtitle; 4stringauthor; 5stringcontentcontent; 6stringu...

weixin_38168786的博客 219

C#中结构的使用

1 //声明结构 结构与枚举区别,一个不用声明类型,一个要声明类型 2 public struct Person 3 { 4 //这里叫字段,做用也是存储内容,变量只可以存一个值,字段可以存多个值 5 //声明字段前最好前面加下划线 _name...

weixin_30760895的博客 137

C# 结构体使用

文章目录前言一、结构体初始化总结 前言 结构体可以在在初始化的设置初值 一、结构体初始化 public struct TTrapPrm { public double acc; public double dec; public double velStart; public short smoothTime; } Gxn.TTrapPrm trap=new Gxn.TTrapPrm() .

qi_1213的博客 669

C#编程-使用结构

例如,如果您要在一个变量中维护账单的详细信息,比如bill_No、ord_Dt、custName、product、cost和due_Amt,则可以声明一个结构。结构是值类型的数据类型。当您希望由一个变量来保持各种数据的相关数据时,您可以创建一个结构。创建结构要使用struct关键字。与类一样,结构包含结构声明中定义的数据成员。以下哪个选项对结构而言是正确得到?(选择所有使用的项)答案:c.结构存储在堆中 d.结构不能有默认构造函数。下图显示了上述代码的输出。d.结构不能有默认构造函数。

RZer的博客 257

C#结构体指针的定义及使用详解

在解析C#结构体指针前,必须知道C#结构体是如何定义的。在c#中同样定义该结构体。 C#结构体指针之C#结构体的定义: [StructLayout(LayoutKind.Sequential)] public struct VGAStat { public int ChannelNum;//通道数量 [MarshalAs(Unmanag...

weixin_33913332的博客 2373
上一篇: c#结构与类的区别
下一篇: 建立shape文件(c#+AE)
群龙
博客等级 码龄18年 22粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值