|
|
51CTO旗下网站
|
|
移动端

2.2.3 字符串(2)

《C# 6.0本质论(第5版)》第2章数据类型,本章将探讨这些数据类型,更深入地研究字符串类型,并引入数组的概念。本节为大家介绍字符串。

作者:周靖/庞燕 译来源:人民邮电出版社|2017-07-21 16:26

2.2.3 字符串(2)

可以转换成等价的C#语句

  1. object[] args = new object[] { firstName, lastName };  
  2. Console.WriteLine(string.Format("Your full name is {0} {1}.", args)); 

这样做像以前一样为本地化保留了位置支持(尽管仍使用传统的格式字符串),并且避免了通过字符串引入任何后编译代码注入攻击。

3. 字符串方法

与System.Console类型相似,string类型也包含几个方法。可以用这些方法格式化、拼接和比较字符串。

在表2-5中,Format()方法具有与Console.Write()和Console.WriteLine()方法相似的行为。区别在于,string.Format()不是在控制台窗口中显示结果,而是返回结果。当然,增加了字符串插值功能之后,string.Format()的重要性减弱了不少(除了对本地化功能的支持)。在后台,字符串插值是利用了string.Format()编译成CIL的。

表2-5 string的静态方法

表2-5列出的都是静态方法。这意味着,为了调用方法,需要在方法名(如Concat)之前附加包含了该方法(如string)的那个类型的名称。然而,string类还包含一些实例方法。实例方法不是以类型名作为前缀,而是以变量名(或者对实例的其他引用)作为前缀。表2-6列出了部分实例方法及其示例。

表2-6 string方法

高级主题:using和using static指令

目前静态方法的调用通常是包含一个命名空间的前缀后面跟类型名。例如当调用System.Console.WriteLine时,即使调用的方法是WriteLine(),在上下文中并没有其他的方法使用这个方法名,仍然必须在方法名之前使用命名空间前缀(System)后面跟类型名(Console)。有时,为了避免这样的显式写法,也希望有简写的形式,此时就可以使用C# 6.0新增的using static指令,如代码清单2-13所示。

代码清单2-13 using static指令

  1. // The using directives allow you to drop the namespace  
  2. using static System.Console;  
  3. class HeyYou  
  4. {  
  5. static void Main()  
  6. {  
  7. string firstName;  
  8. string lastName;  
  9. WriteLine("Hey you!");  
  10. Write("Enter your first name: ");  
  11. firstName = ReadLine();  
  12. Write("Enter your last name: ");  
  13. lastName = ReadLine();  
  14. WriteLine(  
  15. $"Your full name is {firstName} {lastName}.");  
  16. }  

using static指令必须放在文件的最开始。①1以后每次使用System.Console类时,就不必使用System.Console前缀了,只需要简单地使用方法名即可。需要注意的是,using static指令只对静态方法和属性有效,对于实例成员不起作用。

using指令与using static指令类似,使用后也可以省略命名空间前缀,例如省略System前缀。与using static指令不同的是,using指令在文件(或命名空间)中应用非常普遍,不仅只应用于静态成员。无论是实例化,或是静态方法调用,抑或是使用C#6.0中新增的nameof操作符时,使用using指令都可以随意地省略所有的命名空间引用。

4. 字符串格式

无论是使用string.Fomat()还是用C# 6.0的字符串插值功能构造复杂格式的字符串,总要用一组丰富的、复杂的格式模板来显示数字、日期、时间、时间段等等。例如,如果price是一个decimal类型的变量,那么string.Fomat("{0,20:C2}", price)和与之等价的字符串插值$"{price,20:C2}"都使用默认的格式化货币规则将decimal值转换为一个20个字符长、右对齐、小数点后保留两位数字的字符串。由于本书篇幅有限,不能对所有可能的字符串格式逐一展开讨论。读者可以通过MSDN文档了解string.Fomat()的完整的字符串格式列表。

如果想在一个插值的字符串或者格式化的字符串中真正出现左大括号或者右大括号,可以通过连续输入两个大括号表明这个大括号不是引入的格式模板。例如,插值的字符串$"{{ {price:C2} }}"将生成字符串"{ $1,234.56 }"。

5. 换行符

输出新行所需的字符取决于执行代码的操作系统。在Microsoft Windows平台上,换行符是回车(\r)和换行(\n)这两个字符的组合,在UNIX上使用的则是单个换行\n。为了消除平台之间的不一致,一个办法是使用System.Console.WriteLine()输出空行。如果不准备在控制台上输出,那么可以使用System.Environment.NewLine,这对于多个平台上创建新行是必不可少的。换言之,System.Console.WriteLine("Hello World")和System.Console.Write($"Hello World{System.Environment.NewLine}")是等价的。

高级主题:C#属性

下一节提到的Length成员实际不是方法,因为调用它时没有使用圆括号。Length实际是string的属性(property),C#语法允许像访问成员变量(在C#中称为字段)那样访问属性。换言之,属性具有称为赋值方法(setter)和取值方法(getter)的特殊方法,但要使用字段语法访问那些方法。

研究属性的底层CIL实现,发现它编译成两个方法:set_<PropertyName>和get_<PropertyName>。但这两个方法不能直接从C#代码中访问,只能通过C#属性构造来访问。第5章更详细地讨论了属性。

6. 字符串长度

可以使用string的Length成员判断字符串的长度。该成员是只读属性。不能设置它,调用它也不需要任何参数。代码清单2-14演示了如何使用Length属性,输出2-11展示了结果。

代码清单2-14 使用string的Length成员

  1. class PalindromeLength  
  2. {  
  3. static void Main()  
  4. {  
  5. string palindrome;  
  6. System.Console.Write("Enter a palindrome: ");  
  7. palindrome = System.Console.ReadLine();  
  8. System.Console.WriteLine(  
  9. $"The palindrome \"{palindrome}\" is"  
  10. + $" {palindrome.Length} characters.");  
  11. }  

输出2-11

  1. Enter a palindrome: Never odd or even  
  2. The palindrome "Never odd or even" is 17 characters. 


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Fedora Core 5 Linux架站与网管

Linux出色的网络功能堪称当今操作系统中的佼佼者,无论在功能还是在支持能力上都有令人满意的表现。Linux内置的多个服务器,几乎包含了目前...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊