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

2.3.2 void

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

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

2.3.2 void

有时候,C#语法要求指定数据类型但不传递任何数据。例如,假定一个方法没有返回值,C#就允许在数据类型的位置放一个void关键字。HelloWorld程序中的Main方法声明就是一个例子。在返回类型的位置使用void意味着方法不返回任何数据,同时告诉编译器不要期望会有一个值。void本质上并不是一个数据类型,它只是用于指出没有数据返回这一事实。

语言对比:C++

无论在C++中还是在C#中,void都有两个含义:一是用于标记方法不返回任何数据,二是用于表示指针指向未知类型的存储位置。C++程序中经常使用void**这样的指针类型。虽然C#中也可用相同的语法表示指向未知类型的存储位置的指针,但这种用法在C#中比较罕见,一般仅在需要与非托管代码库进行互操作时才会用到。

语言对比:Visual Basic——返回void就像定义子程序

在Visual Basic中,与C#的“返回void”等价的是定义子程序(Sub/End Sub)而不是返回值的函数。

高级主题:隐式类型的局部变量

C# 3.0新增了上下文关键字var来声明隐式类型的局部变量。只要在声明变量的同时用确定类型的表达式初始化它,C# 3.0和以后的版本就允许变量的数据类型是“隐式”的,而不必显式地指定数据类型,如代码清单2-18所示。

代码清单2-18 操纵字符串

  1. class Uppercase  
  2. {  
  3. static void Main()  
  4. {  
  5. System.Console.Write("Enter text: ");  
  6. var text = System.Console.ReadLine();  
  7. // Return a new string in uppercase  
  8. var uppercase = text.ToUpper();  
  9. System.Console.WriteLine(uppercase);  
  10. }  

这个代码清单和代码清单2-16相比只有两处不同。首先,声明时不是使用显式的数据类型string而是var。结果生成的CIL代码和显式使用string完全一样。但var告诉编译器:应该由编译器根据声明时所赋的值(System.Console.ReadLine())推断数据类型。

其次,text和uppercase这两个变量都是在声明时初始化。不初始化会造成编译时错误。如前所述,编译器决定初始化表达式的数据类型,并在最终的CIL代码中正确地声明变量,就像程序员显式指定了类型那样。

虽然允许使用var取代显式的数据类型,但在数据类型已知的情况下最好不要使用var。例如,最好将text和uppercase声明为string。这不仅使代码更容易理解,还能验证右侧表达式返回的是所期望的数据类型。用var声明变量,右侧的数据类型应该是非常明显的;否则应该考虑避免使用var声明。

C# 3.0添加var的目的是支持匿名类型。匿名类型是在方法内部动态声明的数据类型,而不是通过显式的类定义来声明的(参见第14章),代码清单2-19进行了演示。

代码清单2-19 隐式局部变量和匿名类型

  1. class Program  
  2. {  
  3. static void Main()  
  4. {  
  5. var patent1 =  
  6. new { Title = "Bifocals",  
  7. YearOfPublication = "1784" };  
  8. var patent2 =  
  9. new { Title = "Phonograph",  
  10. YearOfPublication = "1877" };  
  11. System.Console.WriteLine(  
  12. $"{ patent1.Title } ({ patent1.YearOfPublication })");  
  13. System.Console.WriteLine(  
  14. $"{ patent2.Title } ({ patent2.YearOfPublication })");  
  15. }  

输出2-14展示了上述代码的输出。

输出2-14

  1. Bifocals (1784)  
  2. Phonograph (1784) 

代码清单2-19演示了如何将匿名类型的实例赋给隐式类型的局部变量(var变量)。这种形式的操作如果与C# 3.0支持的连接(joining或associating)数据类型或减小类型大小以获得更少数据元素的功能联合使用,将具有重要的作用。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

主流ARM嵌入式系统设计技术与实例精解

本书重点介绍了主流ARM应用系统的开发与实践。全书基于目前较为通用、流行的ARM处理器,介绍了其原理、硬件结构、硬件电路设计与开发和软件...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊