函数
来源:互联网 发布: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糖豆坚持学习的信念没有变! 加油!加油!!!!!