玩足球的篮球 · 小米笔记本pro15.6 ...· 4 月前 · |
聪明的墨镜 · 微信聊天记录删除了怎么恢复?最简单的恢复方法· 7 月前 · |
勤奋的毛衣 · Loading...· 9 月前 · |
从容的打火机 · 徐福记多风味糖果美味旅游小吃意大利罗马米兰都 ...· 1 年前 · |
大力的黑框眼镜 · 《斗罗大陆5重生唐三》完结,后续计划揭晓,三 ...· 1 年前 · |
当定义一个方法时,从根本上说是在声明它的结构的元素。在 C# 中,定义方法的语法如下:
<Access Specifier> <Return Type> <Method Name>(Parameter List) Method Body下面是方法的各个元素:
下面的代码片段显示一个函数 FindMax ,它接受两个整数值,并返回两个中的较大值。它有 public 访问修饰符,所以它可以使用类的实例从类的外部进行访问。
class NumberManipulator当上面的代码被编译和执行时,它会产生下列结果:
最大值是: 200您也可以使用类的实例从另一个类中调用其他类的公有方法。例如,方法 FindMax 属于 NumberManipulator 类,您可以从另一个类 Test 中调用它。
using System ;当上面的代码被编译和执行时,它会产生下列结果:
最大值是: 200一个方法可以自我调用。这就是所谓的 递归 。下面的实例使用递归函数计算一个数的阶乘:
using System ;当上面的代码被编译和执行时,它会产生下列结果:
6 的阶乘是: 720 7 的阶乘是: 5040 8 的阶乘是: 40320当调用带有参数的方法时,您需要向方法传递参数。在 C# 中,有三种向方法传递参数的方式:
方式描述 值参数这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。 引用参数这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。 输出参数这种方式可以返回多个值。这是参数传递的默认方式。在这种方式下,当调用一个方法时,会为每个值参数创建一个新的存储位置。
实际参数的值会复制给形参,实参和形参使用的是两个不同内存中的值。所以,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。下面的实例演示了这个概念:
using System ;当上面的代码被编译和执行时,它会产生下列结果:
在交换之前,a 的值:100 在交换之前,b 的值:200 在交换之后,a 的值:100 在交换之后,b 的值:200结果表明,即使在函数内改变了值,值也没有发生任何的变化。
引用参数是一个对变量的 内存位置的引用 。当按引用传递参数时,与值参数不同的是,它不会为这些参数创建一个新的存储位置。引用参数表示与提供给方法的实际参数具有相同的内存位置。
在 C# 中,使用 ref 关键字声明引用参数。下面的实例演示了这点:
using System ;当上面的代码被编译和执行时,它会产生下列结果:
在交换之前,a 的值:100 在交换之前,b 的值:200 在交换之后,a 的值:200 在交换之后,b 的值:100结果表明, swap 函数内的值改变了,且这个改变可以在 Main 函数中反映出来。
return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。
下面的实例演示了这点:
using System ;当上面的代码被编译和执行时,它会产生下列结果:
在方法调用之前,a 的值: 100 在方法调用之后,a 的值: 5提供给输出参数的变量不需要赋值。当需要从一个参数没有指定初始值的方法中返回值时,输出参数特别有用。请看下面的实例,来理解这一点:
using System ;当上面的代码被编译和执行时,它会产生下列结果(取决于用户输入):
请输入第一个值: 请输入第二个值: 在方法调用之后,a 的值: 7 在方法调用之后,b 的值: 8StoneBelieve
756***[email protected]
局部变量是只能在函数内部访问到的,而字段可以在整个类中访问到,在外部声明可以在其他方法使用的时候进行调用,比如有另外一个方法想要调用max值即可直接使用;
using System; namespace CalculatorApplication class NumberManipulator int max; public int FindMax(int num1, int num2) /* 局部变量声明 */ int result; if (num1 > num2) result = num1; result = num2; return result; public int getmax(int max)//该方法同样可以获取max中的值 return max; static void Main(string[] args) /* 局部变量定义 */ int a = 100; int b = 200; NumberManipulator n = new NumberManipulator(); //调用 FindMax 方法 n.max = n.FindMax(a, b); Console.WriteLine("最大值是: {0}", n.max ); Console.ReadLine(); }
in型参数
int 型参数通过值传递的方式将数值传入方法中,即我们在Java中常见的方法。ref型参数
该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。
该类型与out型的区别在与:
out 型参数
与 ref 型类似,仅用于传回结果。
1). out型数据在方法中必须要赋值,否则编译器会报错。
eg:如下图若将代码中的sum1方法的方法体
改为 a+=b; 则编译器会报错。原因:out 型只出不进,在没给 a 赋值前是不能使用的
改为 b+=b+2; 编译器也会报错。原因:out 型数据在方法中必须要赋值。
2). 重载方法时若两个方法的区别仅限于一个参数类型为ref 另一个方法中为out,编译器会报错
eg:若将下面的代码中将方法名 vsum1 改为 sum(或者将方法名 sum 改为 sum1),编译器会报错。
Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out
原因:参数类型区别仅限于 为 ref 与为 out 时,若重载对编译器而言两者的元数据表示完全相同。
class C //1. in型参数 public void sum(int a, int b) { a += b; //2. ref型参数 public void sum(ref int a, int b) a += b; //3. out型参数 public void sum1(out int a, int b) a = b+2; public static void Main(string[] args) C c = new C(); int a = 1, b = 2; c.sum(a,b); Console.WriteLine("a:{0}", a); a = 1; b = 2; c.sum(ref a, b); Console.WriteLine("ref a:{0}", a); a = 1; b = 2; c.sum1(out a, b); Console.WriteLine("out a:{0}", a);输出结果:
从代码也可以看出,int 型参数为值传递,所以当将变量 a 传入方法时,变量 a 的值并不会发生变化。而 ref 型参数,由于是引用传递,将变量的值和地址都传入方法中故变量值改变。out 型无法将变量的值传入。但可以将变量的地址传入并为该地址上的变量赋值。
Solitary
119***[email protected]
大軒
big***[email protected]
public static class ExtensionString //向 String 类扩展一个统计单词数量的方法 public static int CountWord(this String str) return str.Split(' ').Length; class MainClass public static void Main(string[] args) Console.WriteLine("单词数量:" + "Hello World".CountWord()); //没有参数 }
聪明的墨镜 · 微信聊天记录删除了怎么恢复?最简单的恢复方法 7 月前 |
勤奋的毛衣 · Loading... 9 月前 |