C# 数据类型
C# 数据类型分为: 值类型、引用类型
值类型主要由两类组成:结构、枚举
结构分为以下几类:Numeric(数值)类型(整形 浮点型 decimal)、 bool 、用户自定义结构
引用类型包括: 类 class (Object、String)、代表 delegate、数组 Array、接口 interface
二、值类型
整形
类型 范围 大小
sbyte -128 到 127 有符号 8 位整数
byte 0 到 255 无符号 8 位整数
char U+0000 到 U+ffff 16 位 Unicode 字符
short -32,768 到 32,767 有符号 16 位整数
ushort 0 到 65,535 无符号 16 位整数
int -2,147,483,648 到 2,147,483,647 有符号 32 位整数
uint 0 到 4,294,967,295 无符号 32 位整数
long -9,223,372,036,854,775,808 到
9,223,372,036,854,775,807 有符号 64 位整数
ulong 0 到 18,446,744,073,709,551,615 无符号 64 位整数
浮点型
类型 大致范围 精度
float ±1.5e−45 到 ±3.4e38 7 位
double ±5.0e−324 到 ±1.7e308 15 到 16 位
decimal(十进制)
类型 大致范围 精度 .NET Framework 类型
decimal ±1.0 × 10e−28 至 ±7.9 × 10e28 28 到 29 位有效位 System.Decimal
如果希望实数被视为 decimal 类型,请使用后缀 m 或 M,如果没有后缀 m,数字将被视为 double 类型,例如:decimal myMoney = 300.5m;
布尔类型(bool)
布尔类型就是用来表示“真”和“假”这两个概念的,C# 中用“true”和“false”连个值来表示,其他任何值的表示方法都是错误的。
结构(struct)
把一系列相关的变量组成一个单一实体的过程叫做结构化过程,组成的单一实体就是结构。
例子:
public struct PhoneBook
{
public String name;
public String phone;
public struct address
{
public String city;
public String street;
}
}
PhoneBook p1;
对结构成员的访问可以通过结构变量名加上访问符“.”然后在加上成员名的方式访问,例如,p1.name = "Tom";
枚举(enum)
枚举类型实际是为一组在逻辑上密不可分的整数值提供便于记忆的符号,例如声明一个代表星期的枚举变量类型:
enum WeekDay{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
WeekDay day;
枚举类型的变量在某一时刻只能取枚举中某一个元素的值。
枚举中的第一个元素的值为0,后面的每个元素安加1递增。在枚举中也可以给元素直接赋值,例如把星期天的值设为1,其后的元素的值分别为2,3...
enum WeekDay{Sunday=1,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
为枚举类型的元素所赋的值的类型限于long、int、short和byte等整数类型。
三、引用类型
类: 是一种包含数据成员、函数成员、嵌套类型的数据结构。其中数据成员包括常量、域和事件,函数成员包括方法、属性、索引指示器、运算符、构造函数和析构函数。
Object、String 是两个常用的类。
Object 是所有其他类型的基类,C#中所有类型都直接或间接的从Object
中继承,因此对于一个 Object 的变量可以赋予任何类型的值。
String 类 是专门用于对字符串的操作。
代表: 声明代表时只需要指定代表指向的原型的类型,代表不能有返回值也不能带有输出类型的参数。
代表的示例:
using System;
delegate int MyDelegate();
public class MyClass
{
public int InstanceMethod()
{
Console.WriteLine("Call Instance Method");
return 0;
}
public static int StaticMethod()
{
Console.WriteLine("Call Static Method");
return 0;
}
}
public class Test
{
public static void Main()
{
MyClass p = new MyClass();
MyDelegate d = new MyDelegate(p.InstanceMethod);
d();
d = new MyDelegate(MyClass.StaticMethod);
d();
}
}
输出结果为:
Call Instance Method
Call Static Method
数组: 是一组类型相同的有序数据。数组按照数组名、数据元素类型、数组维数来描述数组。System.Array 类是所有数组元素的基类。C# 中数组元素的下标是从 0 开始的。
数组示例:
int[] arr = new int[5]
int[] arr = new int[]{1,2,3}
int[] arr = new int[5]{1,2,3,4,5}
int[,] arr = new int[2,2];
int[,] arr = new int[2,3]{{1,2,3},{4,5,6}}
装箱:装箱转换是指将一个值类型隐式的转换成 Object 类型,或者把这个值类型转换成一个被该值类型应用的接口类型。
装箱示例:
using System;
public class Test
{
public static void Main()
{
int i = 10;
Object obj = i;
if (obj is int)
{
Console.WriteLine("The Value of i is Boxing!");
}
i = 20;
Console.WriteLine("int i = {0}",i);
Console.WriteLine("object obj = {0}",obj);
}
}
输出结果为:
The Value of i is Boxing!
int i = 20
object obj = 10;
此例不光说明了装箱的操作同时也说明被装箱的类型的值是作为一个拷贝赋给对象的。
拆箱:拆箱转换是指将一个对象类型显示的转换成值类型,或者是将一个接口类型显示的转换成一个执行该接口的值类型。
例如:
int i = 10;
Object obj = i;
int j = (int)obj;
拆箱刚好是装箱的逆过程,拆箱和装箱操作必须遵循类型兼容原则。