c#中的数据类型简介
一、C#中的变量和常量
C#中用于定义常量的方式有两种一个使用const关键字,一个是用readonly关键字。使用const定义的常量叫静态常量(compile-time constant),用readonly定义的常量叫动态常量(runtime constant)。常量定义 public const float PI=3.14159f; 常量PI对于所有的类对象而言都是一致的,要访问该字段可以直接用格式:类.PI进行取值,不需要实例化,类似于一个类的静态字段。而动态常量的定义为 public readonly float NUM,变量NUM可以看做一个动态的常量,可以在类的定义字段赋值或者在类的构造函数函数中赋值。比如可以定义:public readonly float NUM = 20.2F。
来看下面的例子
class Program
{
static void Main(string[] args)
{
float pi = Constant.PI; //通过类型取值,和静态变量类似,但是常量是readonly的,不能赋值
float r = 10.2f;
float D = * pi * r;
Console.WriteLine(D);
Constant constant = new Constant();
Console.WriteLine( constant.NUM); //通过实例取值,NUM在构造函数中定义的
Console.WriteLine(constant.NUM1); //通过实例取值,NUM1是在字段的定义的
Console.Read();
}
} class Constant
{
public const float PI = 3.1415926F;
public readonly int NUM1 = ;
public readonly int NUM;
public Constant()
{
NUM = ;
}
}
二、c#变量数据类型
变量的数据类型包括预定义的数据类型和自定义的数据类型,自定义的数据类型包括数组、枚举、结构和类,而预定义的数据类型如下表所示:
类型 |
描述 |
范围/精度 |
例子 |
||
object |
所有其它类型的最根本的基础类型 |
object o = null; |
|||
string |
字符串类型,一个字符串是一个Unicode字符序列 |
string s= "Hello"; |
|||
sbyte |
8-bit 有符号整数类型 |
–128...127 |
sbyte val = 12; |
||
short |
16-bit有符号整数类型 |
–32,768...32,767 |
short val = 12; |
||
int |
32-bit有符号整数类型 |
–2,147,483,648...2,147,483,647 |
int val = 12; |
||
long |
64-bit有符号整数类型 |
–9,223,372,036,854,775,808 ...9,223,372,036,854,775,807 |
long val1 = 12; long val2 = 34L; |
||
byte |
8-bit无符号整数类型 |
0...255 |
byte val1 = 12; byte val2 = 34U; |
||
ushort |
16-bit无符号整数类型 |
0...65,535 |
ushort val1 = 12; ushort val2 = 34U; |
||
uint |
32-bit无符号整数类型 |
0...4,294,967,295 |
uint val1 = 12; uint val2 = 34U; |
||
ulong |
64-bit无符号整数类型 |
0...18,446,744,073,709,551,615 |
ulong val1 = 12; ulong val2 = 34U; ulong val3 = 56L; ulong val4 = 78UL; |
||
float |
单精度浮点数类型 |
1.5 × 10−45 至 3.4 × 1038,7 位精度 |
float val = 1.23F; |
||
double |
双精度浮点数类型 |
5.0 × 10−324 至 1.7 × 10308,15 位精度 |
double val1 = 1.23; double val2 = 4.56D; |
||
bool |
布尔类型类型; 一个布尔类型数据不是真就是假 |
true,false |
bool val1 = true; bool val2 = false; |
||
char |
字符类型; 一个字符数据是一个Unicode字符 |
char val = 'h'; |
|||
decimal |
精确十进制类型,有28个有效位 |
1.0 × 10−28 至 7.9 × 1028,28 位精度 |
decimal val = 1.23M; |
下面程序对数据类型的长度作一个小测试,a,b为整形,c为长整形,d为字符型,e为byte,f为整形。获取整数a 在堆栈中的地址 p =&a,同样可以获取b,c ,d,e,f的地址&b,&c,&d,&e,&f。
class Program
{
unsafe static void Main(string[] args)
{
int a = ;
int b = ;
long c = ;
char d = 'b';
byte e = ;
int f = ;
int* p = &a; //获取整数a的地址
Console.WriteLine((int)&a);
Console.WriteLine((int)&b);
Console.WriteLine((int)&c);
Console.WriteLine((int)&d);
Console.WriteLine((int)&e);
Console.WriteLine((int)&f);
//获取a地址之下一个地址的值(32位),也即是b的地址
Console.WriteLine(*(p - ));
//获取c的地址,因为c是long类型所以需p-3
Console.WriteLine(*(p - ));
//获取d的地址,'b'的ASCII码是98
Console.WriteLine(*(p - ));
Console.WriteLine(sizeof(sbyte));
Console.WriteLine(sizeof(long));
Console.ReadKey();
}
}
数据a,b,c,d,e,f分别压入栈中,从图中可以看出他们在内存中的地址,用&a-&b就可算出b的数据长度。c为long占8个字节,其高位的4字节地址中的数据为0,其低位4字节地址中的数为1200,d虽然只占用2个字节,但在类存分配中已4字节为最小单元的情况下(对32位版本而言)还是分配了4个字节,同理内存为e分配了4个字节,实际上它只用了1个字节。
下面,我重点介绍一下其中的几种预定义的数据类型:
float数据类型
float类型数据的位构成:
1bit(符号位) |
8bits(指数位) |
23bits(尾数位) |
Float表示一个有32位的浮点数,其中第一位为符号位,后面8位为幂指数,再其后23位为尾数部分。幂指数的范围为(2-127-2128),表示的数据范围为-3.40E+38 ~ +3.40E+38。而尾数为223=8388608,意味着最多可以有七位的有效位,所以表示float的精度为7位。
可以根据系统自动获取数据范围
float f = float.maxvalue;
float f = float.minvalue;
double类型
double数据类型的位构成:
1bit(符号位) |
11bits(指数位) |
52bits(尾数位) |
Double表示一个64位的双精度数,其中第一位为符号位,后面11位为指数为,再其后为52位尾数部分。指数的范围为(2-1023-21024),表示的数据范围为-1.79E+308 ~ +1.79E+308,尾数为252 = 4503599627370496,意味着最多可以有十六位的有效位,所以表示double的精度为16位。
所以说浮点数的精度由尾数的位数决定,而范围由指数的位数决定。
Bool result = Float.IsNaN(0/0f) ;
判断result的结果是否为一个数字 NaN ( not a number)
Bool result = Float.IsInfinity(10.2f/0f); //判断是否为无穷大
Bool result = Float.IsNegativeInfinity(-20.0f/0); //判断是否为负无穷大
Bool result = Float.IsPositiveInfinity(20.0f/0); //判断是否为正无穷大
Int数据类型
Int 赋值
long l = 200;
int i = l; //直接赋值,系统排出错误,因为l的取值范围要大于i的取值范围,所以需要显示的类型转换
int I = (int)l;
short s= 200;
int I = s; //直接赋值不会出错,系统可以将short类型的s转化为l,
因此将一个取值范围大的数据类型转化为一个取值范围较小的数据类型需要显式地转化,相反讲一个范围较小的数据类型转化为一个取值范围较大的数据系统可以隐式的进行转化。
获取Int数据类型的最大最小值
Int.maxvalue;
Int.minvalue;
Int.parse(“200”)数据转换,将字符串参数转化为整数,但是此种方式不是一种安全的数据转化方式。
如:int.parse(“12x”),系统肯定出错,因为不能成功将字符串"12x"转化为一个整数,在系统运行的时候一定会抛出Exception;但是Int还提供一种安全的转化方式,可以使用Int.tryparse(“sf”,out i)判断转化是否成功,如"sf"不能转化为一个整数,对于不成功的情况我们可以作出相应的处理。
来看下面的例子:
class Program {
static void Main(string[] args)
{
int result;
Console.WriteLine("请输入整数");
string inStr = Console.ReadLine();
if (int.TryParse(inStr, out result))
Console.WriteLine("输入的是整数:{0}", result);
else
MessageBox.Show("输入的不是整数!","出错");
Console.Read();
}
}
可以用checked进行溢出校验,也可用unchecked不进行溢出校验,默认情况是不进行校验。
Checked可以用checked函数和checked语句
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入第一个整数");
int n1 = int.Parse(Console.ReadLine());
Console.WriteLine("请输入第二个整数");
int n2 = int.Parse(Console.ReadLine());
int mut = multiply(n1,n2);
Console.Read();
} static int multiply(int x,int y)
{
int p=;
try
{
//此处也可用 p = checked(x*y);
checked
{
p = (x * y);
}
Console.Write(p);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return p;
}
}
Decimal数据类型
Decimal的运算精度很高,可提供如下的算数运算方法:
相加运算 Decimal.Add(decimal d1,decimal d2);
相减运算 Decimal.Subtract(decimal d1,decimal d2);
相乘运算 Decimal.Multiply(decimal d1,decimal d2);
相除运算 Decimal.Divide(decimal d1,decimal d2);
余数运算 Decimal.Remainder(decimal d1,decimal d2)
舍入运算 Decimal.Round(decimal d);
取整运算 Decimal.Truncate(decimal d);
可提供如下的比较运算
Decimal.compare(decimal d1,decimal d2);
Decimal.equals(decimal d1,decimal d2);
Decimal.referenceEquals(decimal d1,decimal d2);
可提供如下的类型转化运算
转化为16位整数 Decimal.toInt16;
转化为32位整数 Decimal.toInt32;
转化为64位整数 Decimal.toInt64;
如果decimal数据类型所提供的方法不够还可以使用自定义的扩展方法,如下例子所示为decimal数据类型扩展一个Power方法(求数据的次方运算):
static class DecExt
{
public static decimal Power(this decimal baseNum, int p)
{
decimal result = 1.0M;
for (int i = ; i < p; i++)
{
result *= baseNum;
}
return result;
}
}
class Program
{
static void Main(string[] args)
{
decimal base1 = 12.2M;
decimal x = base1.Power(); // 对base1的2次方运算
Console.WriteLine(x);
Console.Read();
}
}
Char字符类型
Char的常用的静态方法,用来判断某位的字符类型
String pattern = “123abcde”;
Char.IsLetter(pattern,2);
Char.IsNumber(pattern,2);
Char.IsLower(pattern,3);
Char.IsUpper(pattern,3);
Char.IsPunctuation(pattern,3);
Char.IsLetterOrDigit(pattern,3);
(下一节介绍string数据类型)
c#中的数据类型简介的更多相关文章
- c#中的数据类型简介(委托)
c#中的数据类型简介(委托) 什么是委托? 委托是一种类型,它封装了一类方法,这些方法具有相同的方法签名(signature).定义听起来有点拗口,首先可以确定委托是一种数据类型,那么什么是方法签名, ...
- c#中的数据类型简介(数组)
c#中的数据类型简介(数组) 数组定义 可以将数组看成相同数据类型的一组或多组数据,包括一维数组,多维数组和交错数组. 数值数组元素的默认值设置为零,而引用元素的默认值设置为 null. 交错数组是指 ...
- c#中的数据类型简介(枚举)
C#中的数据类型简介(枚举) 枚举的定义 根据MSDN上给出的定义,枚举是一个指定的常数集,其基础类型可以是除Char外的任何整型. 如果没有显式声明基础类型,则使用 Int32. Enum 是 .N ...
- c#中的数据类型简介(string)
Sting 字符串 引入话题 字符串是一个引用类型,从string数据类型的代码定义中也可以看出它实现了IEnumerable<char>接口和IEnumerable接口,因此字符串可以看 ...
- c#中的数据类型简介(委托)
什么是委托? 委托是一种类型,它封装了一类方法,这些方法具有相同的方法签名(signature)和返回类型.定义听起来有点拗口,首先可以确定委托是一种数据类型,那么什么是方法签名,其实就是指方法的输入 ...
- Oracle中PL/SQL简介、基本语法以及数据类型
Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控 ...
- c++中的数据类型
1.数据类型简介 c++中数据类型分为两种:预定义类型和自定义数据类型. 预定义类型:整型(int 4个字节) 字符型 布尔型 (bool) 浮点型(4个字节) 空类型:关键字void,不能用于普通变 ...
- redis中各种数据类型对应的jedis操作命令
redis中各种数据类型对应的jedis操作命令 一.常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 ...
- Redis API与常用数据类型简介
Redis API与常用数据类型简介 一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些 ...
随机推荐
- onvif规范的实现:成功实现ONVIF协议RTSP-Video-Stream与OnvifDeviceManager的视频对接
有了前几篇的基础,现在可以正式开始onvif的实现工作,其中一项非常重要的部分就是视频流的对接,即能够在符合onvif标准的监控客户端软件里接收到设备端NVT发来的RTSP视频流.这里,我所用的客户端 ...
- 使用一个HttpModule拦截Http请求,来检测页面刷新(F5或正常的请求)
在Web Application中,有个问题就是:“我怎么来判断一个http请求到底是通过按F5刷新的请求还是正常的提交请求?” 相信了解ASP.NET的人知道我在说什么,会有同感,而且这其实不是一个 ...
- 图文讲解基于centos虚拟机的Hadoop集群安装,并且使用Mahout实现贝叶斯分类实例 (7)
接下来,我们开启hadoop集群. 如果之前打开过Hadoop,可能会发生lock的问题,解决方案:http://blog.csdn.net/caoshichaocaoshichao/article/ ...
- Android studio教程:[3]修改背景主题
android studio开发环境的背景主题是可以更改的,现在都流行黑色背景,这样让软件显得更高端大气的,更加赏心悦目,但最主要的还是看起来更舒适更顺眼.下面就教大家如何更改背景主题. 工具/原料 ...
- ios9基础知识(技能篇)
NSFileManager.NSURL.NSFileHandle.NSData.NSXMLParser.NSUserDefaults.NSKeyedArchiver.NSKeyedUnarchiver ...
- UIImageView~动画播放的内存优化
我目前学到的知识,播放动画的步骤就是下面的几个步骤,把照片资源放到数组里面,通过动画animationImage加载数组,设置动画播放的 时间和次数完成播放. 后来通过看一些视频了解到:当需要播放多个 ...
- Centos7安装JDK
以下是gz包方式: 1,将jdk-8u51-linux-x64.tar.gz放到/usr/java目录下 2,用tar -zxvf jdk-8u51-linux-x64.tar.gz 解压到当前目录 ...
- Android 贝塞尔曲线
博客图片备份位置:
- 变态最大值--nyoj题目811
变态最大值 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这么烂,幸好在他的帮助下大家算是解 ...
- ZOJ问题--hdu3788
ZOJ问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...