《影》

XMSHADOW'S BLOG
C#2.0学习随笔。

常量具有如下特征:

●       常量必须在声明时初始化。指定了其值后,就不能再修改了。

●       常量的值必须能在编译时用于计算。因此,不能用从一个变量中提取的值来初始化常量。如果需要这么做,应使用只读字段(详见第3章)。

●       常量总是静态的。但注意,不必(实际上,是不允许)在常量声明中包含修饰符static。

在程序中使用常量至少有3个好处:

●       常量用易于理解的清楚的名称替代了含义不明确的数字或字符串,使程序更易于阅读。

●       常量使程序更易于修改。例如,在C#程序中有一个SalesTax常量,该常量的值为6%。如果以后销售税率发生变化,把新值赋给这个常量,就可以修改所有的税款计算结果,而不必查找整个程序,修改税率为0.06的每个项。

●       常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,而该常量已经有了一个值,编译器就会报告错误。

C#认可的基本预定义类型并没有内置于语言中,而是内置于.NET Framework中。例如,在C#中声明一个int类型的数据时,声明的实际上是.NET结构System.Int32的一个实例。这听起来似乎很深奥,但其意义深远:这表示在语法上,可以把所有的基本数据类型看作是支持某些方法的类。例如,要把int i转换为string,可以编写下面的代码:string s = i.ToString();

名    称

CTS 类 型

说    明

范    围

sbyte

System.SByte

8位有符号的整数

–128 到 127 (–27到27–1)

short

System.Int16

16位有符号的整数

–32 768 到 32 767 (–215到215–1)

int

System.Int32

32位有符号的整数

–2 147 483 648 到 2 147 483 647(–231到231–1)

long

System.Int64

64位有符号的整数

–9 223 372 036 854 775 808到9 223 372 036 854 775 807(–263到263–1)

byte

System.Byte

8位无符号的整数

0到255(0到28–1)

ushort

System.Uint16

16位无符号的整数

0到65535(0到216–1)

uint

System.Uint32

32位无符号的整数

0到4 294 967 295(0到232–1)

ulong

System.Uint64

64位无符号的整数

0到18 446 744 073 709 551 615(0到264–1)



C#string关键字,在翻译为.NET类时,它就是System.String。有了它,像字符串连接和字符串复制这样的操作就很简单了:

string str1 = "Hello ";

string str2 = "World";

string str3 = str1 + str2; // string concatenation

尽管这是一个值类型的赋值,但string是一个引用类型。String对象保留在堆上,而不是堆栈上。因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用。但是,string与引用类型在常见的操作上有一些区别。例如,修改其中一个字符串,就会创建一个全新的string对象,而另一个字符串没有改变。考虑下面的代码:

using System;

 

class StringExample

{

   public static int Main()

   {

      string s1 = "a string";

      string s2 = s1;

      Console.WriteLine("s1 is " + s1);

      Console.WriteLine("s2 is " + s2);

      s1 = "another string";

      Console.WriteLine("s1 is now " + s1);

      Console.WriteLine("s2 is now " + s2);

      return 0;

   }

}

其输出结果为:

s1 is a string

s2 is a string

s1 is now another string

s2 is now a string

换言之,改变s1的值对s2没有影响,这与我们期待的引用类型正好相反。当用值"a string"初始化s1时,就在堆上分配了一个string对象。在初始化s2时,引用也指向这个对象,所以s2的值也是"a string"。但是现在要改变s1的值,而不是替换原来的值时,堆上就会为新值分配一个新对象。s2变量仍指向原来的对象,所以它的值没有改变。这实际上是运算符重载的结果,运算符重载详见第5章。基本上,string类实现为其语义遵循一般的、直观的字符串规则。

posted on 2006-10-31 21:10    阅读(215)  评论(0)    收藏  举报