关于C#结构体 你需要知道的
作者:Tynam Yang 发布时间:2022-01-04 13:11:49
结构体概念
在C#中,结构体是值类型,一般适用于表示类似Point、Rectangle、Color的对象
值类型能够降低对堆的管理、使用。降低垃圾回收,表现出更好的性能。可是值类型也有不好的一面。会涉及到装箱拆箱等操作
结构体声明
结构体声明定义了一种新的数据类型,这个数据类型可以为程序包含一个以上的成员变量
要定义一个结构,需要使用struct语句
声明一个学校的结构
struct School
{
public int name;
public string head_master;
public int class_number;
public int student_number;
};
结构体的使用
using System;
struct School
{
public int school_id;
public string head_master;
public int class_number;
public int student_number;
};
public class testStructure
{
public static void Main(string[] args)
{
School TianYangHighSchool; // 声明一个学校
// 学校详细
TianYangHighSchool.school_id = 12345;
TianYangHighSchool.head_master = "Tynam.Yang";
TianYangHighSchool.class_number = 6;
TianYangHighSchool.student_number = 456;
// 打印学校信息
Console.WriteLine("田阳高中学校的学校id是:{0}," +
"校长名字是:{1}," +
"一共有{2}个教室," +
"总共有{3}名学校",
TianYangHighSchool.school_id,
TianYangHighSchool.head_master,
TianYangHighSchool.class_number,
TianYangHighSchool.student_number);
Console.ReadKey();
}
}
运行结果
结构体特点
结构体可以有方法,字段,索引器,属性,操作符方法和事件
结构体可以有定义的构造函数,但不能是析构函数。但是不能为结构定义默认构造函数。默认构造函数是自动定义的,不能被更改
与类不同,结构体不能继承其他结构体或类
结构体不能用作其他结构或类的基础
结构体可以实现一个或多个接口
结构成员不能被指定为抽象,虚拟或受保护
当使用New运算符创建一个struct对象时,它将调用相应的构造函数。 与类不同,可以在不使用New运算符的情况下实例化结构体
如果不使用New运算符,则字段保持未分配,并且在所有字段初始化之前不能使用对象
结构体 VS 类
结构体是值类型,存储在栈上,类是引用类型,存储在托管堆上,结构体在声明的时候就已经为其分配栈上的内存了,而类需要用 new为其分配堆上面的内存
结构体是隐式密封的,不能用 sealed 和 abstract 修饰,结构体不能被继承,类可以被继承
结构体中的实例字段只能声明,不能赋值,而类没有限制,结构体只声明没有用 new 进行初始化时,可以给他的实例字段赋值,而类不行
结构体没有析构函数,结构体中的方法不能用 virtual 和 abstract 修饰,但是可以用 override 修饰,用来重写父类的方法
结构体不能显示给出默认构造函数(无参数的构造),无论有没有自定义构造,默认构造都隐式存在,而类中有自定义构造函数时,默认构造会被隐藏,要想调用默认构造,必须显示给出默认构造
结构体的自定义构造函数必须初始化所有的实例字段和没有初始化的非静态属性,类没有限制
结构与类的选择
堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低
在表现抽象和多级别的对象层次时,类是最好的选择
大多数情况下该类型只是一些数据时,结构时最佳的选择体的使用
来源:https://www.cnblogs.com/tynam/p/9630591.html


猜你喜欢
- 前言很多人觉得Xamarin的开源少,没法用来开发项目。但,实际上Xamarin已经有很多开源代码了;只要不是特别特殊的项目,基本上是都可以
- 让我们来看看这段代码: import java.util.BitSet;import java.util.concurrent.C
- 本文实例为大家分享了Spring boot实现文件上传的具体代码,供大家参考,具体内容如下1. 创建一个Maven的web工程,然后配置po
- 人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中?这里浅谈Java中的栈和堆首先,将结论写在前
- 前言自己android开发也有些年头了,每每回想起作为初学者的时候自己写的代码,自己会有种喷自己的冲动,代码写的太渣了。因此想着自己要总结下
- 一、项目简述本系统功能包括: 一款基于Springboot+Vue的电商项目,前后端分离项目,前台后台都有,前台商品展示购买,购物车分类,订
- 项目概况:Spring Cloud搭的微服务,使用了eureka,FeignClient,现在遇到FeignClient调用接口时不支持上传
- ThreadLocal简介ThreadLocal 是 Java 中的一个线程本地存储机制,它允许每个线程拥有一个独立的本地存储空间
- 本文实例讲述了C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法,在项目开发中有一定的实用价值,具体方法如下:一、前言
- ThreadGroup的作用及方法ThreadGroup线程组,java对这个类的描述呢就是“线程组表示一组线程。此外,线程组还可以包括其他
- 从一个Stream中过滤null值复习一个Stream 包含 null 数据的例子.Java8Examples.javapackage co
- 前言本文主要给大家介绍了Android中图片DrawableCompat利用setTint()对图片Drawable进行变色的相关内容,分享
- HttpServletRequest介绍HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HT
- 本文实例讲述了C#遍历操作系统下所有驱动器的方法。分享给大家供大家参考。具体分析如下:这里先通过DriveInfo类的GetDrivers方
- 前言前一段时间做了一个项目,需要解决中文、繁体、英文的国际化问题,所以本文将详细介绍springboot页面国际化配置的过程方法如下1.引入
- 前言:Java 中 hashCode() 和 equals() 的关系是面试中的常考点,如果没有深入思考过两者设计的初衷,这个问题将很难回答
- java 代码块与静态代码块加载顺序public abstract class ClassLoadingTest {public stati
- android仿照qq的顶部栏效果,主要就是利用fragment manager把fragment设置显示内容(1)在activity_ma
- 使用spring框架实现数据库事务处理事务对于数据库来说是,是对sql语句的一系列操作,这些操作被组织成为一个事务。事务具有原子性的,要么全
- springboot项目部署平时我们在部署springboot打成jar方式部署得时候,大多数都会编写启动脚本,脚本有很多种写法,但大多数意