C#语言入门详解 --- 方法(含传值 输出 引用 数组)

发布于:2024-06-17 ⋅ 阅读:(22) ⋅ 点赞:(0)

方法

方法标准式


<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
   Method Body
}

让我们逐一对每一个模块进行解释:

  • Access Specifier:访问修饰符,这决定了接下来的主题的可见性,包含public,private...
  • Return type:主体的返回类型,一个方法可以返回一个值。返回类型是方法返回的值的数据类型。如果不返回任何值,则返回类型为 void
  • Method name:本次定义的方法的名称。
  • Parameter list:参数列表,使用圆括号括起来,该参数是用来传递和接收方法的数据。参数列表是指方法的参数类型、顺序和数量。
  • Method body:方法主体,包含了完成任务所需的指令集。

方法的调用顺序为,先讲方法所属的对象进行实例化,然后使用方法名进行调用。

举例:

using System;
namespace test
{
	class test
	{
		public int compare(int a,int b)
		{
			int result;
			if (a > b)
				result = a;
			else
				result = b;
			
			return result;
		}
		
		static void Main()
		{
			int a = 100;
			int b = 120;
			test Study = new test();
			int result = Study.compare(a,b);
			Console.WriteLine(result);
		}
	}

}

方法参数

传值参数

这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。

定义形式为不带任何修饰符的参数,在方法体中调用不会影响主程序中实参,因为并未对实参储存位置进行操作。

using System;
namespace test
{
	class test
	{
		public void swap(int a,int b)
		{
			int temp = a;
			a = b;
			b = temp;
		}
		
		static void Main()
		{
			int a = 100;
			int b = 120;
			test Study = new test();
			Console.WriteLine(a);
			Study.swap(a,b);
			Console.WriteLine(a);
		}
	}
}

我们在test类中定义了一个交换函数,通过调用想要将a,b的值进行交换,让我们将上述代码运行后发现,两次输出a的值都为100,并没有将函数swap并没有将主函数中a,b的值交换。

引用参数

这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。

声明引用参数时需要携带修饰符ref,调用时也需要对传入的参数携带修饰符ref;

引用参数的储存位置就是实参的储存位置,相当于方法调用时,将实参的储存位置赋给了函数的形参中。

using System;
namespace test
{
	class test
	{
		public void swap(ref int a,ref int b)
		{
			int num = a;
			a = b;
			b = num;
		}
		
		static void Main()
		{
			int a = 100;
			int b = 120;
			test Study = new test();
			Console.WriteLine(a);
			Study.swap(ref a,ref b);
			Console.WriteLine(a);
		}
	}
}

输出参数

这种方式可以返回多个值。其目的在于返回一个数值,而不是为了改变。

return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己

using System;
namespace test
{
	class test
	{
		public void input(out int x)
		{
			int num = 100;
			x = num;
		}
		
		static void Main()
		{
			int a = 500;
			test Study = new test();
			Study.input(out a);
			Console.WriteLine(a);
		}
	}
}

数组参数

数组参数的定义传值参数类似,但必须是形参列表中的最后一个,使用params进行修饰

using System;
namespace test
{
	class Program
	{
		static int Qiuhe(params int[] intArray)
		{
			int sum = 0;
			foreach (var item in intArray)
			{
				sum += item;
			}
			
			return sum;
		}
		
		static void Main()
		{
			int[] a = new int[] {1,2,3};
			int num = Qiuhe(a); //静态类型不能通过实例类型进行访问
            int result = Quite(1,2,3,4,5,6);
			Console.WriteLine(num);
		}
	}
}
using System;
namespace test
{
	class Program
	{
		static void Express(params string[] strArray)
		{
			foreach (var item in strArray)
			{
				Console.WriteLine(item);
			}
		}
		
		static void Main()
		{
			string str = "TIM;TOM;AMY";
			string[] result = str.Split(';',';');
			Express(result);	
		}
	}
}

具名参数&可选参数

具名参数:

对于其他方法严格要求形参带入的位置,通过使用具名参数可以无视参数传递的顺序。

using System;
namespace test
{
	class Program
	{
		static void swap(int a,int b)
		{
			Console.WriteLine(a);
			Console.WriteLine(b);
		}
		
		static void Main()
		{
			int a = 100;
			int b = 200;
			swap(a:b,b:a);
		}
	}
}

可选参数:

参数因为具有“默认值”而使得可选。

using System;
namespace test
{
	class Program
	{
		static void swap(int a = 200,int b = 100)
		{
			Console.WriteLine(a);
			Console.WriteLine(b);
		}
		
		static void Main()
		{
			swap(); //具有默认值可以直接使用函数而不需要传参
		}
	}
}

扩展方法(this 参数)

方法必须是公有且静态,public static进行修饰

必需是形参列表中的第一个,由this修饰

using System;
using System.Collections.Generic;
namespace test
{
	class Program
	{
		static void Main()
		{
			double x = 3.14;
			double y = x.Round(4);
			Console.WriteLine(y);
		}
	
	}
	
	static class DoubleExtension
	{
		public static double Round(this double input,int digits)
		{
			double result = Math.Round(input,digits);
			return result;
		}
	}
	
}

参考资料

-《C#图解教程》