C#值类型赋值与引⽤类型的赋值
C#编程中,⼤家会经常使⽤到不同的数据类型,那么C#编程语⾔到底有什么类型呢?具体如下:
1.1 值类型
各种值类型总是含有相应该类型的⼀个值。C#迫使你初始化变量才能使⽤它们进⾏计算-变量没有初始化不会出问题,因为当你企图使⽤它们时,编译器会告诉你。每当把⼀个值赋给⼀个值类型时,该值实际上被拷贝了。相⽐,对于引⽤类型,仅是引⽤被拷贝了,⽽实际的值仍然保留在相同的内存位置,但现在有两个对象指向了它(引⽤它)。C#的值类型可以归类如下:
简单类型(Simple types )
结构类型(struct types)
枚举类型(Enumeration types)
1.1.1 简单类型
在C#中出现的简单类型共享⼀些特性。第⼀,它们都是.NET系统类型的别名。第⼆,由简单类型组成的
常量表达式仅在编译时⽽不是运⾏时受检测。最后,简单类型可以按字⾯被初始化。以下为C#简单类型归类:
整型
布尔型
字符型 (整型的⼀种特殊情况)
浮点型
⼩数型
1.1.1.1 整型
C#中有9个整型。 sbyte 、byte、 short、 ushort、 int、 uint、 long、 ulong 和 char(单独⼀节讨论)。它们具有以下特性:
sbyte型为有符号8位整数,取值范围在128~127之间。
bytet型为⽆符号16位整数,取值范围在0~255之间。
short型为有符号16位整数,取值范围在-32,768~32,767之间。
ushort型为⽆符号16位整数,取值范围在0~65,535之间。
int型为有符号32位整数,取值范围在-2,147,483,648~ 2,147,483,647之间。
uint型为⽆符号32位整数,取值范围在 0 ~ 4,294,967,295之间。
long型为64位有符号整数,取值范围在9,223,372,036,854,775,808~ 9,223,372,036,854,775,807之间。
ulong型为64位⽆符号整数,取值范围在0 ~ 18,446,744,073,709,551,615之间。
VB和C程序员都可能会对int和long数据类型所代表的新范围感到惊讶。和其它的编程语⾔相⽐,在C#中,int不再取决于⼀个机器的字(word)的⼤⼩,⽽long被设成64位。
1.1.1.2 布尔型
布尔数据类型有true和false两个布尔值。可以赋于true或false值给⼀个布尔变量,或可以赋于⼀个表达式,其所求出的值等于两者之⼀:
bool bTest = (80 > 90);
与C和C++相⽐,在C#中,true值不再为任何⾮零值。不要为了增加⽅便⽽把其它整型转换成布尔型。
1.1.1.3 字符型
字符型为⼀个单Unicode 字符。⼀个Unicode字符16位长,它可以⽤来表⽰世界上多种语⾔。可以按以下⽅法给⼀个字符变量赋值:
char chSomeChar = 'A';
除此之外,可以通过⼗六进制转义符(前缀\x)或Unicode表⽰法给变量赋值(前缀\u):
char chSomeChar = '\x0065';
char chSomeChar = '\u0065';
不存在把char转换成其它数据类型的隐式转换。这就意味着,在C#中把⼀个字符变量当作另外的整数数据类型看待是⾏不通的——这是C程序员必须改变习惯的另⼀个⽅⾯。但是,可以运⽤显式转换:
char chSomeChar = (char)65;
int nSomeInt = (int)'A';
在C中仍然存在着转义符(字符含义)。要换换脑筋,请看表4.1。
Table 4.1 转义符( Escape Sequences)
转义符字符名
\' 单引号
\" 双引号
\\ 反斜杠
\0 空字符
\a 感叹号(Alert )
\b 退格
\f 换页
\n 新⾏
\r 回车
\t ⽔平 tab
\v 垂直tab
1.1.1.4 浮点型
两种数据类型被当作浮点型:float和double。它们的差别在于取值范围和精度:
float: 取值范围在 1.5x10^-45~ 3.4x10^38之间,精度为7位数。
double: 取值范围在 5.0x10^-324 ~ 1.7x10^308之间,精度为 15~16 位数。
当⽤两种浮点型执⾏运算时,可以产⽣以下的值:
正零和负零
正⽆穷和负⽆穷
⾮数字值(Not-a-Number,缩写NaN)
⾮零值的有限数集
另⼀个运算规则为,当表达式中的⼀个值是浮点型时,所有其它的类型都要被转换成浮点型才能执⾏运算。
1.1.1.5 ⼩数型(The decimal Type)
⼩数型是⼀种⾼精度、128位数据类型,它打算⽤于⾦融和货币的计算。它所表⽰的范围从⼤约1.0x10^-28 到 7.9x10^28,具有28⾄29位有效数字。要注意,精度是以位数 (digits)⽽不是以⼩数位(decimal places)表⽰。运算准确到28个⼩数位的最⼤值。
正如你所看到的,它的取值范围⽐double的还窄,但它更精确。因此,没有decimal和double之间的隐式转换——往⼀个⽅向转换可能会溢出,往另外⼀个⽅向可能会丢失精度。你不得不运⽤显式转换。
当定义⼀个变量并赋值给它时,使⽤ m 后缀以表明它是⼀个⼩数型:
decimal decMyValue = 1.0m;
如果省略了m,在变量被赋值之前,它将被编译器认作double型。
1.1.2 结构类型
⼀个结构类型可以声明构造函数、常数、字段、⽅法、属性、索引、操作符和嵌套类型。尽管列出来的功能看起来象⼀个成熟的类,但在C#中,结构和类的区别在于结构是⼀个值类型,⽽类是⼀个引⽤类型。与C++相⽐,这⾥可以⽤结构关键字定义⼀个类。
使⽤结构的主要思想是⽤于创建⼩型的对象,如Point和FileInfo等等。你可以节省内存,因为没有如类对象所需的那样有额外的引⽤产⽣。例如,当声明含有成千上万个对象的数组时,这会引起极⼤的差异。
清单4.1 包含⼀个命名为IP的简单结构,它表⽰⼀个使⽤byte类型的4个字段的IP地址。我不包括⽅法等,因为这些⼯作正如使⽤类⼀样,将在下⼀章有详细的描述。
清单1.1 定义⼀个简单的结构
using System;
struct IP
{
public byte b1,b2,b3,b4;
}
class Test
decimal是整数数据类型{
public static void Main()
{
IP myIP;
myIP.b1 = 192;
myIP.b2 = 168;
myIP.b3 = 1;
myIP.b4 = 101;
Console.Write("{0}.{1}.",myIP.b1,myIP.b2);
Console.Write("{0}.{1}",myIP.b3,myIP.b4);
}
}
1.1.3 枚举类型
当你想声明⼀个由⼀指定常量集合组成的独特类型时,枚举类型正是你要寻觅的。最简单的形式,它看起来可能象这样:
enum MonthNames { January, February, March, April };
因我惯⽤缺省设置,故枚举元素是int型,且第⼀个元素为0值。每⼀个连续的元素按1递增。如果你想给第⼀个元素直接赋值,可以如下把它设成1:
enum MonthNames { January=1, February, March, April };
如果你想赋任意值给每个元素——甚⾄相同的值——这也没有问题:
enum MonthNames { January=31, February=28, March=31, April=30 };
最后的选择是不同于int的数据类型。可以在⼀条语句中按如此赋值:
enum MonthNames : byte { January=31, February=28, March=31, April=3
0 };
你可以使⽤的类型仅限于long、int、short和byte。
1.2 引⽤类型
和值类型相⽐,引⽤类型不存储它们所代表的实际数据,但它们存储实际数据的引⽤。在C#中提供以下引⽤类型给你使⽤:对象类型
类类型
接⼝
代表元
字符串类型
数组
1.2.1 对象类型
对象类型是所有类型之母——它是其它类型最根本的基类。因为它是所有对象的基类,所以可把任何类型的值赋给它。例如,⼀个整型:
object theObj = 123;
给所有的C++程序员⼀个警告:object并不等价于你可能正在寻的void*。⽆论如何,忘掉指针总是个好主意。
当⼀个值类型被加框(作为⼀个对象利⽤)时,对象类型就被使⽤了。这⼀章稍后会讨论到加框和消框
1.2.2 类类型
⼀个类类型可以包含数据成员、函数成员和嵌套类型。数据成员是常量、字段和事件。函数成员包括⽅法、属性、索引、操作符、构造函数和析构函数。类和结构的功能是⾮常相似的,但正如前⾯所述,结构是值类型⽽类是引⽤类型。
希望对你有帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论