本章概要: 1:实参和形参; 2:命名实参和可选实参;
3:扩展方法;
4:C#参数的四个类型
4.1:值类型
4.2:引用类型
4.3:输出类型
4.4:数组型参数
1:实参和形参 形参:全称为"形式参数"是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传如的参数. 实参:全称为"实际参数"是在调用时传递个该函数的参数。 查看代码:
int f(int b) /*b为a形?参?*/ { return b; } main() { int a=1; printf("%d",f(a));/*a为a实º¦Ì参?*/ }
2:命名实参和可选实参 有了命名实参,您将不再需要记住或查找形参在所调用方法的形参列表中的顺序。可以按形参名称指定每个实参的形参。例如,可以采用标准方式调用计算身体质量指数 (BMI) 的函数,方法是依照该函数定义的顺序按位置发送体重和身高的实参。 CalculateBMI(123, 64); 如果不记得形参的顺序,但却知道其名称,您可以按任意顺序(先发送体重或先发送身高)发送实参。 CalculateBMI(weight: 123, height: 64); CalculateBMI(height: 64, weight: 123); 方法、构造函数、索引器或委托的定义可以指定其形参为必需还是可选。任何调用都必须为所有必需的形参提供实参,但可以为可选的形参省略实参。 每个可选形参都具有默认值作为其定义的一部分。如果没有为该形参发送实参,则使用默认值。默认值必须为常量。 public void ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10)
下面对 ExampleMethod 的调用导致编译器错误,原因是为第三个形参而不是为第二个形参提供了实参。 //anExample.ExampleMethod(3, ,4); 但是,如果您知道第三个形参的名称,则可以使用命名实参来完成任务。 anExample.ExampleMethod(3, optionalint: 4);
3:扩展方法
扩展方法是给现有类型添加一个方法。现在类型既可是基本数据类型(如int,String等),也可以是自己定义的类。这是从3.0后的一个新特性。
1、扩展方法是给现有类型添加一个方法;
2、扩展方法是通过 指定关键字this修饰方法的第一个参数;
3、扩展方法必须声明在静态类中;
4、扩展方法要通用对象实例来调用;
5、扩展方法可以带参数。
代码 // 必须建一个静态类,用来包含要添加的扩展方法 public static class Extensions { // 要添加的扩展方法必须为一个静态方法 // 此方法参数列表必须以this开始 第二个即为要扩展的数据类型,在这里就是要扩展string类型 // 第三个就无所谓了,就是一对象名,名字随便,符合命名规则即可 // 综合来讲,此方法就是要给string类型添加一个叫TestMethod的方法,此方法返回一个int型的值,即返回调用此方法对象的长度。 public static int TestMethod( this string s) { return s.Length; } } // 测试扩展方法类 class Program { static void Main( string [] args) { string str = " Hello Extension Methods " ; // 调用扩展方法,必须用对象来调用 int len = str.TestMethod(); Console.WriteLine(len); } } public class Student { public string Description() { return " Student............. " ; } public string Description( string name) { return " the student’s name is " + name; } } // 必须建一个静态类,用来包含要添加的扩展方法 public static class Extensions { // 要添加的扩展方法必须为一个静态方法 // 此方法参数列表必须以this开始 第二个即为要扩展的数据类型,在这里就是要扩展Student类型 // 第三个就无所谓了,就是一对象名,名字随便,符合命名规则即可 // 综合来讲,此方法就是要给Student类型添加一个叫TestMethod的方法,此方法返回一个string型的值 public static string TestMethod( this Student s) { return s.Description(); } // 要添加的扩展方法必须为一个静态方法 // 此方法参数列表第一个参数表示要扩展哪一个类,第二个参数才表示此扩展方法的真正参数 // 综合来讲,此方法就是要给Student类型添加一个叫TestMethod的方法,此方法带有一个string类型的参数,并返回一个string型的值 public static string TestMethod( this Student s, string name) { return s.Description(name); } } // 测试扩展方法类 class Program { static void Main( string [] args) { Student stu = new Student(); // 调用扩展方法,必须用对象来调用 string mes = stu.TestMethod(); Console.WriteLine(mes); // 调用带参数的扩展方法,只要传第二个参数就可以了 // 因为他的第一个参数其实只是为了表明是扩展哪个数据类型 mes = stu.TestMethod( " name1 " ); Console.WriteLine(mes); } }
4:C#参数的四个类型
4.1:值类型
所谓值参数,就是利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并将此拷贝传递给该方法,这样做的结果就是被调用的方法不会修改实参的值,保证了实际值的安全,在调用方法时,如果形参的类型时值类型的话,必须保证实参的类型也是值类型的数据.
需要强调的是,非基础型别参数非值引用。
4.2:引用类型
使用ref关键字可以使参数按照引用传递.在需要传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中,若使用ref关键字,则在方法定义和调用方法时都必须显式使用ref关键字.
4.3:输出类型
使用out关键字来进行引用传递,这和ref关键字很累世,不同之处在于ref要求变量必须在传递之前就进行初始化,若使用out关键字,则方法定义和调用时都必须显式的使用out关键字.
4.4:数组型参数
数组型参数就是声明params关键字,用于指定在参数数目可变处采用参数的方法参数。在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字.
转自:http://www.cnblogs.com/luminji/archive/2010/09/06/1819327.html