|
(C#) “神奇”的String (1) 2005-7-27 Allen Lee 1 在任何语言中,String都无疑是非常特殊的一种数据类型。C#中也是如此。 string是System.String的alias。 alias用using声明,用法如下 using [alias = ]class_or_namespace; 2 string是个独特的基本数据类型,它是基本数据类型中唯一的引用类型。作为基本数据类型,字符串可以声明为常量,但是却放在堆中。 字符串是唯一具有可变长度的基本数据类型 3 .NET Framework的String类型是不可变的。 不可改变的一个优点是它是线程安全的。 如果系统在编译时知道一个字符串中的字符是什么,就会内置这个字符串。被内置的字符串可以是一个常量,也可以不是。 把String定义为不可改变,它的表现像一个值类型,但实际上仍然是引用类型。 时刻记住的一点是: 任何对String的修改都会创建一个新String对象。 比如String.Replace(), String.ToLower()等待。 Const是初始化字符串最有效的方法,因为它涉及的IL指令最少。 4 String虽然是reference类型,但其分配却可以不使用new表达式,String object的初始化可采用“适用于value型别”的语法。如: string str = "TestString"; 此外: C# Primer 中文版(Stanley B. Lippman, 侯捷/陈硕合译)中有这样一句:“如果声明的是Local array,有一个简短表示法可以使我们不必再明确调用new表达式。” 虽然我对Local array的确切定义不甚了解,但对于接下来的用法还是比较熟悉的。 string[] m_message = { "Hi, Please enter your name: ", "Oops, Invalid name, Please try again: ", // 此处的","用不用都可 } 5 String虽然是reference类型,但是operators (== and !=) 却定义为比较二者的值,而不是引用。 一个来自MSDN上的例子。 string a = "hello"; string b = "h"; b += "ello"; // append to b Console.WriteLine( a == b ); // output: True -- same value Console.WriteLine( (object)a == b ); // False -- different objects 6 String是reference类型没有错,但我试了以下代码后却让我感觉到String的特殊。 class Class1 { static void Main(string[] args) { Class1 c = new Class1(); string str = "123"; c.Change(str); Console.WriteLine(str); } private void Change(string s) { s = "456"; } } 结果却是: 123 做了小改动之后: class Class1 { static void Main(string[] args) { Class1 c = new Class1(); string str = "123"; c.Change(ref str); // 加上ref关键字 Console.WriteLine(str); Console.Read(); } private void Change(ref string s) // 加上ref关键字 { s = "456"; } } 输出结果是: 456 7 今天暂时写到这里,可能有疏漏之处,望讨论指正。 Allen Lee E-mail : alan_lz@126.com QQ: 277523957 Created : 2005-7-27
|