原来在c#中定义变量\常量需要指定明确的数据类型,如int,string等,为此c#中提供了一个关键字var变量(varlable),专门用来定义定义变量的,它定义的变量不需要专门指定数据类型,变量会根据变量值来推断数据类型,它的出现是为了编码方便. var只能出现在局部作用域.
作用域在c#中分为,命名空间内的作用域,类内的作用域,以及局部作用域(方法内部的作用域).作用域从小到大排列依次为局部作用域<class作用域<namespace作用域.
命名空间中不能包含变量,方法,语句等,能包含类.
var valc =new Cale();
calc.Add(10,20);
10,20称为方法的实际参数,简称实参,实参传递到形参是有需求的:1.数据类型必须匹配,2.实参的顺序要和形参的顺序保持一致.如果开发者传递实参时没有和形参的顺序保持一致,又想让代码执行成功,需要借助命名参数,即给实参起个别名,实例别名就是形参的名字,命名参数可以让开发者给实参传递到指定的位置.
Cale.Add(b:10,a:20);
public class Cale{
public static int Add(int a, int b){
Condole.WriteLine{$"a的值:{a},b的值{b},结果:{a+b}");
return a+b;
}
}
有返回值的方法,可以用变量来接收方法的返回值
在一个方法中,参数的个数过多,影响方法的使用,这时候可以使用可变参数来优化代码,即params参数(可变参数).这里的可变指的是个数可变而不是类型可变.出了可变参数我们还可以使用数组来解决参数过多的情况.
public class MyClass
{
public void Add(int a,int b, int c,int d){
console.weiteline($"a的值:{a},b的值:{b},c的值:{c},d的值:{d}");
}
public void Add(int[] arr){
console.writeline($"索引0的值:{arr[0]},索引1的值:{arr[1]},索引2的值:{arr[2]},索引3的值:{arr[3]}");
}
public void Add(int a,params int[]){
console.writeline($"索引0的值:{arr[0]},索引1的值:{arr[1]},索引2的值:{arr[2]},索引3的值:{arr[3]},a的值{a}");
}
}
可变参数的语法要求:1.使用params关键字来标识此参数是可变参数.2.可变参数必须是方法的最后一个形参.3.可变参数的个数是不确定的,范围是0到无穷个.
out输出参数:不需要借助return,借助out也能得到与return相同的效果.
ref引用传递,在方法中修改ref参数,会影响外部的变量,值传递的参数,方法内部修改后无法印象外部的参数.引用传递的参数,方法内部修改会影响外部的参数.
当调用多个方法时,如果方法之间没有联系,了解各个方法执行顺序:1.代码有执行顺序一般是从上到下执行,先执行fun1在执行fun2
var class1 =new Class2();
class1.Fun1();
class1.Fun2();
public void Fun1()
{
Console.WriteLine("Fun1业务逻辑");
Console.WriteLine("Fun1更多的业务逻辑省略");
}
public void Fun2()
{
Console.WriteLine("Fun2业务逻辑");
Console.WriteLine("Fun2更多的业务逻辑省略");
}
2.当代码遇见开发者封装的方法时,会进入方法体执行,执行方法体业务逻辑后,在返回调用方法处.如果代码遇见的不是开发者封装的方法,这时候并不会进入方法体,原因是类库提供的方法源码是隐藏的.
当调用的方法有联系,了解各个方法的执行顺序:进入的顺序是方法嵌套的顺序.fun3-->fun4-->fun5,执行方法体的顺序是fun3-->fun4-->fun5,方法体执行完的顺序是fun5-->fun4-->fun3
public void Fun3()
{
Console.WriteLine("Fun3业务逻辑");
Console.WriteLine("Fun3更多的业务逻辑省略");
Fun4();
}
public void Fun4()
{
Console.WriteLine("Fun4业务逻辑");
Console.WriteLine("Fun4更多的业务逻辑省略");
Fun5();
}
public void Fun5()
{
Console.WriteLine("Fun5业务逻辑");
Console.WriteLine("Fun5更多的业务逻辑省略");
}
栈帧,就是执行方法时,给方法分配的内存空间,方法执行时,只要分配了内存空间,调用方法,会进入此内存空间.内存空间的调用叫做调用栈,调用栈是一个u型结构,遵循先进后出的原则.
在一个方法中调用自己本身的行为叫做递归,递归简而言之;方法在调用自己.递归调用有一个自循环或者自调用的.递归一定要有一个出口(方法能停止下来的).递归如果没有出口就是死循环,出现栈溢出的错误.