本节内容是对于C#基础类型的存储方式以及C#基础类型的理论介绍

基础数据类型介绍

例如以下这句话:“张三是一名程序员,今年15岁重50.3kg,他的代号是‘A’,他家的经纬度是(N30,E134)。”,这句话就是一个字符串,使用双引号括起来。而15则表示是一个 整数类型,50.3就是小数类型,不过我们在C# 中通常称为 浮点类型,最后一个经纬度,我们通常定位地点的时候都是成对出现,所以我们认为这二者是一个密不可分的结构,这种类型我们称为 结构体类型(struct)

以上我所说的数据类型都是一个所含有信息量一定的数值,我们称为值类型;而张三这个人,他所含有的数据大小是不固定的,比如我又了解到了张三是一个富二代,那么他就会增加一个属性是富二代,我们需要更多的空间去存储他,张三这个变量我们通常就称为引用类型,而张三这个名字,我们就称为引用,如果你对C或者C++熟悉的话,张三这个名字就是指向张三这个人(对象)的一个指针

CSharp 中两种数据存储方式

C# 中,数据在内存中的存储方式主要分为在堆中存储和栈中存储。我们之前提到的值类型就是存储在栈中,引用类型的数据是存储在堆中,而数据是在栈中。

值类型:存储在栈(Stack,一段连续的内存块)中,存储遵循先进后出,有严格的顺序读取访问速度快,可通过地址推算访问同一个栈的其余变量。

引用类型:引用(本质上和C++中的指针一致)存储在栈中,内含的数据存储在堆中(一大块内存地址,内部变量存储不一定连续存储)。

(此处需要补充堆栈图片)

事实上,值类型和引用类型有一个很明显的区别就是值类型应当都是有值的,而引用类型是可以为空值的。

常见的几种数据类型

  • 字符类型:char字符类型,代表无符号的16位整数,对应的可能值是ASCⅡ码,你可以上网搜索ASCⅡ码的内容

  • 整数类型:常用的一般有:byte,short,int,long。各代表8位、16位、32位、64位整型。占用内存分别为(位数/8)字节。范围则是 +-(位数)个1组成的二进制的十进制数/2。例如byte的范围则是11111111转十进制后除以2取反,即-127~128。范围绝对值之和为256。

  • 浮点类型:float, double, decimal:浮点类型,分别代表32位、64位、128位浮点类型。通常默认类型是double,如果需要指定float类型,需要1.3f,decimal类型则指定1.3m。浮点型存在的问题是精度的损失,并不一定安全。

  • 布尔类型:bool类型是一个二进制中的0和1,各代表了false和true。只存在两个值。

  • 字符串类型:string本质是一种语法糖,作为字符类型的数组引用(指针)存在,也是String类的简写

  • 委托类型:delegate用于绑定函数,为引用类型的一种,将函数参数化为变量。本质上就是C++中的函数指针。

  • 数组:继承自Array类,属于任意类型的一种集合,但不同于集合,大小必须被初始化。在内存中是一段连续的内存空间,但是不是值类型。

C#中定义变量的方式及数据转换的方法

在C#中定义变量的方式和其他的主流语言没有太大的区别,以下是几种定义方式:

int number = 5;//定义一个32位整数类型bool b = true;//定义//注意看以下两条,string定义的字符串必须为双引号,而char使用单引号并且只允许输入一个字符string str = "test";char a = 'a';//记得后缀float f = 1.3f;decimal d = 1.5m;数据类型的转换分为隐式转换和显式转换,看下面几个例子:string a = "15";int b = int.Parse(a);//显式转换b = (int)a;//强制转换b = Convert.ToInt32(a);//显式转换,较常用double d = 1.5;b = d;//隐式转换

数组

数组指一个类型(任意)的集合,例如你定义一个变量为a=5,很轻松,假设你需要100个呢?因此我们使用数组来存储。
数组的定义以及使用如下:

///伪代码,T为类型,n为大小T [] t = new T[n];//定义一个整型数组int [] a = new int [5];//你也可以选择初始化的方式定义int [] b = new int [] {1,2,3,4,5};//或int [] c = new int [5]{1,2,3,4,5};//数组的访问,从0开始索引Console.WriteLine(b[0]);

常见的运算符

  • +-*/:对应数学中的加减乘除。

  • %:求余运算,a%b指a除以b的余数。

  • & | ~ ^ :分别为按位与、按位或、按位取反、按位异或

  • <>:左右移位运算符,例如0010  -->  0100

  • ?:三元判断运算符

*结构体(选看)

结构体是一种比较特殊的数据类型,它很像我们后面讲述到的类,但是他并不是一个类,他本质还是值类型,结构体的使用是很重要的,如果结构体使用得当,可以有效的提升程序的效率。

结构体你可以理解为将将若干个类型拼接在一起,但是存在一个很重要的内容——内存对齐。例如下面两个结构体:

struct S{    int a;    long b;    int c;}struct SS{    int a;    int b;    long c;}

乍一看你会觉得这两个结构体完全一致,丝毫没有任何的差别。但事实上,在大多数编程语言里面,对于结构体这种大小并不是定值的值类型,都存在一个最小分配单元用于结构体内单个变量的大小分配。在内存中,他们两个的存储方式有很大的不同。
对于上面两个结构体,他们在内存中的单元分配是:

  • S:a(4 byte + 4 free) --> b(8 byte) --> c(4 byte + 4 free),共计24字节

  • SS:a(4 byte)b(4 byte) --> c(8 byte),共计16字节

在C#中,如果你不指定最小分配单元,那么编译器将会把结构体中占用内存最大的作为最小分配单元。不过尤其需要注意一件事,就是引用类型在结构体中。鉴于我们现在尚未讲解面向对象的类,我们用string作为成员写一个结构体。如下面这个例子:

struct S{    char a;    long b;    string c;}//函数中创建S s = new S();s.a = 'a';s.b = 15;s.c = "I Love .NET Core And Microsoft"

很显然s.c的大小超过了结构体中其余两个,但是内存分配的时候就是以最大的c作为标准吗?

显然不是,我们要知道struct是在栈中分配内存,string的内容是在堆中的,所以在结构体中存储的string只是一个引用,并不会包含其他的东西,只占用4个字节。并且特别的,引用类型在内存中的位置位于大于四字节的字段前,小于四字节字段后。

上面内存分配应当是这样:
a(8) --> c(8) --> b(8)。

如果需要深入了解这一方面内容,建议去阅读《CLR Via C#》这本书,以及学习SOS调试相关内容。

c 结构体 不允许使用不完整的类型_.NET Core 基础类型介绍相关推荐

  1. c 结构体 不允许使用不完整的类型_C语言必学知识点 quot;结构体quot;详细解析!...

    结构体是经常用到的数据类型,使用频率不亚于指针,所以需要重视,不过用法非常简单. 一.什么是结构体 ☀ 在前面的时候已经介绍了C语言中的数组,用法跟其他语言差不多.当一个整体由多个数据构成时,我们可以 ...

  2. 结构体在cuda核函数里面不能用吗_求职招聘 | 面试机器学习职位,这些知识点你都会了吗?...

    『运筹OR帷幄』转载 求职招聘栏目 来自于运筹帷幄的招聘板块.一方面,我们将为大家精心挑选和整理全球与运筹学.数据科学.机器学习.人工智能等领域相关的招聘职位.另一方面,我们也将翻译和转载国内外在该领 ...

  3. framebuffer结构体分析

    转载出处  http://blog.chinaunix.net/uid-22666248-id-284148.html fb_fix_screeninfo fb_var_screeninfo结构体测试 ...

  4. 【C 语言】结构体 ( 结构体偏移量计算 | 代码示例 )

    文章目录 一.结构体成员偏移量 二.完整代码示例 一.结构体成员偏移量 获取 Student 结构体中 age 成员偏移量 有 222 种写法 ; 结构体样式 : typedef struct Stu ...

  5. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

  6. c语言实现结构体变量private,C语言中结构体变量私有化详解

    背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate ...

  7. 数据结构之结构体复习

    为什么出现结构体? 为了表示一些复杂的数据,一些基本数据类型无法满足要求, 当要用一个变量描述一个对象的多个属性时,普通的内置数据类型是表示不了的,这个时候就可以用结构体回.结构体和类很相似,唯一不同 ...

  8. Golang 笔记 2 函数、结构体、接口、指针

    一.函数 Go中函数是一等(first-class)类型.我们可以把函数当作值来传递和使用.Go中的函数可以返回多个结果.   函数类型字面量由关键字func.由圆括号包裹声明列表.空格以及可以由圆括 ...

  9. Golang 结构体

    前言 结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体.每个值称为结构体的成员. 用结构体的经典案例:学校的学生信息,每个学生信息包含一个唯一的学生学号.学生的名字.学生的性别.家庭 ...

最新文章

  1. 4.2 Tensorflow笔记:池化函数
  2. VTK:vtkArrayCalculator用法实战
  3. 如何找到某个方法的声明
  4. Elasticsearch自动补全(拼音查询自动补全)
  5. Photoshop cc2019 破解教程
  6. 河北工程大学计算机类专业排名,河北工程大学优势专业排名,2021年河北工程大学最好的专业排名...
  7. 锐度对比度饱和度什么的
  8. 2023南京信息工程大学计算机考研信息汇总
  9. 2017关于自学PHP的方法
  10. 判断对象属性是否全部为空
  11. 在线答题刷题,创建题库智能组卷,更高效!
  12. 笔记本电脑F1~F12区不能用问题,输入模式问题
  13. ubuntu向日葵和Todesk连接不了的桌面管理环境问题
  14. Ubuntu22.04编译Android切换Python2.7版本
  15. Android App无法抓包的解决方案总结
  16. springboot 设置指定包的日志级别
  17. CorelDRAW多个文件如何批量导出JPG
  18. 本科大专年限算工龄吗
  19. win8 编译x265
  20. 一篇短文让你了解如何简化「内测托管」过程

热门文章

  1. leetcode 1044. Longest Duplicate Substring | 1044. 最长重复子串(Rabin Karp算法)
  2. Why docker command need sudo? | 为什么运行docker命令需要sudo?
  3. 网络与IO知识扫盲(四):C10K问题、BIO的弊端与NIO的引入
  4. 【Git】Git 修改刚提交的 commit message
  5. 【相对/绝对路径】JavaWeb项目中,请求转发与重定向的路径写法
  6. CentOS 编译Hadoop 2.6 32位
  7. mybatis分页插件pageHelper简单实用
  8. JAVA虚拟机运行数据区
  9. 【最全!最完整解析!】 计算机中,执行一条指令所需要的时间称为指令周期,完成一项基本操作所需要的时间称为机器周期,时钟脉冲的重复周期称为重复周期。因此,()
  10. flask执行python脚本_如何在Flask中运行python脚本