-
c#教程值的类型
1.整型
有符号整形和字节型是属于“通用语言认证系统”(CLS)的。而无符号整形不属于CLS。
你可以使用原始的类型关键字(如int)或与之对应的别名(如System.Int32),这两种方法都是可行的。但唯一例外的情况是:当你把类型名作为.net framework函数实参的时候,你只能使用System.Int32,而不能使用int。例如,你必须这样调用:Type.GetType("System.Int32"),而Type.GetType("int")语句是错误的。这是因为int只是C#中的关键字,而.net framework函数是设计成在所有的.net语言中都通用的。必须注意的是byte在C#中是无符号的。
注意:byte和sbyt只有8位,因此它们不能作为数组的元素,因为数组元素的最小尺寸是16位(2字节)。
2.c#教程基本操作符
基本操作符具有最高的优先级。
new只能在调用构造函数的时候使用,并且不能被用来重载。使用new来调用结构的构造函数会在栈(stack)中分配内存,而用new来调用类的构造函数会在堆(heap)中分配内存。在C#中,结构是值类型的,类是引用类型的。
sizeof返回类或一个表达式的尺寸,但它只能用在标识为unsafe的代码块中。
checked和unchecked操作符用来控制是否检查算术运算溢出。
3. 操作符的优先级别
所有的一元操作符都可以重载。
乘和除、加和减、移位、关系(is as 例外)、相等和位操作可以重载。
&&和||只能使用true/false转换操作符时才可以重载。
?:和=不能重载。
复合赋值操作符(如*= /=)可以重载。
4.连接
规则1
除了赋值操作符外的其他二元操作符都是左连接的。
x+y+z 应理解为 (x+y)+z
规则2
赋值操作符和?: 操作符是右连接的。
x=y=z 应理解为 x=(y=z)
x+=y+=z 应理解为 x+=(y+=z)
a?b:c?d:e 应理解为 a?b:(c?d:e)
5.计算时的顺序
操作数是严格地从左到右被计算的。
int m = 2;
int answer = ++m * ++m + ++m * ++m;
计算的顺序:
3 * ++m + ++m * ++m
3 * 4 + ++m * ++m
12 + ++m * ++m
12 + 5 * ++m
12 + 5 * 6
12 + 30
42
6.整数溢出
溢出错误
un/checked ( 表达式 )
un/checked{语句 }
int m = ...
Method(checked(m * 2));
m = checked(m * 2);
checked
{
Method(m * 2);
m *= 2;
}
以上的每一句语句都进行溢出错误检查
Method(m * 2);
m *= 2;
以上的每一句语句在用csc /checked+ *.cs编译时,进行溢出错误检查
以上的每一句语句在用csc /checked- *.cs编译时,不进行溢出错误检查
Method(unchecked(m * 2));
m = unchecked(m * 2);
unchecked
{
Method(m * 2);
m *= 2;
}
以上的每一句语句都不进行溢出错误检查
checked(表达式)检查一个表达式的结果是否溢出。它可以用于任何一个表达式,但只只能对整数操作符起作用,因为只有这些操作符才产生溢出。这些操作符是:++, --, -(负号),+ -(减号), * ,/ ,%以及整型之间的显式类型转换符。checked(表达式)的结果也是一个表达式,它可以被用来作为另一个表达式的一部分:
int outcome = checked( ... );
checked{语句}检查一系列的语句结果是否溢出。它不是一个表达式,没有结果。例如,下面有语句会产生错误:
int noOutcome = checked { ... };
(注意:checked(表达式)的括号是园括号,而checked{语句}的括号是花括号)。
unchecked是不检查是否溢出。
7.整数转换
隐式转换,从小到大的转换
不会丢失精度,不会抛出错误
显式转换,从大到小的转换(强制转换)
可能会丢失精度,可能会抛出错误
int m = int.MaxValue;//整数的最大值
short s;
checked { s = (short)m; }//显式转换,会抛出溢出错误
long n;
checked { s = m; }//隐式转换,不会抛出溢出错误
8.类型转换表
上表中,E表示显式转换,I表示隐式转换 。
9.浮点类型
C#默认的浮点类型是double,所以你要使用float型,就必须在数字后面加后缀F或f。
123.F是错误的,因为C#认为这会引起歧义。F究竟是123.这个浮点数的后缀还是123这个int类实例的函数?C#编译器认为这是个错误,因为int类没有F这个方法!
10.浮点数的操作符
移位操作符是不允许的
很大的结果会转为+/- Infinity
无效的操作,结果会转为NaN
只要有一个操作数是NaN,结果就转为NaN
11. 浮点数的转换
c#教程float 转为 double
隐式转换
不会抛出错误
不会抛出错误
不会抛出错误
会损失精度,但不会改变大小
可能会抛出溢出错误
类型 | 位数 | System. | 与CLS兼容? | 有无符号 |
sbyte | 8 | SByte | 否 | 有 |
ushort | 16 | UInt16 | 否 | 无 |
uint | 32 | UInt32 | 否 | 无 |
ulong | 64 | UInt64 | 否 | 无 |
byte | 8 | Byte | 是 | 无 |
short | 16 | Int16 | 是 | 有 |
int | 32 | Int32 | 是 | 有 |
long | 64 | Int64 | 是 | 有 |
你可以使用原始的类型关键字(如int)或与之对应的别名(如System.Int32),这两种方法都是可行的。但唯一例外的情况是:当你把类型名作为.net framework函数实参的时候,你只能使用System.Int32,而不能使用int。例如,你必须这样调用:Type.GetType("System.Int32"),而Type.GetType("int")语句是错误的。这是因为int只是C#中的关键字,而.net framework函数是设计成在所有的.net语言中都通用的。必须注意的是byte在C#中是无符号的。
注意:byte和sbyt只有8位,因此它们不能作为数组的元素,因为数组元素的最小尺寸是16位(2字节)。
2.c#教程基本操作符
括号 | (x) |
访问成员 | x.y |
函数调用 | f(x) |
访问数组(不是元素) | a[x] |
自增 | x++ |
自减 | x-- |
调用构造函数 | new |
获得类名 | typeof |
获得尺寸 | sizeof(不安全的) |
数值检查 | (un)checked |
new只能在调用构造函数的时候使用,并且不能被用来重载。使用new来调用结构的构造函数会在栈(stack)中分配内存,而用new来调用类的构造函数会在堆(heap)中分配内存。在C#中,结构是值类型的,类是引用类型的。
sizeof返回类或一个表达式的尺寸,但它只能用在标识为unsafe的代码块中。
checked和unchecked操作符用来控制是否检查算术运算溢出。
3. 操作符的优先级别
基本操作符 | 见上表 |
一元操作符 | + - ! ~ ++x –-x (T)x |
乘和除 | * / %(取余数) |
加和减 | + - |
移位 | << >> |
关系 | < > <= >= is as |
相等 | == != |
位操作 | & ^ | (注意:左边比右边级别高) |
布尔 | && || ?: (注意:左边比右边级别高) |
赋值 | = *= /= %= += -= ... |
乘和除、加和减、移位、关系(is as 例外)、相等和位操作可以重载。
&&和||只能使用true/false转换操作符时才可以重载。
?:和=不能重载。
复合赋值操作符(如*= /=)可以重载。
4.连接
规则1
除了赋值操作符外的其他二元操作符都是左连接的。
x+y+z 应理解为 (x+y)+z
规则2
赋值操作符和?: 操作符是右连接的。
x=y=z 应理解为 x=(y=z)
x+=y+=z 应理解为 x+=(y+=z)
a?b:c?d:e 应理解为 a?b:(c?d:e)
5.计算时的顺序
操作数是严格地从左到右被计算的。
int m = 2;
int answer = ++m * ++m + ++m * ++m;
计算的顺序:
3 * ++m + ++m * ++m
3 * 4 + ++m * ++m
12 + ++m * ++m
12 + 5 * ++m
12 + 5 * 6
12 + 30
42
6.整数溢出
溢出错误
un/checked ( 表达式 )
un/checked{语句 }
int m = ...
Method(checked(m * 2));
m = checked(m * 2);
checked
{
Method(m * 2);
m *= 2;
}
以上的每一句语句都进行溢出错误检查
Method(m * 2);
m *= 2;
以上的每一句语句在用csc /checked+ *.cs编译时,进行溢出错误检查
以上的每一句语句在用csc /checked- *.cs编译时,不进行溢出错误检查
Method(unchecked(m * 2));
m = unchecked(m * 2);
unchecked
{
Method(m * 2);
m *= 2;
}
以上的每一句语句都不进行溢出错误检查
checked(表达式)检查一个表达式的结果是否溢出。它可以用于任何一个表达式,但只只能对整数操作符起作用,因为只有这些操作符才产生溢出。这些操作符是:++, --, -(负号),+ -(减号), * ,/ ,%以及整型之间的显式类型转换符。checked(表达式)的结果也是一个表达式,它可以被用来作为另一个表达式的一部分:
int outcome = checked( ... );
checked{语句}检查一系列的语句结果是否溢出。它不是一个表达式,没有结果。例如,下面有语句会产生错误:
int noOutcome = checked { ... };
(注意:checked(表达式)的括号是园括号,而checked{语句}的括号是花括号)。
unchecked是不检查是否溢出。
7.整数转换
隐式转换,从小到大的转换
不会丢失精度,不会抛出错误
显式转换,从大到小的转换(强制转换)
可能会丢失精度,可能会抛出错误
int m = int.MaxValue;//整数的最大值
short s;
checked { s = (short)m; }//显式转换,会抛出溢出错误
long n;
checked { s = m; }//隐式转换,不会抛出溢出错误
8.类型转换表
sbyte | short | int | long | byte | ushort | uint | ulong | ||
sbyte | I | I | I | E | E | E | E | ||
short | E | I | I | E | E | E | E | ||
int | E | E | I | E | E | E | E | ||
long | E | E | E | E | E | E | E | ||
byte | E | I | I | I | I | I | I | ||
ushort | E | E | I | I | E | I | I | ||
uint | E | E | E | I | E | E | I | ||
ulong | E | E | E | E | E | E | E |
9.浮点类型
类型 | 位数 | System. | 与CLS兼容? | 后缀 |
float | 32 | Single | 是 | F f |
double | 64 | Double | 是 | D d |
123.F是错误的,因为C#认为这会引起歧义。F究竟是123.这个浮点数的后缀还是123这个int类实例的函数?C#编译器认为这是个错误,因为int类没有F这个方法!
10.浮点数的操作符
- 大部分的操作符和整数的一样
移位操作符是不允许的
- 浮点数运算不会抛出错误
很大的结果会转为+/- Infinity
无效的操作,结果会转为NaN
只要有一个操作数是NaN,结果就转为NaN
11. 浮点数的转换
c#教程float 转为 double
隐式转换
不会抛出错误
- double转为float
不会抛出错误
- 整数 转为 浮点数
不会抛出错误
会损失精度,但不会改变大小
- 浮点数转为整数
可能会抛出溢出错误
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
JavaScript判断两个数组相等的四类方法
js如何操作video标签
React实战--利用甘特图和看板,强化Paas平
【记录】正则替换的偏方
前端下载 Blob 类型整理
抽象语法树AST必知必会
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程