.NET Core CSharp初级篇 1-1
.NET Core CSharp初级篇 1-1
本节内容是对于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
- ?:三元判断运算符
具体的操作我会在我在BiliBili上发布的.Net Core教程上进行详细的讲述。
*结构体(选看)
结构体是一种比较特殊的数据类型,它很像我们后面讲述到的类,但是他并不是一个类,他本质还是值类型,结构体的使用是很重要的,如果结构体使用得当,可以有效的提升程序的效率。
结构体你可以理解为将将若干个类型拼接在一起,但是存在一个很重要的内容——内存对齐。例如下面两个结构体:
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调试相关内容。
更多内容请关注我的BiliBili地址以及我的博客。
Github上有练习题、实例代码以及ppt。
如果我帮到了你,请在我的Github点上一颗星,一个fork。谢谢,地址Github
.NET Core CSharp初级篇 1-1的更多相关文章
- NET Core CSharp初级篇 1-3面向对象
.NET Core CSharp初级篇 1-3 本节内容为面向对象初级教程 类 简介 面向对象是整个C#中最核心最有特色的一个模块了,它很好的诠释了程序与现实世界的联系. 面向对象的三大特征:继承.多 ...
- .NET Core CSharp初级篇 1-5 接口、枚举、抽象
.NET Core CSharp初级篇 1-5 本节内容类的接口.枚举.抽象 简介 问题 如果你需要表示星期或者是某些状态,使用字符串或者数字是否不直观? 你是否发现,无论何种电脑,它的USB口的设计 ...
- .NET Core CSharp初级篇 1-6 类的多态与继承
.NET Core CSharp初级篇 1-6 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容 ...
- .NET Core CSharp初级篇 类的生命历程
.NET Core CSharp初级篇 1-7 本节内容为类的生命周期 引言 对象究竟是一个什么东西?对于许多初学者而言,对象都是一个非常抽象的知识点.如果非要用一句话描述,我觉得"万物皆对 ...
- .NET Core CSharp初级篇 1-8泛型、逆变与协变
.NET Core CSharp初级篇 1-8 本节内容为泛型 为什么需要泛型 泛型是一个非常有趣的东西,他的出现对于减少代码复用率有了很大的帮助.比如说遇到两个模块的功能非常相似,只是一个是处理in ...
- .NET Core CSharp初级篇 1-2 循环与判断
.NET Core CSharp初级篇 1-2 本节内容循环与判断 循环 循环是一个在任何语言都是极为重要的语法,它可以用于很多东西,例如迭代数组等等.在C#中,语法层面的循环有:for , fore ...
- CSharp初级篇 1-4 this、索引器、静态、常量以及只读
.NET Core CSharp初级篇 1-4 本节内容为this.索引器.静态.常量以及只读 简介 在之前的课程中,我们谈论过了静态函数和字段的一小部分知识,本节内容中,我们将详细的讲解关于对象操作 ...
- .NET Core CSharp 中级篇 2-2 List,ArrayList和Dictionary
.NET Core CSharp 中级篇 2-2 本节内容为List,ArrayList,和Dictionary 简介 在此前的文章中我们学习了数组的使用,但是数组有一个很大的问题就是存储空间不足,我 ...
- .NET Core CSharp 中级篇 2-1 装箱与拆箱
.NET Core CSharp 中级篇 2-1 本节内容为装箱与拆箱 简介 装箱和拆箱是一个相对抽象的概念.你可以想象一下一堆满载货物的大卡车,他是由许多工人将货物集中堆放装入的,对于我们而言在没有 ...
随机推荐
- G1 安装 Linux Debian system
开发Android第五步,G1 安装 Linux Debian system 在 G1 上安装 Linux Debian system (Debian ARMEL) 要具备以下条件: (a) 最好是 ...
- qt技巧--使用html导出表格替代excel
曾经为qt不能直接导出excel而困扰,后来经过深入了解,得知qt支持xml国际语言,html是xml的一种.html是做网页的,相信大家比较熟悉.所以使用html的<table ...
- 建立Linux计划命令crontab
crontab翻译:排程,命令 crontab从输入设备输入命令,并将其放入crontab文件,供守护进程crond读取并执行,crond在后台每一分钟执行一次 crontab -e:创建计划命令,进 ...
- 网易Lofter
作为老网虫,对网易的感情是很深的.当我知道Lofter这个东西后,曾经很兴奋要好好打理自己的博客,然而兴奋很快过了.因为Lofter无时无刻不在刷存在感.无限空间加无限图片流量,国内的服务无法做的更好 ...
- Codility---PermCheck
Task description A non-empty zero-indexed array A consisting of N integers is given. A permutation i ...
- hadoop之hive建表语句备份
转自:https://blog.csdn.net/t___z/article/details/78492113 #!/bin/bash hive -e "use lbi;show table ...
- java集合框架collection(4)HashMap和Hashtable的区别
HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别.主要的区别有:线程安全性,同步(synchronizatio ...
- Spark学习之路(十三)—— Spark Streaming 与流处理
一.流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中.应用程序根据需要查询数据或计算数据.这就是传统的静态数据处理架构.Hadoop采用HDFS进行数据 ...
- axios参考手册
目录 搜索 使用说明 升级指南 生态系统 本文档使用 看云 构建 使用说明 ##Axios Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node ...
- Android之控件学习
文本域,类似于HTML里的textarea <EditText android:id="@+id/edit_text" android:layout_width=" ...