C#笔记15 方法02
——本系列是基于人民邮电出版社《C#2008 C#图解教程》、清华大学出版社《C#入门经典(第五版)》两本书的自学C#笔记,如果您发现了本文的纰漏,还望不吝指正。
写在前边
*复习:方法是具有名称的可执行代码块,当方法被调用时,它执行自己所含的代码,然后返回到调用它的代码。有些方法返回一个值到它们被调用的位置。
1. 递归
一个方法可以自我调用。这就是所谓的递归
方法每次调用自己,都会有一个新的帧被压入栈中
1).如果没有边界,会无限调用自己,爆栈
2).所以要有跳出——return
3).跳出就要有条件——达到目的——边界
4).每次调用要有变化,变化朝边界靠近
5).一旦到达边界,就跳出
例:递归计算一个数的阶乘,公式f(n)=n*(n-1)
class NumberManipulator
{
public int factorial(int num)
{
/* 局部变量定义 */
int result;
if (num == 1)
{
return 1;
}
else
{
result = factorial(num - 1) * num;
return result;
}
}
static void Main()
{
NumberManipulator n = new NumberManipulator();
//调用 factorial 方法
Console.WriteLine("6 的阶乘是: {0}", n.factorial(6));
Console.WriteLine("7 的阶乘是: {0}", n.factorial(7));
Console.WriteLine("8 的阶乘是: {0}", n.factorial(8));
Console.ReadLine();
}
}
控制台输出结果:
6 的阶乘是: 720
7 的阶乘是: 5040
8 的阶乘是: 40320
例:斐波那契数列,1、1、2、3、5、8、13…,公式Fn=F(n-1)+F(n-2)
public static int Fibonacci(int n)
{
if (n == 1) return 1;
if (n == 2) return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
static void Main()
{
Console.WriteLine("第6位是:" + Fibonacci(6));
}
控制台输出结果:
第6位是:8
2. 方法重载
一个类中,多个方法拥有相同的方法名,参数列表不一致时,则同名方法构成方法重载
1).在编译时,系统会自动判别参数列表,根据参数列表去对应函数
2).返回类型对重载无影响
例:下面的代码中。两个方法的方法名都为Sum,由于参数列表不一致,构成了重载
static void Sum(double a, double b)
{
Console.WriteLine("Double:"+(a+ b));
}
static void Sum(string a, string b)
{
Console.WriteLine("String:"+ (a + b));
}
3. 扩展方法
扩展方法可以实现在不需要修改目标类,也不需要继承目标类的情况下为其添加一个方法
扩展出来的方法被调用时完全如同它是原方法的实例成员一样被调用
static class ExtendMyClass
{
public static void ExtendMethod(this MyClass mc)
{
return mc.MyClassMethod;
}
}
1).扩展类必须为静态类,扩展方法必须为静态方法
2).扩展方法包含关键字this的第一个参数,表示需要被扩展的类
3).如果需要接收参数则从第2个参数开始算起,第1个参数在真正调用方法时是隐藏的
例:通过扩展方法,我们可以为一些.NET内置对象添加方法了,下面是为string添加一个SayHello方法
public static class Extension // 必须是一个public static
{
public static void SayHello(this string str) //必须为static ,这里的strig是类class String
{
if (str == null)
{
Console.WriteLine("Hello");
}
else
Console.WriteLine("{0}", str);
}
}
class Program
{
static void Main()
{
string str = null;
str.SayHello();
string str1 = "not Hello";
str1.SayHello();
}
}
控制台输出结果:
Hello
not Hello
例:同样也可以为自定义对象添加扩展方法,为MyClass添加了一个getAvg()方法
class MyClass
{
private double width, height;
public MyClass(double val1, double val2)
{
width = val1;
height = val2;
}
public double getSum()
{
return width + height;
}
}
static class ExtendMyClass
{
public static double getAvg(this MyClass mc)
{
return mc.getSum() / 2;
}
}
class Program
{
static void Main()
{
MyClass mc = new MyClass(3,4);
Console.WriteLine("sum is {0}", mc.getSum());
Console.WriteLine("avg is {0}", mc.getAvg());
}
}
控制台输出结果:
sum is 7
avg is 3.5