《C#本质论》读书笔记(九)方法和参数

      方法的调用

      方法是一种组合一系列语句以执行一个特定操作的方式。它能够为构造程序的语句提供更好的结构和组织。假定要用一个Main()方法来统计某个目录下源代码的行数。我们不是在一个巨大的Main()方法中写下所有代码,而是提供一个更简短的版本,隐藏每一个方法的实现细节。

      首先重新讨论一下System.Console.Wriete()、System.Console.WrieteLine()和System.Console.ReadLine()方法。这一次,我们要从方法调用的角度来讨论它们,而不是将重点放在控制台输入和输出技术上面。

      

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
static void Main( string [] args)
{
string firstName;
string lastName;
System.Console.WriteLine(
" Hey you! " );
/// <summary>
/// System为命名空间
/// Console为类型名称
/// Write为方法名称
/// ("Enter you first name:")为参数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
System.Console.Write( " Enter you first name: " );

firstName
= System.Console.ReadLine();

System.Console.Write(
" Enter you first name: " );
lastName
= System.Console.ReadLine();

System.Console.WriteLine(
" Your full name is {0} {1}. " ,firstName,lastName);
}

 

        一个方法的调用由以下元素构成:命名空间、类型名称、方法名称、参数以及返回数据类型。在一个完全限定的方法名中,要用句点符号来分割每一个部分。

        命名空间

        命名空间是一种特殊的分类机制,它将与一个特定功能集有关的所有类型都分组到一起。命名空间有助于防止类型名称发生冲突。

        常用的几个命名空间:

        using System; //包含基本类型、类型转换、数学计算、程序调用以及环境管理的定义
        using System.Collections; //包含了用于处理对象集合的类型。集合通常采取列表或者字典形式的存储机制
        using System.Collections.Generics; //这是C#2.0新增的一个命名空间,专门用于处理依赖于泛型的强类型集合       

        using System.Data; //包含了对数据库中存储的数据进行处理的类型

        using System.Drawing; //包含了用于操作显示设备和进行图像处理的类型
        using System.Web; //包含用于实现浏览器到服务器通信的类型,

        using System.Web.Services; //利用其中包含的类型,我们可以使用简单对象访问协议,通过HTTP来发送和获取数据
        using System.IO; //包含了用于处理文件和目录的类型,并提供了文件的处理、加载和保存能力

        以上都是.net Fromwork 公共语言运行库(CLR)封装好的类库,引入以上命名空间,可以使用这些类里的方法。
        在三层框架中,一个解决方案里的项目和项目的调用需要添加引用,同时也需要在类里添加using引用

        类型名称

        类型名称可以看做是一种规范,每个方法都有自己的类型名称,假如调用方法和调用者不在同一个类中(比如静态方法Console.Write())就需要使用类型名称限定符(即Console)。和命名空间一样,如果要调用的方法包含在当前类型中,C#允许再调用该方法时省略类型名称。之所以不需要类型名称,是因为编译器能够根据调用者方法推导出类型。

         究其本质,类型或者类是对方法及其相关数据进行组合的一种方式。

         作用域

         之前讲过,作用域将声明的可访问性限制在一个特定的范围中。

         在同一个类中A方法调用B方法就不需要指定类型名称,因为两个方法的作用域是相同的。反之,如果在A类中调用B类中的方法,需要指定类型名称。

         方法名称

         C#要求在类型名称和方法名称之间使用一个句点符号,而且必须在方法名之后跟随一对圆括号,在圆括号内部,可以添加方法要求的任何参数值。

         参数

         每个方法可以有0~N个参数,而且每个参数都具有特定的数据类型。

         方法返回值

         void关键字表示方法无返回值。假如方法是int类型,返回值也必须是int类型,否则就会发生编译错误。

         不同类型的方法

        

 
  
static void Main( string [] args)
{
void Method();
string Method();
List
< TEntity > Method();
TEntity Method();
}

         参数声明

         参数的行为和命名规范与局部变量一摸一样。换言之,参数名采用的是camel大小写形式。另外,无法声明与所在方法的参数同名的局部变量,因为这会造成同名的两个“局部变量”。

         方法返回值声明

         在声明方法的时候,在方法名之前添加一个数据类型,而返回值类型必须跟所添加的数据类型保持一致,虽然一个方法可以有多个参数,但返回值只能有一个。一旦方法指定了返回值类型,而且假定没有错误发生,那么在具体实现这个方法的时候,就必须为每个代码路径指定一个return语句,return语句以return开头,后跟这个方法要返回的值。

          return语句并非只能在方法实现的末尾出现。相反,只要方法包括返回类型,每个代码路径都应该有一个return语句。

          return语句意味着跳到方法的末尾,所以它在switch语句中可以代替break。一旦执行到return,方法调用就会终止。

          指定void作为返回类型,表示方法没有返回值。所以,无法将这种方法的“返回值”赋给一个变量,也无法把它的“返回值”作为参数使用。除此之外,在void类型方法的内部,return是可有可无的。如果你真的指定了return,那么return关键字之后不应该有任何值。

           嵌套的using指令

           不仅可以在文件的顶部进行using声明,还可以在命名空间声明的顶部包含它们。

           

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
using System;
using System.Collections.Generic;
using System.Text;
class Program
{
static void Main( string [] args)
{

}
}
}

 

          在文件的顶部放置using指令和在namespace声明的顶部放置using指令的区别在于,后者的using指令只在你声明的那个命名空间中有效。

          还可以利用using指令为命名空间或类型取一个别名。别名是在using指令所在的那个范围内可以使用的一个替代名称。之所以要使用别名,两个最常见的原因是:消除同名的两个类型的歧义和缩写一个长名称。

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
// 两个不同的using指令中都包含Timer的类型
using System.Timers;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static void Main( string [] args)
{
// 在编译时,会提示你两个指令中的不明确引用
Timer t = new Timer();
}
}
}

 

 

          Main()的返回值和参数

          C#支持在执行一个程序时提供命令行参数,并允许从Main()方法返回一个状态标识符。

          “运行时”会通过一个string数组参数将命令行参数传给Main()。要获取参数,访问数组就可以了。虽然所有命令行参数都可以通过一个字符串数组传给Main(),但我们有时候可能需要从一个不同于Main()的方法中访问那些参数。在这种情况下,可以使用System.Environment.GetCommandLineArgs()方法。该方法采取和Main(string[] args)将参数传给Main()一样的方式来返回命令行参数。

           假如一个程序包含的两个类都有Main()方法,那么可以在命令行上指定具体是哪一个类包含了程序的入口点。利用csc.exe的/m选项开关,可以指定包含Main()的那个类的完全限定类名。

           调用栈和调用点

           随着程序复杂程度的提高,每个方法调用另一个方法时,这个调用栈都会变大。然后,当调用结束时,调用栈会发生收缩,直到调用另一系列的方法。我们用栈展开这个词来描述从调用栈中删除调用的过程。栈展开的顺序通常与方法调用的顺序相反。一个方法调用完毕之后,会将控制权返回给调用点,也就是最初发出方法调用的那个位置。

转载于:https://www.cnblogs.com/aipeiyi/archive/2010/07/27/1785896.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值