方法的定义和调用
方法的定义是由: 访问修饰符 可选修饰符 返回值类型 方法名(参数列表) { 方法体构成 return; }如下:
namespace ConsoleApp1
{
internal class Program
{
//public 是访问修饰夫
//static 是可选修饰符 static 下面会说
//int返回值类型
//add方法名 int a,int b方法的形参
public static int Add(int a, int b)
{
return a + b;
}
static void Main(string[] args)
{
//1,2为方法的实际参数
Console.WriteLine(Add(1,2));
}
}
}
方法的调用
方法的调用是由类实例化调用的,我们C#中的代码都需要写在类中,我们通过找到main函数来运行程序,因此我们所有的代码都需要在main函数中间接或直接实现;
namespace ConsoleApp1
{
internal class Program
{
//public 是访问修饰夫
//static 是可选修饰符
//int返回值类型
//add方法名 int a,int b方法的形参
public int Add(int a, int b)
{
return a + b;
}
static void Main(string[] args)
{
//1,2为方法的实际参数
//Console.WriteLine(Add(1,2));
// new 实例化
Program p = new Program();
p.Add(1,2);
}
}
}
访问修饰符
访问修饰符是C#中用来标识成员访问级别的关键修饰符
- public 在任意地方可以访问 通常用于对外公开的接口
- internal 在程序集(项目)中可以访问
- private 只能在当前类或结构体中访问
- protected 只能在当前类以及派生类中可见
- protected internal 对应两种访问权限
补充:类默认是internal级别,嵌套类默认private级别,类的成员默认都是private级别,接口和枚举成员默认public,结构体成员默认是private
可选修饰符
这里单说static ,async等目前接触不到
static修饰符用于声明静态成员,也就是说这些成员属于类本身,而不属于实例本身,这里大致说一下类: 类是一个抽象的概念,我们人是一个统称,我们人都有头,身体等这些相同的元素。不过每个人又是不同的的比如指纹等,也就是说 王明 是由 人 实例化的。 回到话题
如果方法可选修饰符是static 也就是说我们不需要进行实例化操作,这个方法属于类本身我们可以直接调用
namespace ConsoleApp1
{
internal class Program
{
//我们这里使用static声明这个方法为静态成员,因此这个方法是类本身的方法,而不是实例的方法
public static int Add(int a, int b)
{
return a + b;
}
static void Main(string[] args)
{
//1,2为方法的实际参数
//不需要通过实例program 来进行调用,直接在类本身中就可以调用
Console.WriteLine(Add(1,2));
}
}
}
方法的参数与返回值
方法的参数可以是任意类型
方法的参数传递 分为值传递参数 ,引用传递参数,返回值传递参数
值参数传递:会将实参的数据复制一份给形参,也就是说此过程编译器会给方法自动开辟一块空间用于存储形参,方法运行结束形参自动销毁
namespace ConsoleApp1
{
internal class Program
{
//这就是典型的值传参
public static int Add(int a, int b)
{
return a + b;
}
static void Main(string[] args)
{
Add(1,2);
}
}
}
引用参数传递:会将实参的内存地址传递给形参,也就是说在方法中形参发生改变,实参也会改变。我们引用参数传递需要用的ref关键字
namespace ConsoleApp1
{
internal class Program
{
//形参声明前需要加ref
public static void Change(ref int a,ref int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int num1 = 1;
int num2 = 2;
Console.WriteLine($"num1 = {num1}-----num2 = {num2}");
//实参传递时要用ref声明
Change(ref num1,ref num2);
//此时num1和num2 的数据发生了变化
Console.WriteLine($"num1 = {num1}-----num2 = {num2}");
}
}
}
返回值参数传递:一个函数使用return语句只能返回一个数据,我们可以通过out来实现返回两个数据,不过通过out返回的数据存储的时数据的内存地址,跟引用传递类似
namespace ConsoleApp1
{
internal class Program
{
public static int a(out int temp)
{
int num = 0;
temp = 1111;
return num;
}
static void Main(string[] args)
{
int ccc = 222;
int num1= a(out ccc);
//打印ccc为1111 由于进行值参数传递,形参在内部发生改变因此实际参数发生改变
Console.WriteLine(ccc);
//打印num1 此值为函数返回值
Console.WriteLine(num1);
}
}
}
return 可以返回一个函数的返回值,也可以提前结束函数执行,也就是说如果一个函数没有返回值也可以直接return结束该函数,如果一个函数有返回值则必须返回一个数据
方法的重载
方法重载:允许在同一个类下定义多个相同的方法名,但这些方法名相同的方法需要满足条件参数各不相同 编译器区分我们的方法是通过方法签名来完成的。一般用在类似功能,提供代码可读性
方法签名由以下几部分组成:
- 方法名
- 参数类型
- 参数数量
- 参数顺序
namespace ConsoleApp1
{
internal class Program
{
//两个方法的参数数量不一样,因此编译器根据这种不同来区分对应的方法
//方法1
public static void Add(int num1,int num2)
{
Console.WriteLine($"{num1}+{num2} = {num1+num2}");
}
//方法2
public static void Add(int num1, int num2,int num3)
{
Console.WriteLine($"{num1}+{num2}+{num3} = {num1 + num2+num3}");
}
static void Main(string[] args)
{
//此时打印1+2 = 3 使用的是方法1
Add(1, 2);
//此时打印1+2+3 = 6 使用的是方法2
Add(1, 2,3);
}
}
}
递归函数
递归函数属于函数的调用,函数自身调用自身就是递归函数,必须要有return跳出函数
如下一个递归函数得到一个数的乘阶
namespace ConsoleApp1
{
internal class Program
{
public static int resultP(int num)
{
if (num == 1)
return 1;
else
return resultP(num - 1) * num;
}
static void Main(string[] args)
{
int a = resultP(3);
Console.WriteLine(a);
}
}
}