企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[参考:c#说明文件中方法的使用](https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/methods) # 方法及方法的参数 ![](https://box.kancloud.cn/2e8a27476b5deafd96d18168be6450d0_504x266.png) > 看到 `void` 类似字样修饰符的,就知道这个是方法了。 类中包括属性和方法。其实方法就是一个函数,便于在创建对象后直接用“.”调用。方法声明如下: ``` public int Student() //public 是权限修饰符;int 表示返回值类型。如果是 void 则是无需返回一个值;Student()为自己取的方法名。 { //方法的主体 return 0;//因为定义为int类型,所以需要加return来回传返回值。或return “”; } ``` 调用时只需要“对象名.方法名”也就是对象名后面加一个点,就直接可以跳出方法名了。 # params 方法的参数个数不确定时,可使用params[] params 其实是一个一维数组。 - 一个方法最多有一个 params[] 参数; - 只能在一维数组上引用; - 不能使用ref、out修饰 params[] 参数。 ``` private int Add(params int[ ] x) // 如果知道参数个数,可写成private void Add(int i, int j, int k, int m ... ) { } Program pro = new Program(); //创建默认空参数的对象 int result1 = pro.Add (20); int result2 = pro.Add(20, 30, 40, 50); console.writeline(result1); console.writeline(result2); console.readline(); ``` ``` class Program() { int Add(params int[] x) //Add是一个方法的名字,而不是一个数组的名字,所以括号内的x,才是数组的名字,真实写法应该是:一维数组int x[],所以后续遍历数组时,写法应该是int x[i] { int result = 0; for(int i=0; i<x.Length; i++) { result += x[i]; //这里不是result += i } return result; } } static void Main() { Program pro = new Program(); int result = pro.Add(20, 35); // 直接调用即可,无需其他语句。 console.writeline(result); console.readline(); } ``` # ref 可不先初始化——形参和实参 如:交换两个数的值 按引用进行传递:ref。必须初始化(与局部变量是一样的) int num1前面加ref ``` static void Main() { int num1 = 98, num2 = 368; console.writeline("before exchange, the nums are: {0}, {1}", num1, num2 ); Swap(num1, num2); console.writeline("after enchange, the nums are: {0}, {1}", num1, num2) console.readline(); } //以下语句为用于交换两个数的swap方法 static void Swap(num1, num2) { int temp; temp = num1; num1 = num2; num2 = temp; } ``` 上述代码并不会交换数值,因为swap()括号中的为形式参数。{}中的为实际参数。而对实参的修改并不会影响到形参的结果。所以按上述代码执行后,交换前后是一样的。 这时候需要在形参前加ref ``` static void Main() { int num1 = 98, num = 368; // 对Swap中的num1,num2 进行初始化 console.writeline("before exchange, the nums are: {0}, {1}", num1, num2); Swap(ref num1, ref num2); // 记得加 ref console.writeline("after exchange, the nums are: {0}, {1}", num1, num2); consoel.readline(); } static void Swap(ref int num1, ref int num2) // 记得加 ref { int temp; temp = num1; num1 = num2; num2 = tepm; } ``` 按值传递 vs 按引用传递 ![](https://box.kancloud.cn/e5aaae496d8f37a7d02ff95aa7e0fbeb_615x271.png) # out 想返回多个值,或使用未经初始化的变量? out ![](https://box.kancloud.cn/5b0fd74ee348494e24a1a7c807ef1333_371x131.png) ![](https://box.kancloud.cn/a6984b10c1f2b3b5611eb63faff49de9_250x99.png) ``` class Program { void Add2 (int a, int b, out int c) //如果此处未写out,则必须对c赋值 { c = a+b; } static void Main() { Program pro2 = new Program(); int a =2, b = 3, out c; pro.Add2(a, b, out c); //如果直接写“console.writeline(c)”,则会提示未赋值,此时加入这一行,调用Add方法,并且使用 out 修饰变量,就不会出错。 console.writeline(c); console.readline(); } } ``` 也可以返回多个值: 比如想知道面试结果,以及是否被录用的原因: ``` void Search (int flag, out int result, out string reason) { if (flag == 0) { result = "录用"; reason = "技术能力好"; } else { result = "不录用"; reason = "技术能力不行"; } } ``` 此时传回的就是多个返回值。 # 方法重载 要调用方法时,如果只是值类型不同,或者值个数不同,无需重新定义多个方法,而可以直接使用相同的方法: ``` class Add1 { //方法的类型不同 public sring Sum1(string a, string b, string c) {...} public int Sum1(int a, int b, int c) {...} //这里两个方法的名字都叫Sum1,同名,即视为重载 } class Add2 { //方法的参数个数不同 public int Sum2(int a, int b, int c) {...} public int Sum2(int a, int b, int c, int d) {...} } ``` ![](https://box.kancloud.cn/972239d1de6c041eae21094a3c023796_457x242.png) # 类的静态成员 ## static 如上述例子,如果在`int Sum(int a, int b, int c)`前加`static`关键字,则变成静态类。 没加static前,是实例方法,所以在调用的时候需要 `Program pro = new Program() pro.Sum(20, 30, 40)` 来创建对象,并调用方法。 如果把方法创建成静态的,那就可以直接调用类型的名字来调用 ``` class Program { static int Sum(int a, int b, int c) { ... } Program pro = new Program(); int result = Program.Sum(20, 30, 50); //此处Program也可以不写,但不能写成program.Sum(20, 30, 40),否则提示错误 int result = Sum(22, 33, 44); //不写Program也可以。 } ``` ![](https://ws4.sinaimg.cn/large/006tKfTcly1fru5wz3sxpj30hs07i0tp.jpg) 无法使用实例引用来访问成员。。。请该用类型名来限定它。