结构

结构

值类型中除了枚举类型都是结构类型的派生类型

由于结构是值类型,并且直接存储数据,因此,在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。

public struct Address
{public string Name;public string Phone;
}Address address;
address.Name = “中国”;
address.Phone = “12345678”;

结构是值类型,直接包含它自己的数据,每个结构都保存自己的一份数据,修改每一个结构的数据都不会对其他结构的数据造成影响,结构不是引用类型,因此结构类型的变量不能被赋予null值。

把一个结构赋值给另一个结构时,会把数据从一个结构复制到另一个结构,因此,当结构比较大的时候,这种数据复制机制会带来较大的性能开销。

无论结构使用预定义的、无参数的构造函数,还是使用用户定义的、有参数的构造函数进行初始化,都会初始化结构的数据成员。其中前者将数值型初始化为默认值,引用类型初始化为null,后者将使用用户自定义的初始化策略对种成员进行初始化。因此,结构类型不允许在声明时显式初始化数据成员。

构造函数

结构类型可以有实例构造函数和静态构造函数,但不能有析构函数(析构函数主要针对非托管代码中引用的释放)。

实例构造函数

结构类型都有一个预定义的、没有参数的构造函数,此构造函数不允许删除和重定义,并且这个无参数的构造函数将会一直存在,并不会因为定义了其他带参数的构造函数就消失,与类不同。
要调用结构实例构造函数,必须使用new运算符。如果不使用new运算符,那么结构的数据成员就是未分配状态,在分配之前是不能访问的。
带参数构造函数必须初始化结构的所有数据成员,并保证数据成员确实被初始化(做参数检测,确保成员被初始化,否则,未正确初始化将会导致编译错误)

静态构造函数

结构的静态构造函数具有如下特点:

  • 不能有访问修饰符和参数
  • 不能访问实例成员
  • 无法直接进行调用

结构和类的静态构造函数的触发规则不同,类的静态构造函数是在创建第一个实例或引用任何静态成员之前自动调用的,而结构的静态构造函数在下述任意一种情况之前才会被自动调用:

  • 使用显式声明的构造函数进行初始化
  • 调用结构的方法或访问结构的静态数据成员(无论读取还是赋值,访问实例数据成员不会触发CLR自动调用静态构造函数)

多态和可继承性

结构直接派生自System.ValueType,间接派生自System.Object,但结构是隐式密封的,不能作为基类再派生出其他的结构,也不能从类派生,但可以从接口派生。
关于结构的继承性,有如下特点:

  • 结构类型总是隐式密封,因此在定义结构时不能使用sealed和abstract关键字
  • 因为结构不能作为基类,结构的成员不能使用如下访问修饰符:protected和protected internal
  • 结构的函数成员不能声明为abstract和virtual,但是可以使用override关键字,用以覆写它的基类System.ValueType中的方法

装箱与拆箱

和类的类型转换最大的不同是,装箱和拆箱操作执行的是将结构复制到或复制出装箱的实例对象。即装箱前的数据和拆箱后的数据是两份不同的数据,没有直接关联,修改其中一个不会影响另一个。

结构和类的适用场合

  • 当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些
  • 对于点、矩形和颜色这样的轻量对象,使用结构的成本较低
  • 在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承
  • 大多数情况下,目标类型只是含有一些数据,或者以数据为主,例如字典中的“key-value”数据对,这时使用结构是最佳选择

引用

[1]: C# 权威指南

转载于:https://www.cnblogs.com/home-wang/p/10949710.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10 字符串相关操作

# ### 字符串的相关操作 #(1)字符串的拼接 str1 "我爱你" str2 "美丽的祖国" res str1 str2 print(res) str1 str2 # str1 str1 str2 print(str1)# (2)字符串的重复 * str1 "重要的事情说三遍" res str1 * 3 print(res)# (3)字符串跨…

hbase-1.3.2安装

上传安装包hbase-1.3.2-bin.tar.gz解压安装包tar -zxvf /root/hbase-1.3.2-bin.tar.gz -C /usr/local/ 修改配置文件修改hbase-env.shvi hbase-env.sh 修改为以下内容: export JAVA_HOME/usr/local/jdk1.8.0_102 export HBASE_MANAGES_ZKfalse 表示不引用 hbase 自带…

深拷贝的三种方式

JSON方法 var obj2 JSON.parse(JSON.stringify(obj1))//深拷贝递归(自己调用自己)方法 判断第一层属性的类型,多层拷贝对象的属性 var obj1 { name: zs, age: 18, dog: { name: 金毛, age: 2 }, friends: [ww, lil] } var obj2 {}; functio…

AppiumForWin安装

尝试安装Windows版本的Appium参考:http://www.cnblogs.com/fnng/p/4540731.html第一步:安装nodehttps://nodejs.org/en/安装成功后使用:node -v,进行验证第二步:安装Appium下面的方法失败:原因下载不成功&a…

剑指offer-二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。1 class Solution {2 public:3 int NumberOf1(int n) {4 int count 0;5 while(n)6 {7 count ;8 n (n - 1) & n;9 …

activiti5第一弹-----基本的activiti示例

建立一个普通的javaSE工程,工程的目录结构如下:需要的jar包如下: 在config文件夹下创建log4j.properties用来输入日志,内容如下: log4j.rootLoggerINFO, CA # ConsoleAppender log4j.appender.CAorg.apache.log4j.Cons…

activiti5第二弹----使用activiti5提供的测试类进行测试

在前文的基础上改变测试方式 package activiti_001;import org.activiti.engine.impl.test.PluggableActivitiTestCase; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.test.Deployment; import org…

Android在布局XML中的空格转义符(占位符)

普通的英文半角空格   no-break space (普通的英文半角空格但不换行) 中文全角空格 (一个中文宽度)   en空格 (半个中文宽度)   em空格 (一个中文宽…

activiti5第三弹-----------脚本任务

首先是流程定义图: 重点关注一下流程节点中 Script Task 节点的 properties中的Main config 这里可以选择不同的脚本语言,由于其他的部怎么会就用javascript来吧。 从图中可以看出只是定义了一个变量x,它的值为 a; 很多人都说这样定义了这个…

Jmeter之性能测试类型

Jmeter之性能测试类型 pipe-clean test在测试环境预先跑确定脚本准确性单用户跑获取baseline容量测试经典的性能测试类型获取系统稳定运行时最大的吞吐量/并发数/响应时间时尽量模拟真实情况,比如加入用户思考时间等压力测试把系统弄挂除非系统无响应,响…

activiti5第四弹----serviceTask中的java服务任务

activiti.cfg.xml内容&#xff1a; <?xml version"1.0"?> <beans default-lazy-init"false"xsi:schemaLocation" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://ww…

1 ~ express ~ 初始化。安装第三方模块express。中间件

一&#xff0c;初始化 二&#xff0c;安装第三方模块express 三&#xff0c;安装中间件 1&#xff0c;bodyParser : 解析 post 请求数据 2&#xff0c;cookies : 读写 cookie 3&#xff0c;swig &#xff1a;模板解析引擎 4&#xff0c;mongoose &#xff1a; 操作 mongodb 数据…

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask

web service task是BPMN2.0中的一种任务类型&#xff0c;在activiti5中它并没有专门的标签表示&#xff0c;而是使用了service task 来表示。而且有很多要配置的内容是无法用图形化工具来完成的。要使用web service task&#xff0c;当然要先有web service。所以首先要编写一个…

bloc

示例分为两个文件 main.dart import package:flutter/material.dart;import bloc.dart;void main()>runApp(MyApp());class MyApp extends StatelessWidget { override Widget build(BuildContext context) { return MaterialApp( home: HomePage(), ); }}cla…

activiti5第六弹 手动任务、接收任务、邮件任务

手动任务和接收任务几乎不在程序中做什么事情---只是在流程的历史中留下一点痕迹&#xff0c;表明流程是走过某些节点的。。。而且这两个任务是无法用taskservice查询到的 但是接收任务比手动任务多一个功能&#xff0c;就是确认功能。。。 activiti.cfg.xml配置 <?xml v…

手把手教你用原始方式上传项目至GitHub

小编GitHub&#xff1a;https://github.com/ds1889 首先你得注册一个自己的GitHub账号&#xff0c;注册网址&#xff1a;https://github.com/join 有了自己的账号以后&#xff0c;就可以进行登录&#xff0c;开始创建一个新的项目 创建一个新的项目&#xff0c;填写项目名称&am…

office如何快速删除重复数据

1、首先打开如下文档&#xff0c;在A列删除重复日期星期一&#xff0c;星期二&#xff1b; 2、选中编号栏&#xff0c;&#xff21;1-&#xff21;10&#xff0c;如下图: 3、点击数据——删除重复项&#xff1b;如下图红色剪头所指: 4、删除后&#xff0c;重复项就被删除成功。…

亲依止缘

前前诸善法对后后诸善法以亲依止缘为缘。前前诸善法对后后诸不善法有时以亲依止缘为缘。前前诸善法对后后诸无记法以亲依止缘为缘。 前前诸不善法对后后诸不善法以亲依止缘为缘。前前诸不善法对后后诸善法有时以亲依止缘为缘。前前诸不善法对后后诸无记法以亲依止缘为缘。 前前…

Activiti5第七弹,自己实现一个ProcessEngineConfiguration同时自定义拦截器

首先是我自己定义的MyProcessEngineConfiguration的activiti.cfg.xml文件的内容 <?xml version"1.0"?> <beans default-lazy-init"false"xsi:schemaLocation" http://www.springframework.org/schema/util http://www.springframework.org…

SQL中and和or的区别是?

今天有这样得一个需求&#xff0c;如果登陆人是客服的话&#xff0c;会查询订单是’该客服’以及还没有匹配客服的&#xff0c;刚开始想的是直接在sql语句上拼写 or assigned_id is null 的&#xff0c;测试了一下发现这样的话&#xff0c;前面的其他条件都没有用了 这样的话…