【C#本质论 二】数据类型
本章来介绍C#语言里的基本数据类型,以及字符串的一些操作方式。
基本数据类型
C#语言里的基本数据类型包括八种整数类型、两种用于科学计算的二进制浮点类型、一种用于金融计算的十进制浮点类型,一种布尔类型以及一种字符类型(包括其组合的string)。
整数类型
整数类型有以下几种,BCL是什么呢?在我的另一篇博客里介绍到了,其实就是CLR定义的适用于全平台语言的基本类型。
要使用C#自己的类型而不是BCL类型!要用string而不是String,这也解释了多年的困惑,为啥C#里有String和string,其实是相同的关键字,但是推荐使用C#自己的关键字。
浮点类型
浮点类型包括两种,其实和我们大多数接触过的语言都类似,float和double,值得注意的是:浮点数的精度由有效数位的个数来决定,而不是一个固定值。
decimal类型
decimal是128位精度的十进制浮点类型,虽然它的 精度比浮点型更高,但是范围比浮点型更小。
布尔类型
在条件表达式和条件语句中表示真或假,允许的值包括关键字true和false。由8位二进制位表示。
字符类型
字符类型就是char,由16位二进制位表示。需要注意的是其特殊字符的插入形式:
从上至下分别为:单引号、双引号、反斜杠以及Null。
从上至下分别为:Alert,退格、换页、换行、回车、水平制表符、垂直制表符、十六进制Unicode字符、十六进制Unicode字符(长度可变版本)、Unicode转义序列(用于创建代理项对)。
C#冷知识
1,在构造字符串这件事上,string类型是不可变的,而StringBuilder不仅可以提供和string类似的方法,例如:Append、AppendFormat、Insert、Remove、Relpace,还能保证方法可以直接修改StringBuilder本身的数据而不是返回一个新的字符串。
2,赋值为null表示变量已赋值,但无任何值变量已赋值,但无任何值,这和赋值为“”以及不赋值是有区别的,区别如下:
3,可以使用System.WriteLine()和System.Environment.NewLine()这两个方法来保证跨平台的换行符兼容性。
4,字面值表示源代码中的固定值,直接将值放到代码中叫硬编码,只要改值就需要重新编译代码,可以考虑将值通过配置文件读取,这样就不需要重新编译代码了。
5,默认情况下,输入小数会被当成double,输入整数会被当成int,如果整数超过int范围会被当成long。而C#还支持各种字面值的显示。
private static void Main(){Console.WriteLine(0b1000010); //二进制字面值Console.WriteLine(0x0002AFE); //十六进制字面值Console.WriteLine(6.02E23F); //指数计数法:E标识指数,F表示为浮点Console.WriteLine($"0x{42:x}"); //将十进制格式化为十六进制:0x2a,如果是大写X,则为0x2A}
6,通过R格式化来保留值的精度:
private static void Main(){const double number = 1.618033988749895;var text = $"{number}";var result = double.Parse(text); //精度丢失System.Console.WriteLine($"{result == number}"); //返回falsetext = $"{number:R}";result = double.Parse(text); //保留原值System.Console.WriteLine($"{result == number}"); //返回true}
7,字符串驻留技术,虽然字符串不可变,赋值操作只会重新创建一个指向新内存的引用,所以改变str2的值操作并不会改变str1的值:
string str1 = "tml";
string str2 = str1;
str2 = "hhh" //并不会改变str1的值
公共语言运行库通过维护一个表来存放字符串,该表称为拘留池,它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。因此,具有特定值的字符串的实例在系统中只有一个:
string str1 = "CharlesChen";
string str2 = "CharlesChen";
System.Object.Equals(str1,str2) //返回True
当我们调用时候,返回值是True,按道理说是应该返回为false,str1和str2应该指向不同的内存空间才对。怎么会返回为true呢?这里就引入了"字符串驻留技术"。
其实这里CLR使用了字符串驻留技术,当CLR初始化时,会创建一个内部的散列表(Hash表),其中的键位字符串,值为指向托管堆中字符串的引用。刚开始,散列表为空,JIT编译器编译方法时,会在散列表中查找每一个文本字符串常量(这里是"CharlesChen"),首先会查找"CharlesChen",并且因为没找到,编译器会在托管堆中构造一个全新的指向"CharlesChen"的对象引用,然后将"abc"字符串和执行该对象的引用添加到散列表中去。
当string str2=“CharlesChen"时候,由于前面已经在散列表中加了该"CharlesChen"字符串,所以编译器不会执行任何分配内存空间的操作。首先编译器会在内部的散列表中查找"CharlesChen”,并且会找到,这样指向先前创建的String对象的引用就会被找到,并且这里Str2就指向找到的那个引用。因此Str1和Str2就指向了内存中同一个地址的引用。所以System.Ojbect.Equals(str1,str2)就返回为true了。
C#新知识
1,类型转换这件事:所有数值类型都能通过Parse()方法将对应的string类型转为数值类型。然而这种转换是不安全的!推荐使用TryParse方法
private static void Main(){const string tml1 = "1234568"; //变量未赋值,编译不能通过var flag = int.TryParse(tml1, out var output);Console.WriteLine(output);}
从C#7.0开始, out参数可以使用内联的形式而不需要事先声明了! 除此之外,还推荐使用System.Convert()方法。
2,区分大小写的字符串比较:string.Compare(temp1,temp2)
,不区分大小写的字符串比较:string.Compare(temp1,temp2,true)
,
【C#本质论 二】数据类型相关推荐
- C#2.0实例程序STEP BY STEP--实例二:数据类型
C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...
- pythonsze_python学习笔记二 数据类型(基础篇)
Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...
- (C/C++学习笔记) 二. 数据类型
二. 数据类型 ● 数据类型和sizeof关键字(也是一个操作符) ※ 在现代半导体存储器中, 例如在随机存取存储器或闪存中, 位(bit)的两个值可以由存储电容器的两个层级的电荷表示(In mode ...
- python整型变量的使用_python(二)数据类型与变量
python基础之数据类型与变量 一.变量 变量 声明变量 #!/usr/bin/env python age=18 gender1='male' gender2='female' 变量作用:保存状态 ...
- JNI学习积累之二 ---- 数据类型映射、域描述符说明
本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与 ...
- C 语言 和 C++语言的对比学习 二 数据类型
不管是什么语言,我们最习惯的是通过 "hello world" ,来昭告世界,我们有了新的语言来向这个世界问好,尽管真正属于我们自己的其实是哭声.(呵呵,笑点有点低),下面我们来介 ...
- JavaScript(二)——数据类型、流程控制、Map和Set
文章目录 1. 数据类型 1.1 字符串 1.2 数组 1.3 对象 2. 流程控制 3. Map和Set 4. iterator 1. 数据类型 1.1 字符串 正常字符串我们使用 单引号,或者双引 ...
- Swift基础学习(二)数据类型
在编程语言中,不同的数据信息需要不同的数据类型来存储,计算机内存中针对不同的数据类型它们所分配的内存大小是不同的,特定的值需要特定的类型来声明. Swift 数据类型 内置数据类型 整数 - Int ...
- python中数据类型转换_Python(二).数据类型,数据类型转换
数据类型 在python中,能够直接处理的的数据类型有以下几种:(这里似乎说法不一样,我这里仅表示自己的观点) (1).数字(Number) (2).字符串(String) (3).布尔值(Bool) ...
最新文章
- 2018年爱奇艺校招笔试
- php支持ssi,让Apache支持SHTML(SSI)的配置方法
- 页面滚动事件无效小记
- 对Boost.Asio中异步事件循环的理解
- 狼性文化遭质疑,那我们当个佛系程序员可好?
- 计算机动漫与游戏制作画画教学,科普下动漫制作必须会画画吗
- HIve map jion的原理、操作和使用场景
- java mybatis 动态_Java-MyBatis:MyBatis 3 动态 SQL
- 站内搜索(ELK)之数据目录
- Linux小知识收集(不断更新)
- 为Node.js编写组件的几种方式
- python命令行安装包
- 左程云《程序员代码面试指南》C++实现
- linux 修改mysql端口
- excel怎么录入身份证号码快速方便?
- ELK (三)安装kibana
- 搭建react + typescript + airbnb eslint 项目
- Android mc怎么和win10联机,我的世界实现跨平台联机 Win10玩家可与手机互联
- 做转子力学分析,你选APDL还是Workbench仿真?
- Bloglink list