void sun() { Console.WriteLine("这是一个函数,也叫一个方法(无参无返回值)"); } sun(); //在同一个类中,不需要实例化,即可直接调用,这种叫函数调用。 Pro p = new Pro(); p.sun();//类外方法调用,其实这里也是一个类,C#只有方法没有函数,也可以说函数就是方法。 class Pro { public void sun() { Console.WriteLine("Python有这样一句话:类中定义叫方法,类外定义叫函数。"); } }
有参有返回值:另外【有参无返回值,无参有返回值】这两种不在做演示
Pro p = new Pro(); string s = p.sun("void空,无返回值;改string就是返回一个字符串,带返回值的方法必须return");//实参可以不用传值,返回默认值实参 Console.WriteLine(s); class Pro { public string sun(string str, int i=0) //str是形参,i是实参,实参必须定义在行参后面 { return str + i; //返回的是字符串string } }
命名参数:改变传递时参数的位置
Pro p = new Pro(); string s = p.sun(i: 11, str: "利用命名参数指定传递,改变参数位置。"); Console.WriteLine(s); class Pro { public string sun(string str, int i ) //正常传递,是先str,在传i { return str + i; } }
一、方法参数传递关键字:ref,out,params
栈:存放值类型会被初始化;堆:存放引用类型的不会被初始化数据。
将值类型改为引用类型传递:【ref关键字和out关键字】,两个意思是一样的只是使用方法不一样。
ref和out的区别
//ref:传递前必须初始化赋值,有进有出 int a = 10; ChangeNum(ref a);//方法也需要有ref关键字 Console.WriteLine("\n关键字ref下的a = {0}", a);//此时a = 11 static void ChangeNum(ref int num)//传参时也需要有ref关键字 { num++;//ref,在方法体中可以不对变量赋值,返回的就是初始化的值,不会报错。 } //out:传递前不需要赋值,只出不进。 int i; ChangeNum2(out i); Console.WriteLine("\n关键字out下的i = {0}", i); static void ChangeNum2(out int num) { num = 111; //out规定:方法体返回前必须给变量赋值。否则会报错。 }
Testt("params多参数传递,", 99, 88, 77, 44, 55, 66);//params会自动识别为同类型数据,这里自动识别为一个数组,或者直接传一个数组也可以 static void Testt(string str, params int[] a)//params关键字必须是最后一个参数,不要给数组定义长度。 { int sum = 0; foreach (int i in a) { sum += i; } Console.WriteLine("{0}这个班的总成绩是:{1}", str, sum); }
二、方法重载
方法名相同,参数不同。
Pro p = new Pro(); p.sun(); string s = p.sun("只要方法名相同,参数不同都叫方法重载,跟有无返回值无关"); Console.WriteLine(s); class Pro { public void sun() { Console.WriteLine("方法重载"); } public string sun(string str) { return str; } }
三、构造方法
与类同名的方法,不能有返回值,可以重载
Pro p = new Pro();//默认无参构造实例化,调用时自动运行 Pro p2 = new Pro("构成方法用于传递初始化数据"); Console.WriteLine(p2.str); class Pro { public Pro() { Console.WriteLine("每个类默认自带无参构造,当定义了有参后,隐藏的无参构造就消失,代码需要重新写上无参才生效。"); } public Pro( string str1) //str1只作用方法体内,str作用于整个类 { this.str = str1; //this表示当前类 } public string str ="";//字段 }
四、回调函数
相当于循环,方法掉用方法本身,自己调用自己。
sun(); void sun() { Console.WriteLine("没有条件判断,直接回调就是死循环"); sun();//自己调用自己 }
五、匿名方法
匿名函数也叫【lamdba表达式】,语法:(参数列表)=>{方法体}
对典型的:()=>{ } //无参无返回值
Func<int, int, int> f = (a, b) => { return a * b; }; //两个参数一个返回值,因为方法需要调用所以需要配合委托来学习。