C#寒假复习

第六章

函数

函数的定义和使用:
函数的意义:降低相同功能的代码重复编写,提高重复代码的维护效率。
一个文件由命令空间(namespace)、类(class)、函数(function)的结构组成。函数放在Class类中,函数命名一般开头字母用大写,调用函数时必须是函数名+括号。
void表示函数无返回值,如需返回值,则将void替换为返回的值类型,使用return结束函数并返回值给调用代码。另外,return可存在于void声明的函数中,例如:return;(用来退出函数,不能有值)。

Class Program
{
	WriteLine("Text output from functio.");
}
static void Main (string [] args)
{
	Write();
	ReadKey();
}

结果:Text output from functio.5
变量的作用域
不同函数中声明的变量不能在其它函数中直接访问,需使用参数的方式。另外,可在类中声明变量,一样使用static的方式,如与函数内的变量重名,需使用Program(类名).myStr访问,如直接使用myStr会屏蔽全局变量。
还需要注意的是语句块也会影响变量的作用域,例如for(int i = 1),这个i只能在for循环中(嵌套其中的语句)使用,跳出循环后,变量i就不能使用了。
对全局变量的使用,建议在函数间使用参数传递的方式,这样可以比较直观地看出变量的变化。
main()入口函数
执行C#程序等同于执行main()函数,main()函数执行完毕,程序执行过程就结束了.
结构函数
可以在结构中声明函数,声明时不使用static。
函数的重载
涉及一个概念:函数签名。函数签名包括函数的名称和参数,而函数重载:就是使用相同的名称和不同的参数(参数类型、传递方式[传值或引用])来实现的。而不能声明相同的函数名称和参数,但是不同的返回类型,这样做并不是函数重载:因为函数签名没有包括其返回类型,所以这样做实际相当于重复定义函数,肯定会报错的。

static int MaxVal(int[] intArrayVal)
{
    int maxVal = intArrayVal[0];
    for (int i = 0; i < intArrayVal.Length; i++)
    {
        if (intArrayVal[i] > maxVal)
        {
            maxVal = intArrayVal[i];
        }
    }
    return maxVal;
}
static double MaxVal(double[] doubleArrayVal)
{
    double maxVal = doubleArrayVal[0];
    for (int i = 0; i < doubleArrayVal.Length; i++)
    {
        if (doubleArrayVal[i] > maxVal)
        {
            maxVal = doubleArrayVal[i];
        }
    }
    return maxVal;
}

重载还包括不同的参数类型(比如ref),可实现同一个函数,不同的传值处理方式(被重载)。

int[] myInt = { 1, 3, 4, 5 };
double[] myDouble = { 3.14, 3.15, 3.22, 3.01, 2.14 };
Console.WriteLine("myInt 最大值是 {0}", MaxVal(myInt));
Console.WriteLine("myDouble max value is: {0}", MaxVal(myDouble));

委托
在定义了委托后,就可以声明该委托类型的变量。接着,把这个变量初始为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像变量是一个函数一样。

class Program
{
    //定义委托:之后可声明委托类型的变量;
    //初始化委托变量:可以初始化该变量为函数的引用,在初始化时需指定对应的函数名;
        //对这些函数有个要求:必须是返回类型、参数列表与委托相同的;
    //使用委托变量:在使用该委托变量时,用法和函数一样(包括返回值);
    //思考?如果不用委托,判断用户输入,再调用对应的函数,一样可以达到效果……
        //错,重点是:可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数。
    delegate double ProcessDelegate(double param1, double param2);
 
    static double Multiply(double param1, double param2)
    {
        return param1 * param2;
    }
    static double Divide(double param1, double param2)
    {
        return param1 / param2;
    }
    static void Main(string[] args)
    {
        ProcessDelegate process;
        Console.WriteLine("请输入两个数,用逗号隔开:");
        string input = Console.ReadLine();
        int commaPos = input.IndexOf(',');
        //声明初始化两个double值,从上面获取的数中转换,用commaPos来判断值的内容
        double param1 = Convert.ToDouble(input.Substring(0,commaPos));
        double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));
        Console.WriteLine("输入 M 执行 相乘 或者输入 D 执行 相除 操作:");
        input = Console.ReadLine();
        if (input == "m")
            //初始化委托变量,指定委托类型(上面建的ProcessDelegate),并提供一个引用函数的参数,
            //这是委托赋值的一种语法,在括号中,指定相应的函数名(不带括号);
            //还有简单的用法,process = Multiply;
            //编译器会自动匹配委托变量与函数的返回类型和参数,不匹配,应该会报错;
            process = new ProcessDelegate(Multiply);
        else
            process = new ProcessDelegate(Divide);
        Console.WriteLine("根据你的选择,委托在实例化的时候,调用不同的函数;");
        Console.WriteLine("并且,在这一步传递对应的参数给委托(委托交给函数),计算的结果:{0}", process(param1, param2));
        Console.ReadKey();
    }
}

可以把委托变量作为参数传递给一个函数,这个函数就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值