一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。
方法(或函数)就是将一堆代码进行重用的一种机制,函数就是一段代码,这段代码可能有输入的值(参数),可能会有返回值。一个函数就像一个专门做这件事的人,我们调用它来做一些事情,它可能需要我们提供一些数据给它,它执行完成后可能会有一些执行结果给我们。要求的数据就叫参数,返回的执行结果就是返回值。String s=Console.ReadLine() 就是一个有返回结果的函数。Console.WriteLine("hello")就是一个有执行参数的函数,只有告诉WriteLine被打印的数据它才知道如何打印。int i=Convert.ToInt32("22") 是一个既有参数又有返回值的函数。
//方法的语法 [访问修饰符] static 返回值 方法名 ([参数列表]) { //方法体 } 方法的定义:看见static就是静态方法。 对于static修饰的方法,使用:类名.方法名()调用。 如果在类中调用自己的由static修饰的方法,可以省略类名。 方法命名规则:方法名开头大写,参数名开头小写,且参数名、变量名的命名要有意义。 方法的调用: 对于静态方法,调用方式有两种: 1、如果在同一类中,直接写名字调用就可以; 2、或者调用方法写为 类名.方法名()。 变量-局部变量、静态变量: 局部变量:变量的作用域---在方法中定义的变量称为局部变量,其作用域从定义开始,到其所在的大括号结束为止。 在一个方法中想要访问另一个方法中的变量,有两种解决办法:参数和返回值。 通过传参解决跨区域参数问题。 静态变量:字段只能在静态方法中使用。
访问修饰符 修饰符 返回值类型 方法名(参数列表)
{
语句块;
}
其中:
1) 访问修饰符
所有类成员访问修饰符都可以使用,如果省略访问修饰符,默认是 private。
2) 修饰符
在定义方法时修饰符包括 virtual(虚拟的)、abstract(抽象的)、override(重写的)、static(静态的)、sealed(密封的)。 override 是在类之间继承时使用的。
3) 返回值类型
用于在调用方法后得到返回结果,返回值可以是任意的数据类型,如果指定了返回值类型, 必须使用 return 关键字返回一个与之类型匹配的值。 如果没有指定返回值类型,必须使用 void 关键字表示没有返回值。
4) 方法名
对方法所实现功能的描述。方法名的命名是以 Pascal 命名法为规范的。
5)参数列表
在方法中允许有 0 到多个参数,如果没有指定参数也要保留参数列表的小括号。参数的定义形式是“数据类型参数名”, 如果使用多个参数,多个参数之间需要用逗号隔开。
C#中方法分为 静态方法 和 非静态方法 ,
从一个方法声明中是否有static来判断是否是静态方法;
静态方法:
当一个静态方法去调用另一个静态方法时,直接使用类名进行调用。
非静态方法:
当一个静态方法去调用另一个非静态方法时,需要实例化非静态方法的名称,然后才可以进行调用。
//必须实例化后才能调用,可修改所有方法为的静态方法 class Compute
{
//加法
private double Add(double num1,double num2)
{
return num1 + num2;
}
//减法
private double Minus(double num1,double num2)
{
return num1 - num2;
}
//乘法
private double Multiply(double num1,double num2)
{
return num1 * num2;
}
//除法
private double Divide(double num1,double num2)
{
return num1 / num2;
}
}
C#中方法的参数有四种类型:
传值给方法,方法中的变量修改不影响参数列表,复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。
//编写一个方法用于求平方(没有返回值) static void Square(int num) { num *= num; Console.WriteLine("num平方="+num); } static void Main(string[] args) { int num = 10; Console.WriteLine(num); Square(num); Console.WriteLine(num); Console.ReadKey(); }
这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。
ref关键词指定,使用:1.调用函数变量必须非常量;2.调用变量必须初始化。
//编写一个方法用于求平方(没有返回值) 注:Main()函数同上 static void Square(ref int num) { num *= num; Console.WriteLine("num平方="+num); } static void Main(string[] args)
{
int num = 10;
Console.WriteLine(num);
Square(ref num); //主函数中调用时,实参前ref不能少
Console.WriteLine(num);
Console.ReadKey();
}
输出参数:方法声明时,使用out修饰符声明的形参,称为输出参数;
class CalculateClass
{
public static void Calculate(int x, int y, out int add, out int sub)
{
add = x + y;
sub = x - y;
}
}
class Program
{
static void Main(string[] args)
{
int a = 13, b = 19, c, d;
CalculateClass.Calculate(a, b, out c, out d); //调用时,实参前out不能少
Console.WriteLine("a+b={0},a-b={1}", c, d);
Console.ReadKey();
}
}
在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。
class Program
{
public static int AddElements(params int[ ] arr)
{
int sum = 0;
foreach (int i in arr)
{
sum += i;
}
return sum;
}
static void Main(string[] args)
{
int[] a =new int[]{ 1, 2, 3, 4 };
//int sum = AddElements(512, 720, 250, 567, 889); //递一组数值元素
int sum = AddElements(a); //递数组实参,
Console.WriteLine("总和是: {0}", sum);
Console.ReadKey();
}
}
C#允许在函数声明部分定义默认值
1)、参数默认值设定后,调用时可以不用填写有默认值的参数
2)、参数传递顺序,顺序调用在前,指定参数调用在后
static void SayHello(string name, int salary, string text = "普通职工", string profession = "计算机")
{
Console.WriteLine("{0}的工资是:{1},职务是:{2},专业是:{3}",name, salary,text,profession);
}
static void Main(string[] args)
{
SayHello("张三", 2000);
SayHello("张三", 2000,"总经理");
SayHello("张三", 2000, "总经理","电子");
Console.ReadKey();
}
具名参数的使用主要是体现在函数调用的时候。
//全部可选(x,y 均为可选参数)
public static void Demo3(string x = "demo", int y = 5)
{
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadKey();
}
public static void Main()
{
//调用
Demo3(); // x,y不传入实参时,x,y使用默认值 "demo",5
Demo3("similar"); // y不传入实参时,y使用默认值5
Demo3("similar", 10); // x,y都传入实参
Demo3(y: 100); Demo3(y: 100,x:"具名参数测试"); //不分次序
}
方法重载指的就是方法名称相同,但是参数不同。
参数不同,分为两种情况:
注意:方法的重载跟返回值没有关系
class SumUtils
{
public int Sum(int a,int b)
{
return a + b;
}
public double Sum(double a,double b)
{
return a + b;
}
public string Sum(string a,string b)
{
return a + b;
}
public int Sum(int a)
{
int sum = 0;
for(int i = 1; i < a; i++)
{
sum += i;
}
return sum;
} }