随便玩玩之C# 12 方法函数
随便玩玩之C# 12 方法函数
方法是能够完成一定功能的语句块。也叫函数。
程序是一条流水线,方法就是流水线上的一个功能模块。橙汁的生产流程有清洗、削皮、压榨、过滤、提汁、装瓶。生产橙汁的过程是一个程序,每一个步骤就是一个功能模块,也就是方法或函数。
方法参数,就是传递给方法的值或对象。就像流水线上传给削皮机器的橙子。
方法返回值,就是方法返回经过计算的结果。就像流水线上削皮机器削完皮的橙子。方法也可以不需要返回值,就像橙汁装瓶,橙汁装进瓶子里就结束了。如果还要装箱,那就继续返回到流水线上,传递给装箱的流水线功能模块。
1.定义一个方法
先看最基本的程序,其实也包含了一个方法,就是main方法。程序的入口就是main方法:
using System; namespace Method { public class Program { // main方法是程序的入口,相当于程序的流水线。 static void Main(string[] args) { // main方法的内部,就是一条流水线。 // 每一条语句按顺序执行。 Console.WriteLine("橙子榨汁"); Console.ReadKey(); } } }
控制台最基本的程序,包含了命名空间声明(第3行),类声明(第5行),方法声明(第8行)。
static void Main(string[] args) { }
Main方法声明这一行包括方法的修饰类型,static表示这是静态方法,可有可无,未指定方法类型是默认为public修饰类型。
void表示这是无返回时方法,每个方法必须具有返回类型。可以是字符串(string)、整形(int)等。
Main是方法名称,方法名称后的括号里的内容表示参数,参数可有可无,后面的一对大括号表示方法体的内容。
我们可以自己定义一个方法,然后调用方法。
using System; namespace Method { public class Program { static void Main(string[] args) { OutPutText(); Console.ReadKey(); } static void OutPutText() { Console.WriteLine("橙子榨汁"); } } }
上面代码,第14-17行声明了一个静态的无返回值的无参数的OutPutText()方法,然后在Main()方法中调用了这个方法。
输出如下:
2.带参数的方法
这里只是很简单的代码,当然看不出使用自定义方法的优势。回想一下,计算两个整数相加的代码。
using System; namespace Method { public class Program { static void Main(string[] args) { int a = 3, b = 5; int c; c = a + b; Console.WriteLine(c); Console.ReadKey(); } } }
先声明两个整数变量并赋值,再声明一个变量保存相加的结果,再输出结果。这一切看似很完美。假如有10个这样的计算题呢,答曰当然是写10次这样的代码啊,没毛病啊。
其实,使用可传入参数的方法更简单。
下面,定义一个可参入参数的方法。
using System; namespace Method { public class Program { static void Main(string[] args) { Sum(3, 5); Console.ReadKey(); } static void Sum(int x,int y) { int z = x+y; Console.WriteLine(z); } } }
上面第14-18行定义了一个Sum()方法。
第14行Sum(int x,int y)方法的括号中有两个参数,这个叫形参,简单理解就是占位符,先占着两个坑位。两个参数的类型都是int,表示这个方法可以接受传入两个整数当作参数。
参数要先指定类型,再指定形参名称。两个参数用逗号隔开。
第16行是声明一个整数变量z,存放x+y的计算结果。
第17行是输出结果。
想象一下这个自定义方法就是一个扳手,固定的口径,对着螺丝拧一拧,螺丝拧好了,程序也就结束了。
在第9行,main()方法中,调用了这个方法,给方法传入了2个参数。这个方法经过计算后,输出了结果。两个可用于计算的参数叫实参。
10个整数加法计算题,就在main()方法中写调用10次sum()方法即可。
using System; namespace Method { public class Program { static void Main(string[] args) { Sum(3, 5); Sum(3, 6); Sum(3, 2); Sum(3, 3); Sum(45, 8); Sum(30,9); Sum(23, 17); Sum(12, 20); Sum(67, 1); Console.ReadKey(); } static void Sum(int x,int y) { int z = x+y; Console.WriteLine(z); } } }
3.带返回类型的方法
还是刚刚的加法计算。修改一下。
using System; namespace Method { public class Program { static void Main(string[] args) { Sum(3, 5); Console.ReadKey(); } static int Sum(int x,int y) { int z = x+y; return z; } } }
修改了sum()方法的返回类型为int,删除了输出语句,添加了返回语句,返回变量z。
此时我们运行程序,没有输出结果。为什么呢?因为方法只是返回了整数数值,没有在控台输出的语句。在main()方法中加上输出语句即可。
using System; namespace Method { public class Program { static void Main(string[] args) { Console.WriteLine(Sum(3, 5)); Console.ReadKey(); } static int Sum(int x,int y) { int z = x+y; return z; } } }
如上图,sum(3,5)返回的是一个整数值,可以直接使用Console.WriteLine()输出。
思考一下,在sum()方法中有一个整数变量z,那么在main()方法中能不能使用Console.WriteLine(z)来显示结算结果呢。尝试一下。
答案是不能,VS提示代码有错误。当前上下文中不存在名称z.
明明有z啊,为什么?这是变量的作用域在起作用。一个变量只在围绕它的最近的大括号内起作用。超出了这个大括号这个变量就不能被使用了。
既然sum()返回的是一个数值,那么,能不能把它赋值给另一个变量。当然可以。
using System; namespace Method { public class Program { static void Main(string[] args) { int c = Sum(1, 2); Console.WriteLine(c); Console.ReadKey(); } static int Sum(int x,int y) { int z = x+y; return z; } } }
结果如图。
4.在WPF中使用自定义方法。
这个例子是几个控件的组合使用。
新建一个WPF项目,解决方案命名为WPFCustomMethod。
从工具箱像WPF设计器拖放2个TextBox控件,3个label控件,1个button控件。
2个TextBox控件的名称分别修改为textbox1,textbox2。
3个label控件第1个修改content属性为+,第2个修改content属性为=,第三个label控件的名称修改为result,content属性改不改无所谓。
双击button控件,输入一下代码。
private void Button_Click(object sender, RoutedEventArgs e) { // 在result控件中显示计算结果 // 其中两个textbox的text属性的值需要从string类型转换成int类型。 result.Content = Sum(Convert.ToInt32(textbox1.Text), Convert.ToInt32(textbox2.Text)); } static int Sum(int x, int y) { return x + y; }
运行程序,在两个文本框中输入数字,点击计算按钮。结果显示在第三个label控件上。
参考资料:
1.C#方法
https://learn.microsoft.com/zh-cn/dotnet/csharp/methods
2.方法和函数的区别:只不过是面向过程和面向对象中的不同称呼。
https://www.zhihu.com/question/507260300/answer/2296848619
https://zhuanlan.zhihu.com/p/449835027