函数

来源:互联网 发布:sony音乐播放软件 编辑:程序博客网 时间:2024/03/29 12:41

今天学习了C#里的“函数”一章,感觉到了“”,有些抓狂,朦朦胧胧,不过也不是一点头绪都没有,感觉就是头绪有些多,难理... ... 不过自己还是坚持了下来,不论如何,自己也要先坚持下去,至少也应该有个大概了解,以后慢慢回味理解,没办法QQ糖豆笨,也只能这样了,不过QQ糖豆坚持学习的信念没有变! 加油!加油!!!!!

 

1、函数

函数是一种方法,可提供在应用程序中的任何一处执行的代码块。


2、函数的定义由以下几个部分组成:

1)两个关键字:static 和 void

(2)函数名后跟圆括号,如Wriet()

(3)一个要执行的代码块,放在花括号中

 

Main()是控制台应用程序的入口点函数。

 

关键字static与面向对象的概念有关。

 

void表明函数没有返回值。

 

定义函数和调用函数时,必须使用圆括号。


3、返回值

通过函数进行数据交换的最简单方式是利用返回值。

 

(1)在函数声明中指定返回值的类型,但不使用关键字void;

(2)使用return关键字结束函数的执行,把返回值传送给调用代码。


4、参数

当函数接受参数时,必须指定下述内容:

(1)函数在其定义中指定接受的参数列表,以及这些参数的类型。

(2)在每个函数调用中匹配的参数列表。

 

eg:

static int MaxValue(int[] intArray)  //MaxValue()定义了一个参数,即int数组intArray,还有一个int类型的返回值
        {
            int maxVal = intArray[0];  //局部整数变量maxVal初始化为数组中的第一个值,然后把这个值与数组中后面的每个元素依次进行比较
            for (int i = 1; i < intArray.Length; i++)
            {
                if (intArray[i] > maxVal)
                    maxVal = intArray[i];
            }
            return maxVal;
        }

        static void Main(string[] args)
        {
            int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 }; //Main()中的代码声明初始化一个简单的整数数组,用于MaxValue()函数
            int maxVal = MaxValue(myArray);  // 调用MaxValue(),把一个值赋值给int变量maxVal
            Console.WriteLine("The maximum value in myArray is {0}.",maxVal);
            Console.ReadKey();
        }

 

示例说明:通过函数交换数据(1)

 


5、参数匹配

调用函数时,必须使参数与函数定义中指定的参数完全匹配。(要匹配参数的类型、个数和顺序)

 


6、参数数组

C#允许为函数指定一个(只能一个)特定的参数,参数必须是函数定义中的最后一个参数,成为参数数组。

参数数组可以使用个数不定的参数调用函数,使用params来定义。

 

eg:

static int SumVals(params int[] vals) //函数sumVals()是用关键字params定义的,可以接受任意个int参数(或不接受任何参数)
        {
            int sum = 0;
            foreach (int val in vals)
            {
                sum += val;
            }
            return sum;
        }

        static void Main(string[] args) // 在Main()中,用5个整型参数调用这个函数
        {
            int sum = SumVals(1, 5, 2, 9, 8);
            Console.WriteLine("Summed Values={0}",sum);
            Console.ReadKey();
        }

 

实例说明:通过函数交换数据(2) 


7、引用参数和值参数

要对变量进行的任何改变都会影响作用参数的变量值,需要使用ref来指定参数。

 

ref参数的变量有两个限制:

(1)函数可能会改变引用参数的值,所以必须在函数调用中使用变量。

(2)必须使用初始化过的变量,不允许假定ref参数在使用它的函数中初始化。

 

eg:class Program
    {
        static void showDouble(ref int val)
        {
            val *= 2;
            Console.WriteLine("val doubled={0}",val);
        }

        static void Main(string[] args)
        {
            int myNumber = 5;
            Console.WriteLine("myNumber={0}",myNumber);
            showDouble(ref myNumber);
            Console.WriteLine("myNumber={0}",myNumber);
            Console.ReadKey();
        }
    }

 

示例说明:ref使用示例


8、输出参数

out指定所给的参数是一个输出参数。用法和ref一样,不过有区别:

(1)把未赋值的变量用作ref参数是非法的,但可以把未赋值的变量用作out参数;

(2)在函数使用out参数时,该参数必须看作是还未赋值。即调用代码可以把已赋值的变量用作out参数,存储在该变量中的值会在函数执行时丢失。

 

eg:class Program
    {
        static int MaxValue(int[] intArray, out int maxIndex)
        {
            int maxVal = intArray[0];
            maxIndex = 0;
            for (int i = 1; i < intArray.Length; i++)
            {
                if (intArray[i] > maxVal)
                {
                    maxVal = intArray[i];
                    maxIndex = i;
                }
            }
            return maxVal;
        }

        static void Main(string[] args)
        {
            int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };
            int maxIndex;
            Console.WriteLine("The maximum value in myArray is {0}",MaxValue(myArray, out maxIndex));
            Console.WriteLine("The first occurrence of this value is at element {0}",maxIndex+1);
            Console.ReadKey();
        }
    }

 

示例说明:out参数应用示例。


9、变量的作用域

 

作用域包括定义变量的代码块和直接嵌套在其中的代码块。函数中的代码块与调用它们的代码块是不同的。

 

覆盖一个函数的变量称为局部变量;

其作用域可覆盖几个函数的成为全局变量

 

eg:static string myString;

        static void Write()
        {
            string myString = "String defined in Write()";
            Console.WriteLine("Now in Write()");
            Console.WriteLine("Local myString={0}",myString);            //Local myString 本地的“myString”(局部变量)
            Console.WriteLine("Global myString={0}", Program.myString);  //Global myString 全部的“myString”(全局变量)
        }

        static void Main(string[] args)
        {
            string myString = "String defined in Main()";
            Program.myString = "Global string";                         //给全局变量赋值
            Write();
            Console.WriteLine("/nNow in Main()");
            Console.WriteLine("Local myString={0}", myString);           //Local myString 本地的“myString”(局部变量)
            Console.WriteLine("Global myString={0}", Program.myString);  //Global myString 全部的“myString”(全局变量)
            Console.ReadKey(); 
        }

 

示例说明:全局变量示例;这种形式的控制台应用程序中,必须使用static或const关键字来定义这种形式的全局变量,要修改全局变量的值就需要用static.


10、Main()函数

Main()是C#应用程序的入口点

 

Main函数可以用4钟签名:

(1)static void Main()

(2)static void Main(string[] args)

(3)static int Main()

(4)static int Main(string[] args)

(3)、(4)返回一个int值,勇于表示应用程序如何终止;一般情况下,返回0反应了“正常”的终止(即应用程序执行完毕,并安全地终止)

 

Main()的参数args是从应用程序的外部接受信息的方法,其形式是命令行参数。

在执行控制台应用程序时,指定的任何命令行参数都放在这个args数组中,接着可以根据需要在应用程序中使用这个参数。

 

eg: static void Main(string[] args)
        {
            Console.WriteLine("{0} command line arguments were specified:", args.Length);
            foreach (string arg in args)
                Console.WriteLine(arg);
            Console.ReadKey();
        }

 

示例说明:命令行参数


11、函数的重载

函数的重载允许创建同名的多个函数,这些函数可使用不同的参数类型。


12、委托

委托是一种可以把引用存储为函数的类型。

 

委托的声明非常类似与函数,但不带函数体,需要使用delegate关键字。委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表

 

eg:delegate double ProcessDelegate(double param1,double param2); //定义了一个委托PorcessDelgate.其签名与两个函数Multiply()和Divide()的签名匹配

        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("Enter 2 numbers separated with a comma:");
            string input = Console.ReadLine();
            int commaPos = input.IndexOf(',');
            double param1 = Convert.ToDouble(input.Substring(0, commaPos));
            double param2 = Convert.ToDouble(input.Substring(commaPos+1,input.Length-commaPos-1));
            Console.WriteLine("Enter M to multiply or D to divide:");
            input = Console.ReadLine();
            if (input == "M")
                process = new ProcessDelegate(Multiply);
            else
                process = new ProcessDelegate(Divide);
            Console.WriteLine("Result:{0}",process(param1,param2));
            Console.ReadKey();
        }

 

示例说明:(1)用委托来调用函数。

(2)delegate关键字指定该定义是用于委托的,用一个签名指定double返回类型和两个double参数,使用名称可是任意的,委托名是ProcessDelgate,double参数名师param1和param2.

(3)要把一个函数引用赋给委托变量,需要使用古怪的语法,过程比较类似于给数组赋值,必须使用new关键字创建一个新委托。关键字的后面指定委托类型,提供一个引用函数的参数,该函数是Multiply()或Divide().


虽然今天的“函数”知识难,但是QQ糖豆还是坚持了下来,不论如何,自己也要先坚持下去,至少也应该有个大概了解,以后慢慢回味理解,没办法QQ糖豆笨,也只能这样了,不过QQ糖豆坚持学习的信念没有变! 加油!加油!!!!!

 

 

 

 

原创粉丝点击