理解C#系列 / 核心C# / 数据类型

数据类型

数据类型

C#把数据类型分为两种:值类型和引用类型。

值类型和引用类型

值类型的变量直接指向存储的值,引用类型的变量指向值的引用。[理解:引用就像一个柜子的号码牌,可以顺藤摸瓜找到柜子。假如你再次对一个值类型的变量赋值,那么就会改变值,假如你再次对一个引用类型的变量赋值,那么就只是换了一个号码牌,指向了其他的柜子,对前一个柜子是不做修改的。]

这两种类型的数据存储在内存的不同地方,值类型数据存储在堆栈中,而引用类型的数据(值的引用)存储在托管堆上。

在使用的时候的区别

int i=20;
int j=i;

int定义整数类型的变量,整数类型属于值类型,j在赋值的时候复制了i的值,所以这会在内存的两个地方存储值20,如果改变其中一个,不会影响另外一个。

Apple a = new Apple();
a.color = "red";
Apple b = a;
b.color = "green";

Apple是我们定义的苹果类型,我们用new Apple()创造了一个实际的苹果,并用引用类型的变量a指向了这个创造的苹果。

在第二行设定了苹果的颜色是红色。

在第三行我们添加了一个新变量,赋值了a这个引用类型的数据,所以b也是指向了a指向的那个苹果,并没有产生第二个苹果。

在第四行,我们修改b指向的苹果的颜色为绿色,这时候实际上查看a.color也会发现苹果的颜色是绿色了,因为始终就只有一个苹果呀。

Apple a = null;

这表示让一个苹果类型的变量不指向任何实际的苹果,如果你想使用这个变量a代表的实际的苹果,就会报错,因为没有东西呀,怎么能使用呢。值类型的变量就不可以赋值null,这是引用类型的专利。

当已经没有任何一个变量指向某个实例的时候,这个实例就不能被访问到了,CLR的垃圾收集器会定期找寻这样的实例,删除它们,把它们占用的内存返回给操作系统。

预定义数据类型

C#有15个预定义类型,其中13个是值类型,两个是引用类型(string和object)

13个值类型中有8个整型:{分正负的:8位sbyte,16位short,32位int,64位long}{无符号的:8位byte,16位ushort,32位uint,64位ulong}。

13个值类型中有2个浮点类型:{float:32位单精度浮点数}{double:64位双精度浮点数}。

13个值类型中还有:{decimal:通常用于财务计算的128位高精度十进制表示法}{bool:用于包含布尔值true或false}{char:为了保存单个字符的值}。

值类型的赋值方法:

int i = 1234;
uint ui = 1234U;
long l = 1234L;
long x = 0x12ab;//用16进制赋值需添加0x前缀
ulong ul = 1234UL;
float f = 12.3F
double d = 12.3;
decimal d = 12.30M;
bool b = true;
char c = ‘A‘;
char c = ‘\n‘;//转义符

2个预定义的引用类型:{object:根类型,面向对象概念}{string:字符串类型,但拥有许多值类型的特性,使它常被误认为值类型}

时间: 2024-11-04 18:10:10

理解C#系列 / 核心C# / 数据类型的相关文章

理解C#系列 / 核心C# / 常量

常量 常量? 我对常量的理解就是在初始化完成后再也不变的“全局变量”. 定义常量 [const][空格][变量类型][空格][变量名称][=][值][:] const表示定义的是常量. 常量特点 常量必须在声明时初始化.指定了值后,就不能再改写.赋值了. 不能借用变量对常量初始化.如果要这么做,应该使用只读字段. 常量总是静态的,不必且不允许标明static. 使用场景 用于定义软件运行期间一直不会变的“变量”,且该“变量”在所有代码区域都可以访问. 见过修改配置,需要重新打开的软件或游戏没有,

理解C#系列 / 核心C# / 判断&循环&跳转

判断&循环&跳转 说明 本节写的是C#语言的控制程序流的语句,“控制程序流”就是控制程序运行流程的意思. 判断 很容易理解:如果……就…… if语句:测试特定条件是否满足,如果满足就执行某些代码,如果不满足就执行else中的代码. int i=0; if(i==0) { i=1; } else { i=0; } 程序很简单,建立整数变量,初始化为0,经过一个判断{如果满足条件: i 等于 0,那么对 i 赋值 1,若不满足条件,即 i 不等于0 时,对 i 赋值 0}.(x==y),两个等

理解C#系列 / 核心C# / 名称空间

名称空间namespace 名称空间 名称空间用来逻辑分类,而不是物理上的,名称空间与程序集无关[程序集:经由编译器编译得到的文件],同一个程序集中可以有2不同的名称空间,也可以在不同的程序集中定义同一个名称空间中的类型. 业内习惯 空间名称可以嵌套,业内习惯如此定义:[公司名称].[项目名称].[分类名称] using语句 使用using开头,可以在代码中省略命名空间 与Java的import作用相似 但是不要和C/C++的#include混淆 using还可以指定别名,如果命名空间字符串太长

理解C#系列 / 核心C# / 编译参数

编译参数 编译控制台应用程序 csc 源文件.cs 编译Windows应用程序 csc /t:winexe 源文件.cs 编译类库应用程序 csc /t:libray 源文件.cs 编译引用类库的应用程序 csc 源文件.cs /r 类库文件.dll

理解C#系列 / 核心C# / 枚举

枚举 如果没有枚举 //1代表s号:2代表m号:3代表l号:4代表XL号:5代表XXL号 int 尺号=0; if(尺号==2){ //快递发M号的衣服 } 有了枚举之后 声明枚举(请原谅我使用了中文汉字) public enum 尺号 { 未知, S, M, L, XL, XXL } 使用枚举 尺号 ch = 尺号.M; if(ch==尺号.M) { //快递发M号的衣服 } 如果没有注释又没有枚举,那么除了开发者谁知道0或者1.2.3代表什么,对吧. 枚举 枚举是用户定义的整数类型.如果在声

理解C#系列 / 核心C# / 变量

变量 变量? 变量是对一个东西指定一个名称,变量的功能和人的名字差不多,提到名字就知道指的是什么. 变量类型? 变量类型说明了变量的类型,声明变量是一个整数,还是小数,还是字符,或是图像,或是人类,或是什么. 定义变量 [变量类型][空格][变量名称][;] 赋值 [变量名称][=][值][;] 变量第一次被赋值叫做变量初始化. 变量在使用前必须被赋值,就是必须指向一个目标,不能只有名字,而不知道名字代表什么. 定义变量的同时进行赋值 [变量类型][空格][变量名称][=][值][;] 相同变量

深入理解JavaScript系列(10):JavaScript核心(晋级高手必读篇)

本篇是ECMA-262-3 in detail系列的一个概述(本人后续会翻译整理这些文章到本系列(第11-19章).每个章节都有一个更详细的内容链接,你可以继续读一下每个章节对应的详细内容链接进行更深入的了解. 适合的读者:有经验的开发员,专业前端人员. 原作者: Dmitry A. Soshnikov 发布时间: 2010-09-02 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 参考1:http://ued.ctr

深入理解JavaScript系列(24):JavaScript与DOM(下)

介绍 上一章我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点.本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型. 本文参考:http://net.tutsplus.com/tutorials/javascript-ajax/javascript-and-the-dom-lesson-2/ 操作元素 上一章节我们提到了DOM节点集合或单个节点的访问步骤,每个DOM节点都包括一个属性集合,大多数的属性都提供为相应的功能提供了抽象.例如,如果有一个带有

深入理解JavaScript系列 --汤姆大叔

深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaScript系列(3):全面解析Module模式 深入理解JavaScript系列(4):立即调用的函数表达式 深入理解JavaScript系列(5):强大的原型和原型链 深入理解JavaScript系列(6