结构是用户定义的数据类型,与类非常相似,它们有数据成员和函数成员,但与类最重要的区别是:类是引用类型,而结构是值类似,结构是隐式密封的,这意味这它们不能被派生,所以结构类型不能为null,两个结构变量不能引用同一个对象, 在结构中,字段初始化语句是不被允许的.

struct StructureName{
MemberDeclarations
}
namespace LearningCSharp
{
struct Point
{
public int x;
public int y;
}
class Program
{
static void Main()
{
Point first, second, third; first.x = 10;first.y = 10;
second.x = 20;second.y = 20;
third.x = first.x + second.x;
third.y = first.y + second.y; Console.WriteLine($"first:{first.x},{first.y}");
Console.WriteLine($"second:{second.x},{second.y}");
Console.WriteLine($"third:{third.x},{third.y}"); }
}
}

对结构赋值

把一个结构赋值给另一个结构,就将一个结构的值复制给了另一个结构.这和复制类变量不同,复制类变量时,只复制引用.

namespace LearningCSharp
{
class CSimple
{
public int x;
public int y;
}
struct Simple
{
public int x;public int y;
}
class Program
{
static void Main()
{
CSimple cs1 = new CSimple(), cs2 = null;// 类实例
Simple ss1 = new Simple(), ss2 = new Simple(); //结构实例 cs1.x = ss1.x = 5;
cs1.y = ss1.y = 10; cs2 = cs1;
ss2 = ss1; cs2.x = 100;
ss2.x = 200; Console.WriteLine($"cs1.x is {cs1.x}");
Console.WriteLine($"cs2.x is {cs2.x}");
Console.WriteLine($"ss1.x is {ss1.x}");
Console.WriteLine($"ss2.x is {ss2.x}"); }
}
}

构造函数

结构可以有实例构造和静态构造函数,但不能有析构函数.

实例构造函数

语言隐式地为每个结构提供一个无参数的构造函数.这个构造函数把结构的每个成员设置为该类型的默认值.值成员设置成它们的默认值,值成员设置为它们的默认值,引用成员设置为null.

namespace LearningCSharp
{
class CSimple
{
public int x;
public int y;
}
struct Simple
{
public int x;public int y;
public CSimple z;
}
class Program
{
static void Main()
{
CSimple cs1 = new CSimple(), cs2 = null;// 类实例
Simple ss1 = new Simple(), ss2 = new Simple(); //结构实例 cs1.x = ss1.x = 5;
cs1.y = ss1.y = 10;
ss1.z = cs1; ss2 = ss1;
ss2.z.x = 200; Console.WriteLine($"ss1.z.x is {ss1.z.x}");
Console.WriteLine($"ss2.z.x is {ss2.z.x}");
}
}
}

预定义的无参数构造函数对每个结构都存在,而且不能删除或重定义,但是,可以创建另外的构造函数,只要它们有参数.这一点和类非常不同,对于类,编译器只在没有其他构造函数声明时提供隐式的无参数构造函数.

调用一个构造函数,包括隐式无参数构造函数,要使用new运算符,这表明,即使不从堆中分配内存也要使用new运算符.

namespace LearningCSharp
{ struct Simple
{
public int x;public int y; public Simple(int a,int b)
{
x = a;
y = b;
Console.WriteLine("This is constructor");
}
}
class Program
{
static void Main()
{
Simple s1 = new Simple();
Simple s2 = new Simple(5, 10); Console.WriteLine($"{s1.x},{s1.y}");
Console.WriteLine($"{s2.x},{s2.y}"); }
}
}

也可以不使用new运算符创建结构的实例(对于类来说,必须通过new运算符来创建类实例), 然而,如果这样做,必须满足:

  • 在显示设置数据成员之后,才能使用它们的值;
  • 在对所有的数据成员赋值之后,才能调用任何函数成员

静态构造函数

与类类似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员.

以下两种行为,任意一种发生之前,将会调用静态构造函数:(1)调用显式声明的构造函数(2)引用结构的静态成员.

结构是密封的

结构总是隐式密封的,因此,不能从它们派生其他结构,由于结构不支持继承,因此不能在结构成员声明时使用protected,internal,abstract,virtual.

结构作为返回值和参数

  • 返回值:当结构作为返回值时,将创建它的副本,并从函数成员返回
  • 值参数:当结构被用作值参数时,将创建实参结构的副本.该副本用于方法的执行中.
  • ref和out参数:如果把一个结构用作ref,out参数,传入方法的是该结构的一个引用,这样就可以修改其数据成员.

C#之结构的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(1):结构大观

    CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...

  2. 读书笔记:《HTML5开发手册》--HTML5新的结构元素

    读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...

  3. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  4. HTML5 语义元素(一)页面结构

    本篇主要介绍HTML5增加的语义元素中关于页面结构方面的,包含: <article>.<aside>.<figure>.<figcaption>.< ...

  5. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  6. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  7. ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构

    和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...

  8. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  9. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  10. Javacript实现字典结构

    字典是一种用[键,值]形式存储元素的数据结构.也称作映射,ECMAScript6中,原生用Map实现了字典结构. 下面代码是尝试用JS的Object对象来模拟实现一个字典结构. <script& ...

随机推荐

  1. 关于JS中继承

    继承,我理解就是把所有实例可能用到的属性和方法抽出来,单独放在一个"超类"中,一方面避免重复写代码,另一方面也会节省内存.如果单独用原型继承,引用值的处理是个问题 如果单独用cal ...

  2. 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!

    效果 来具体介绍之前先来看看效果. 使用C#构建了一个简单的MCP客户端,以下为运行这个简单客户端的截图,同样可以在Cline等其它的一些MCP客户端中玩耍. 创建一个数据库表: 获取数据库中的所有表 ...

  3. 资料推荐-一个神奇的网站educative.io

    前言 算法和数据结构一直是笔者心中的痛,笔者曾经阅读过两个材料,但都收效不好,尝试总结下这两个材料: 极客时间的数据结构和算法的课程 优点:适合用于去理解数据结构和算法的基本概念 缺点:不包含题目(这 ...

  4. 内部类--成员内部类、静态内部类、局部内部类--java进阶day03

    1.内部类 内部类分为4种,成员内部类用处不大,静态内部类和局部内部类更是鸡肋,唯有匿名内部类是需要我们重点掌握的 1.成员内部类 Inter类要访问Outer类的成员可以直接访问,而Outer要访问 ...

  5. CoreOS 手动升级篇

    说到升级...通常肯定会以下2个步骤: 检查是否有新版本. 下载和安装新版本. 在 CoreOS 中也一样,我们先来看下在 CoreOS 中对应的命令: # 检查是否有新版本 update_engin ...

  6. C#/.NET/.NET Core技术前沿周刊 | 第 32 期(2025年3.24-3.31)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  7. “你觉得客户需要”是杀死TA的最后一根稻草 | IPD集成产品开发

    这个米老鼠洗衣机,大家眼熟吗? 相信最近热衷于在网上冲浪的朋友们,对这款形似米老鼠的"懒人洗衣机"并不陌生,甚至算是小小地参与了一下这个产品研发项目.在海尔的周云杰总裁爆火出圈后, ...

  8. 一个Bug让人类科技倒退几十年?

    大家好,我是良许. 前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的. 所以,今天就跟大家科普一下这个人类历史上最大的 Bug . 1. 全世 ...

  9. AI工具推荐:使用AnythingLLM帮助你学习

    AnythingLLM介绍 AnythingLLM 是一个最容易使用的全能 AI 应用,可以进行 RAG.AI 代理等多种功能,无需编写代码或担心基础设施问题. GitHub地址:https://gi ...

  10. 『Plotly实战指南』--直方图绘制与应用

    在数据科学的世界里,直方图是一种不可或缺的可视化工具,它以其简洁而直观的方式,揭示了数据的内在规律,为数据分析和决策提供了有力支持. 它能够帮助我们快速识别异常值,并为统计推断提供有力支撑. 无论是对 ...