8.0强行转换后变成了7_【自学C#】|| 笔记 12 数据类型转换
一、数据类型转换
C# 是一门强类型语言,对类型要求比较严格,但是在一定的条件下也是可以相互转换的,如将 int 型数据转换成 double 型数据。
C# 允许使用两种转换方式:隐式类型转换和显式类型转换。
二、隐式类型转换
这些转换是 C# 默认的以安全方式进行的转换,不会导致数据丢失。
例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
例:
double d = 10f + 9 + 'a'+2.5;
这里,赋值等号左边是一个double类型的数据。
1)而右边的10f,其实是float类型,在进行计算时,会自动转换成double。(因为double大于float)。
值得注意的是,浮点(小数)型的数据类型,默认的就是double。
所有10加个f,实际就表示转换成float类型。
2)而右边的9,是一个int类型。在计算后,也会自动转换成double类型。(同样double大于int) 。
同样值得注意的是,整型数据类型中,默认的是int。
3)而右边的a,是个字符型。但根据ASCII字符和数值之间的转换码,a也就等于十进制的97,然后在进行计算后,又会转换成double类型。
4)2.5,因为没有加f,所以也就默认为double类型。
(综上,隐式类型转换,也就是默认自动转换。隐藏式)
隐式数值转换包括以下几种:
从 sbyte 类型到 short,int,long,float,double,或 decimal 类型。
从 byte 类型到 short,ushort,int,uint,long,ulong,float,double,或 decimal 类型。
从 short 类型到 int,long,float,double,或 decimal 类型。
从 ushort 类型到 int,uint,long,ulong,float,double,或 decimal 类型。
从 int 类型到 long,float,double,或 decimal 类型。
从 uint 类型到 long,ulong,float,double,或 decimal 类型。
从 long 类型到 float,double,或 decimal 类型。
从 ulong 类型到 float,double,或 decimal 类型。
从 char 类型到 ushort,int,uint,long,ulong,float,double,或 decimal 类型。
从 float 类型到 double 类型。
其中,从 int,uint 或 long 到 float 以及从 long 到 double 的转换可能会导致精度下降,但决不会引起数量上的丢失。其它的隐式数值转换则不会有任何信息丢失。
隐式数值转换实际上就是从低精度的数值类型到高精度的数值类型的转换。
三、显式类型转换
显式类型转换,即强制类型转换。
显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
表达形式:
数据类型变量名 = (数据类型) 变量名或值;
例:
int i = (int)128L;
这里,赋值等号左边的是一个int类型i。
右边是一个long类型的128,long类型比int大,所以不会自动转换,因而需要强制转换。也就是加跟左边相同的数据类型,并用括号包裹起来。
(显示类型转换,就是强制转换!强行改变类型。)
这样虽然能将值进行类型的转换,但损失了数据的精度,造成了数据的不准确,因此在使用强制类型转换时还需要注意数据的准确性。
三、 常用的类型转换方法如下表所示。
方法 | 描述 |
---|---|
ToBoolean | 如果可能的话,把类型转换为布尔型。 |
ToByte | 把类型转换为字节类型。 |
ToChar | 如果可能的话,把类型转换为单个 Unicode 字符类型。 |
ToDateTime | 把类型(整数或字符串类型)转换为 日期-时间 结构。 |
ToDecimal | 把浮点型或整数类型转换为十进制类型。 |
ToDouble | 把类型转换为双精度浮点型。 |
ToInt16 | 把类型转换为 16 位整数类型。 |
ToInt32 | 把类型转换为 32 位整数类型。 |
ToInt64 | 把类型转换为 64 位整数类型。 |
ToSbyte | 把类型转换为有符号字节类型。 |
ToSingle | 把类型转换为小浮点数类型。 |
ToString | 把类型转换为字符串类型。 |
ToType | 把类型转换为指定类型。 |
ToUInt16 | 把类型转换为 16 位无符号整数类型。 |
ToUInt32 | 把类型转换为 32 位无符号整数类型。 |
ToUInt64 | 把类型转换为 64 位无符号整数类型。 |
四、Parse方法:字符串类型转换
用于将字符串类型转换成任意类型。
表达形式
数据类型 变量二数据类型.Parse(字符串类型的值);
例:
int num1 = int.Parse("1");
赋值等号的左边,跟正常情况一样,定义数据类型变量并等待赋值。
右边的,就是数据类型转换的方法。
括号里面的是一个字符串。
int则是int类型,如果换成double.Parse("1");就是double类型。
改变的是“点”前面的“变量二数据类型”,这里有些不同。
1.示例
在 Main 方法中从控制台输入 3 个数,并将其中的最大数输出。
class Program{ static void Main(string[] args) { Console.WriteLine("请输入三个数字"); int num1 = int.Parse(Console.ReadLine()); int num2 = int.Parse(Console.ReadLine()); int num3 = int.Parse(Console.ReadLine()); int maxvalue = num1; if (num2 > maxvalue) { maxvalue = num2; } if (num3 > maxvalue) { maxvalue = num3; } Console.WriteLine("三个数中最大的值是:" + maxvalue); }}
分析:
这里采取了手动输入数值的方式进行赋值。int num1 = int.Parse(Console.ReadLine());
由于Console.ReadLine()这个返回的是一个字符串类型,string类型。
所以通过int.Parse()将string字符串类型转换成了int类型。
然后就是将这数值赋给一个int类型的变量,并且输入三次。
然后定义一个最大值的变量maxvalue,再进行if语句判断选择并赋值。
最后就是输出maxvalue。
五、Convert方法:数据类型转换
该方法是数据类型转换中最灵活的方法,它能够将任意数据类型的值转换成任意数据类型,前提是不要超出指定数据类型的范围。
表达形式:
数据类型 变量名 = convert.To数据类型(变量名);
例:
int a = Convert.ToInt32(82.26f);
将82.26float类型,转换为int类型,82.
这里 Convert.To 后面的数据类型要与等号左边的数据类型相匹配。
1.Convert 类常用的类型转换方法如下表所示。
方法 | 说明 |
---|---|
Convert.ToInt16() | 转换为整型(short) |
Convert.ToInt32() | 转换为整型(int) |
Convert.ToInt64() | 转换为整型(long) |
Convert.ToChar() | 转换为字符型(char) |
Convert.ToString() | 转换为字符串型(string) |
Convert.ToDateTime() | 转换为日期型(datetime) |
Convert.ToDouble() | 转换为双精度浮点型(double) |
Conert.ToSingle() | 转换为单精度浮点型(float) |
对于整型和浮点型的强制数据类型操作也可以使用 Convert 方法代替,但是依然会损失存储范围大的数据类型的精度。
2.例
使用 Convert 方法将分别将一个浮点型数据转换成整型和字符串型。
class Program{ static void Main(string[] args) { float num1 = 82.26f; int integer; string str; integer = Convert.ToInt32(num1); str = Convert.ToString(num1); Console.WriteLine("转换为整型数据的值{0}", integer); Console.WriteLine("转换为字符串{0},",str); }}
分析:
定义了float类型的一个数值,然后放进“Convert方法”中进行转换。
82.26f转换成int类型后,为82.
82.26f转换成string字符串类型后,为82.26;(虽然同样是数字,但类型却变了。)
六、装箱和拆箱(值类型和引用类型)
大致可以理解成,值类型就是直接赋值,像int、double数值类型。
引用类型就是像字符串、这种非直接赋值的类型。
1.例
利用装箱和拆箱功能,可通过允许值类型的任何值与 Object 类型的值相互转换,将值类型与引用类型链接起来
int val = 100;object obj = val;Console.WriteLine("对象的值 = {0}", obj);//这是一个装箱的过程,是将值类型转换为引用类型的过程int val = 100;object obj = val;int num = (int) obj;Console.WriteLine("num: {0}", num);//这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程
分析:
1~3行
就是先定义一个int类型变量,并直接赋值。就是值类型。
将变量赋给新的变量,就是引用类型。
7行
经过强行转换后,会成为值类型。
2.ToString 方法用于将任意的数据类型转换成字符串类型。
例如将整数类型转换成字符串类型。再转换回整数类型。
int a=100;string str=a.ToString();a=int.Parse(str);
这里字符串就是引用类型,int就是值类型。
七、正则表达式(Regex类)
主要作用是验证字符串的值是否满足一定的规则,在页面输入数据验证方面的应用比较多。
例如验证输入的邮箱是否合法、输入的身份证号码是否合法、输入的用户名是否满足条件等。
正则表达式并不是 C# 语言独有的,在大多数的编程语言中都是支持的,包括一些脚本语言也支持,例如 JavaScript、JQucry 等。
(这里比较乱,内容也比较多,但基本上就是一些固定写法固定规则)
正则表达式的符号主要分为元字符和表示重复的字符,分别如下表所示。
编号 | 字符 | 描述 |
---|---|---|
1 | . | 匹配除换行符以外的所有字符 |
2 | \w | 匹配字母、数字、下画线 |
3 | \s | 匹配空白符(空格) |
4 | \d | 匹配数字 |
5 | \b | 匹配表达式的开始或结束 |
6 | ^ | 匹配表达式的开始 |
7 | $ | 匹配表达式的结束 |
这里表示的,是将匹配的内容,以符号的形式表示。并且还进行了归类。
编 号 | 字 符 | 描 述 |
---|---|---|
1 | * | 0次或多次字符 |
2 | ? | 0次或1次字符 |
3 | + | 1次或多次字符 |
4 | {n} | n次字符 |
5 | {n,M} | n到M次字符 |
6 | {n, } | n次以上字符 |
这里是重复的次数,在确定字符的类型后,再确定个数。
此外,在正则表达式中使用|分隔符表示多个正则表达式之间的或者关系,也就是在匹配某一个字符串时满足其中一个正则表达式即可。
1.例
使用正则表达式来验证身份证信息。
第一代身份证是由 15 个数字构成的,第二代身份证是由 18 个数字构成的。
Regex regex = new Regex(@"\d{15}|\d{18}");
分析:
\d表示匹配的数字,{15}表示重复15次。
|类似或运算。
然后在进行\d{18}进行数字匹配,并重复18次。
Regex regex = new Regex(@"\d{15}|\d{18}");
这里的@是固定的写法,否则回报错。
然后通过regex.IsMatch(一个字符串)方法进行匹配,返回一个布尔值。
下面是完整的案例。
using System;using System.Text.RegularExpressions;namespace ConsoleApplication11{ class Program { static void Main(string[] args) { Console.WriteLine("请输入一个身份证"); string a = Console.ReadLine(); Regex regex = new Regex(@"\d{3}|\d{18}"); if (regex.IsMatch(a)) { Console.WriteLine("正确。"); } else { Console.WriteLine("不正确。"); } } }}
在 C# 语言中使用正则表达式时要用到 Regex 类,该类在 System.Text.RegularExpressions 名称空间中。
在 Regex 类中使用 IsMatch 方法判断所匹配的字符串是否满足正则表达式的要求。
2.例
在 Main 方法中从控制台输入一个邮箱,使用正则表达式判断其正确性。
根据题目要求,在本例中邮箱验证的正则表达式的写法是包含 @,在 @ 前面是字母或者数字、下画线,在 @ 后面也是字母或者数字、下画线,并且字母后面要含有.,在 . 后面还要加上字母或者数字、下画线。具体的代码如下。
using System;using System.Text.RegularExpressions;class Program{ static void Main(string[] args) { Console.WriteLine("请输入一个邮箱"); string email = Console.ReadLine(); Regex regex = new Regex(@"^(\w)+(\.\w)*@(\w)+((\.\w+)+)$"); if (regex.IsMatch(email)) { Console.WriteLine("邮箱格式正确。"); } else { Console.WriteLine("邮箱格式不正确。"); } }}
分析:
首先需要导入using System.Text.RegularExpressions;
然后手动输入一个邮箱。
再定义一个正则表达式。
再通过.IsMatch()方法返回的true和false来进行判断。
邮箱的正则表达式也有多种写法,上面的写法只是其中的一种,例如将实例中的\w替换成[a-zA-Z0-9_]。
此外,在 Regex 类中还提供了很多方法来操作正则表达式
字符 | 描述 |
---|---|
\ | 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反过来 |
(pattern) | 匹配 pattern 并获取这一匹配 |
(?:pattern) | 匹配 pattern 但不获取匹配结果 |
(?=pattern) | 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串 |
(?!pattern) | 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串 |
x|y | 匹配x或y。例如,‘z|food’能匹配“z”或“food”。‘(z|f)ood’则匹配“zood”或“food” |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,‘[abc]’可以匹配“plain”中的‘a’ |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,‘[^abc]’可以匹配“plain”中的‘p’ |
[a-z] | 匹配指定范围内的任意字符。例如,‘[a-z]’可以匹配'a'到'z'范围内的任意小写字母字符 |
[^a-z] | 匹配不在指定范围内的任意字符。例如,‘[^a-z]’可以匹配不在‘a’~‘z’'内的任意字符 |
\B | 匹配非单词边界 |
\D | 匹配一个非数字字符,等价于 [^0-9] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK |
\W | 匹配任何非单词字符。等价于‘[^A-Za-z0-9_]’ |
除了邮箱的正则表达式以外,还有一些常用的正则表达式,如下表所示。
编号 | 正则表达式 | 作用 |
---|---|---|
1 | \d{15}|\d{18} | 验证身份证号码(15位或18位) |
2 | \d{3}-\d{8}|\d{4}-\d{7} | 验证国内的固定电话(区号有3位或4位,并在区号和电话号码之 间加上-) |
3 | ^[1-9]\d*$ | 验证字符串中都是正整数 |
4 | ^-[1-9]\d*$ | 验证字符串中都是负整数 |
5 | ^-?[1-9]\d*$ | 验证字符串中是整数 |
6 | ^[A-Za-z]+$ | 验证字符串中全是字母 |
7 | A[A-Za-z0-9]+$ | 验证字符串由数字和字母构成 |
8 | [\u4e00-\u9fa5] | 匹配字符串中的中文 |
9 | [^\x00-\xff] | 匹配字符串中的双字节字符(包括汉字) |
这方面的具体用法有很多
下表列出了 Regex 类中一些常用的方法:
序号 | 方法 & 描述 |
---|---|
1 |
public bool IsMatch( string input ) 指示 Regex 构造函数中指定的正则表达式是否在指定的输入字符串中找到匹配项。 |
2 |
public bool IsMatch( string input, int startat ) 指示 Regex 构造函数中指定的正则表达式是否在指定的输入字符串中找到匹配项,从字符串中指定的开始位置开始。 |
3 |
public static bool IsMatch( string input, string pattern ) 指示指定的正则表达式是否在指定的输入字符串中找到匹配项。 |
4 |
public MatchCollection Matches( string input ) 在指定的输入字符串中搜索正则表达式的所有匹配项。 |
5 |
public string Replace( string input, string replacement ) 在指定的输入字符串中,把所有匹配正则表达式模式的所有匹配的字符串替换为指定的替换字符串。 |
6 |
public string[] Split( string input ) 把输入字符串分割为子字符串数组,根据在 Regex 构造函数中指定的正则表达式模式定义的位置进行分割。 |
8.0强行转换后变成了7_【自学C#】|| 笔记 12 数据类型转换相关推荐
- 8.0强行转换后变成了7_如何将网页转换为 PDF,保存在本地备用?
2T遇到一个问题,一些网页上的资料 ,需要离线保存下来备用,但各类剪藏工具又不能很完整的抓取完整网页,于是想起能不能转换为 PDF 保存. 注意,这是2T搜索了大概7-8款在线工具之后,挑选了一款各方 ...
- 8.0强行转换后变成了7_干货|从中式英语,到雅思听力8.0,外研社英语演讲省一,非英专的她做了这些...
Hi,这是2020年Adrian写给你的第3篇推送, 最近好吗? 之前一直给大家写故事,那今天我们 说点英语听力和口语的学习干货, 送点小福利(在文末)吧- 「温馨提示」本文干货满满! 全文阅读时间约 ...
- 8.0强行转换后变成了7_【建筑通】钻孔灌注桩后注浆施工工艺介绍
建筑通传媒 ID:jianzhutong001 钻孔灌注桩后注浆技术介绍 随着我国高层建筑的大规模开发以及城市环境保护要求的日益提高,采用钻孔灌注桩作为工程桩的建设项目日益增多.钻孔灌注桩具有适用于不 ...
- 8.0强行转换后变成了7_爱剪辑:如何把竖屏视频变成横屏
手机竖屏拍摄的视频,通常是以竖拍模式手持手机拍摄视频引起的.在转移到电脑进行后期剪辑,或分享到高清视频网站时,这种模式则需要进行转换,将竖屏拍摄的视频转成横屏. 本篇教程即教爱粉们竖屏转横屏,两步达成 ...
- 8.0强行转换后变成了7_斗罗大陆:唐三将神位转换为修罗神,水神直言这感觉让她很爽!...
斗罗大陆:唐三将神位转换为修罗神,水神直言这感觉让她很爽! 哈喽,喜欢斗罗大陆的各位观众朋友们大家好,我们都知道唐三拥有两个神位,而其中修罗神这个神位也是上一代修罗神强行赋予他的,对于这一点唐三也是被 ...
- 8.0强行转换后变成了7_血糖7至8正常吗?控制标准不能一概而论,看你的血糖应该在多少...
有统计表明: 并发心血管疾病和卒中的危险--高出普通人群到2-4倍:糖尿病患者冠心病的死亡风险比非糖尿病人群高3倍-5倍:血糖达标率不足33% 并发心血管疾病和卒中的危险--高出普通人群到2-4倍 糖 ...
- 8.0强行转换后变成了7_如何在服务器上安装SSL证书,让你的网站变成https
本文适合任何人了解,图形化操作.下面以腾讯云为例,并且服务器(linux)也安装了宝塔面板. 1.登陆腾讯云账号进入控制台,找到SSL的产品 2.按要求申请并填写表单,记住私钥密码 3.提交后,待腾讯 ...
- 8.0强行转换后变成了7_孩子注意力不集中的7种表现,超过3个以上,家长要及时纠正...
原标题:孩子注意力不集中的7种表现,超过3个以上,家长要及时纠正 对于许多家长来说,上班都比辅导作业轻松,孩子总能被各种事情,玩具,或好吃的吸引,很少专注做一件事. 一会儿玩橡皮,一会儿吃铅笔,一会儿 ...
- 8.0强行转换后变成了7_DCDC电源转换器应用FHP8N60型号,可替代FQP8N60参数的国外场效应管!...
点击蓝字关注我们 在全球化形式都变得朴素迷离的情况下,企业的命运不可能听天由命.尤其是在国内半导体行业发展趋势一片大好下,电源转化器厂家如何把自家产的DC-DC电源转化器中的MOS管国产化是一个很重要 ...
最新文章
- c语言中volatile关键字的作用
- java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?
- 手持gps坐标转换参数求解方法及在excel中的实现_分享∣Arcgis中62个常用技巧系列二(21-40技巧)...
- TypeScript 2.1发布
- Java案例:简易记事本
- jQuery 第八课 —— 数据交互的升级
- PowerBuilder 开发的游戏(建房子)
- java 群发邮件_java群发邮件
- eclipse出现the user operation is waitting for background work to complete异常
- 【经验】面对感冒引起的发烧怎么办,总结一些有用的经验
- linux yum仓库命令,linux 自定义yum仓库、repo文件 yum命令
- Flyme将在明年“上车”?沈子瑜接棒魅族董事长后称将与华为展开竞争
- Netron 可视化
- php站长统计,PHP统计各大引擎蜘蛛爬行访问记录插件
- 办理公司经营贷款需要什么条件呢?-民兴商学院
- 普通心理学-彭聃龄版笔记(转贴)
- 读书笔记---推荐系统实践(3)
- 严重 [http-nio-8080-exec-1] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet[jsp]的Servlet
- 洛谷 P1016 旅行家的预算
- 一个 ABAP 开发的新浪微博语义情感分析工具
热门文章
- VS 默认开发环境如何更改
- 三层架构下实现用户登陆C#
- Android ImageView的ScaleType属性
- Android高手进阶教程(八)之----Android Widget开发案例(世界杯倒计时!)
- js解决异步的方法汇总
- 【python3】 抓取异常信息try/except
- Android webview 写入cookie的解决方法以及一些属性设置
- 用枚举来处理java自定义异常
- MongoDB排序异常
- CompletableFuture CompletableFuture.supplyAsync 异常处理