关于C#结构体 你需要知道的

结构体概念

  在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 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低

  在表现抽象和多级别的对象层次时,类是最好的选择

  大多数情况下该类型只是一些数据时,结构时最佳的选择体的使用

以上就是关于C#结构体 你需要知道的的详细内容,更多关于c#结构体的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#中结构体和字节数组转换实现

    最近在使用结构体与字节数组转化来实现socket间数据传输.现在开始整理一下.对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace FileSendClient { [StructL

  • c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)

    枚举.结构枚举的类型有限(short.byte...)且是相同的,在MSDN上找到枚举的一些示例,觉得这个还不错: 复制代码 代码如下: enum myWeekDay { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };int i = 3;myWeekDay today = (myWeekDay)i; 枚举是需要先声明的,然后再通过新建一个变量(today)为枚举类型来使用.枚举默认的基本类型值从0开始,递

  • C#结构体特性实例分析

    本文实例讲述了C#结构体特性.分享给大家供大家参考.具体如下: 结构体的定义: 结构体也可以象类一样可以单独定义. class a{}; struct a{}; 结构体也可以在名字前面加入控制访问符. public struct student{}; internal struct student{}; 如果结构体student没有publice或者internal的声明 类program就无法使用student结构定义 obj对象 如果结构体student的元素没有public的声明,对象ob

  • C#枚举类型和结构体详解

    注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; } 以上的语句就是定义一个名称为student的结构体,其中包含int类型的年龄.分数.总和,和string类型的姓名.性别. 二.用法: 在

  • C#中结构体定义并转换字节数组详解

    最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要. 首先是结构体定义,一些基本的数据类型,C#与C++都是可以匹配的: [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct Head { public

  • C#调用C++DLL传递结构体数组的终极解决方案

    C#调用C++DLL传递结构体数组的终极解决方案 在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型可以对应.这时怎么办,第一反应是C#也定义结构体,然后当成参数传弟.然而,当我们定义完一个结构体后想传递参数进去时,会抛异常,或者是传入了结构体,但是返回值却不是我们想要的,经过调试跟踪后发现,那些值压根没有改变过,代码如下. [DllImport(

  • C#语言基础——结构体和枚举类型全面解析

    一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承. 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等.这可以节省内存,因为没有如类对象所需的那样有额外的引用产生.例如,当声明含有成千上万个对象的数组时,这会引起极大的差异. 结构体是一个变量组,将一组变量放在一起,其实就是一个自定义

  • C#中使用反射获取结构体实例及思路

    复制代码 代码如下: static void Main(string[] args){    Type type = typeof(MyObject);    object obj = type.GetConstructor(Type.EmptyTypes).Invoke(null);    Console.WriteLine(obj);} class MyObject{ } 之前我一直没有发现原来结构是不可以这样实例化的 换种方式,似乎结构体使用反射无法得到其构造函数ConstructorIn

  • 关于C#结构体 你需要知道的

    结构体概念 在C#中,结构体是值类型,一般适用于表示类似Point.Rectangle.Color的对象 值类型能够降低对堆的管理.使用.降低垃圾回收,表现出更好的性能.可是值类型也有不好的一面.会涉及到装箱拆箱等操作 结构体声明 结构体声明定义了一种新的数据类型,这个数据类型可以为程序包含一个以上的成员变量 要定义一个结构,需要使用struct语句 声明一个学校的结构 struct School { public int name; public string head_master; pub

  • PHP小白必须要知道的php基础知识(超实用)

    很多人看到PHP就以为是程序员,就以为钱很多(虽然是事实),但是也要考虑下自己是不是适合这一行,知道PHP是什么吗?PHP都有什么样的功能,都能用来干嘛? PHP是什么? •PHP(PHP: Hypertext Preprocessor,超文本预处理器的缩写),是一 种被广泛应用的开放源代码的.基于服务器端的用于产生动态网页 的.可嵌入HTML中的脚本程序语言,尤其适合 WEB 开发. •当客户端向服务器的程序提出请求时,web服务器根据请求晌应对应 的页面,当页面中含有php脚本时,服务器会交

  • 详解C语言的结构体中成员变量偏移问题

    c语言中关于结构体的位置偏移原则简单,但经常忘记,做点笔记以是个记忆的好办法 原则有三个: a.结构体中的所有成员其首地址偏移量必须为器数据类型长度的整数被,其中第一个成员的首地址偏移量为0, 例如,若第二个成员类型为int,则其首地址偏移量必须为4的倍数,否则就要"首部填充":以此类推 b.结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行"末尾填充": c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须

  • 初步剖析C语言编程中的结构体

    C语言结构体,可谓是C强大功能之一,也是C++语言之所以能衍生的有利条件,事实上,当结构体中成员中有函数指针了后,那么,结构体也即C++中的类了. C语言中,结构体的声明.定义是用到关键字struct,就像联合体用到关键字union.枚举类型用到enum关键字一样,事实上,联合体.枚举类型的用法几乎是参照结构体来的.结构体的声明格式如下: struct tag-name{ { member 1; - member N; }; 因此,定义结构体变量的语句为:struct tag-name vari

  • C语言中结构体偏移及结构体成员变量访问方式的问题讨论

    c语言结构体偏移 示例1 我们先来定义一下需求: 已知结构体类型定义如下: struct node_t{ char a; int b; int c; }; 且结构体1Byte对齐 #pragma pack(1) 求: 结构体struct node_t中成员变量c的偏移. 注:这里的偏移量指的是相对于结构体起始位置的偏移量. 看到这个问题的时候,我相信不同的人脑中浮现的解决方法可能会有所差异,下面我们分析以下几种可能的解法: 方法1 如果你对c语言的库函数比较熟悉的话,那么你第一个想到的肯定是of

  • C# 中 System.Index 结构体和 Hat 运算符(^)的使用示例

    翻译自 John Demetriou 2019年2月17日 的文章 <C# 8 – Introducing Index Struct And A Brand New Usage For The Hat Operator> 今天我们要讲的是 Hat 运算符(^).目前为止,Hat 运算符(^)已经被用作布尔类型的异或运算符,以及字节.整型类型的按位异或运算符.在 C# 8 中,它有一个新的用法. 这个运算符的新用法是自动创建 Index 结构体的实例.那什么是 Index 结构呢?这在 C# 8

  • 7个你应该知道的JS原生错误类型

    概述 从浏览器控制台到运行 Node.js的终端,我们到处都会看到错误.本文的重点是概述我们在js开发过程中可能遇到的错误类型. 提示:良好的错误提示会导致快速而无痛的发展经历与缓慢而痛苦的发展经历之间的区别.在编写可重用的代码时,请确保自己在编写清晰易懂的错误处理代码. 1. RangeError 当数字超出允许的值范围时,将会抛出此错误. 例如 const l = console.logconst arr = [90,88] arr.length=90**99 我们有一个数组,带有两个元素的

  • 一定要知道的 25 个 Vue 技巧

    目录 1. 将 prop 限制为类型列表 2. 默认内容和扩展点 3. 使用引号观察嵌套值 4. 知道何时使用 v-if(以及何时避免使用) 5. 单作用域 slot 的简写(不需要模板标签!) 6. 有条件地渲染slot 6.1 为什么我们希望能够有条件地渲染slot呢? 7. 如何观察slot的变化 8. 将本地和全局风格混合在一起 9. 覆盖子组件的样式--正确的方法 10. 用上下文感知组件创造魔法 10.1 状态共享 10.2 配置 10.3 造型 11. 如何使在 Vue 之外创建的

  • 经验丰富程序员才知道的15种高级Python小技巧(收藏)

    目录 1.通过多个键值将对象进行排序 2.数据类别 3.列表推导 4.检查对象的内存使用情况 5.查找最频繁出现的值 6.属性包 7.合并字典(Python3.5+) 8.返回多个值 9.列表元素的过滤 filter()的使用 10.修改列表 11.利用zip()来组合列表 12.颠倒列表 13.检查列表中元素的存在情况 14.展平嵌套列表 15.检查唯一性 1.通过多个键值将对象进行排序 假设要对以下字典列表进行排序: people = [ { 'name': 'John', "age&quo

  • C语言超详细讲解结构体与联合体的使用

    目录 结构体 offsetof-宏 位段 枚举 联合体(共用体) 结构体 结构体内存对齐问题: 当我们在计算结构体的大小时,我们便需要清楚的知道结构体内存对齐是什么. 存在内存对齐的原因可细分为两个: 平台原因: 不是所有的硬件平台都能方位任意地址上的任意数据:某些硬件平台只能在某些地址处取某些特定类型的数据,否则会抛出硬件异常. 性能原因: 首先内存对齐可以提高程序的性能,当访问未对其的内存空间时,有时候处理器需要进行两次访问,而当访问对齐的内存时,只需要一次就够了.这同时也被叫做 用空间换取

随机推荐