简介
C#方法:函数就是把一系列相关的代码组织(封装)到一起,用于执行一系列的任务的代码块
一个方法分为两部分: 1. 方法的定义(声明) 2.方法的调用(执行)
方法的调用:在方法的名字后面添加() ()称之为执行运算符
方法的定义:
一个方法一般情况下,写在一个类中
格式: 访问修饰符 返回值类型 方法的名字 (参数列表) {
这个方法的代码块
}
访问修饰符: public """暂且先记住这一个"""
返回值类型: void 没有返回值
方法的名字 :自定义,一个以大驼峰命名(见名知意)
注意: 方法在声明之后,会发现无法再Main中使用,因为Main是静态方法,Test不是静态方法,所以两个方法之间是不互通的,只能把Test修饰成静态方法
特别注意!!!! 不是所有的方法都需要static关键字修饰成静态方法
static void Main(string[] args)
{
Test();
}
//方法的调用需要在Main函数中去调用
public static void Test()
{
Console.WriteLine("我在C#中学习到的第一个方法");
}
方法的参数
当我们定义了一个方法的时候,在使用的过程中会发现无法在调用过程去更改里面的值,只能在方法的内部去更改初始值,这时就需要用到了方法的参数,默认情况下方法是可以没有参数也就是无参方法,当需求不再适合无参方法时,就会用到有参方法,而有参方法不仅可以接受一个参数,也可以接受多个参数
参数分为两种:形参和实参
形参: 形式参数,方法在定义的时候,声明在()里面的变量,这个形参的值由实参决定
实参: 实际参数,方法在调用的时候,写在()中的数据,这个数据将会赋值给对应的形参
static void Main(string[] args)
{
MyWrite2(1);
MyWrite3(2, "上午");
MyWrite3(5, "下午");
}
// 一个参数:打印count次数的吃饭了
public static void MyWrite2(int count)
{
for (int i = 0; i < count; i++)
{
Console.WriteLine("吃饭了");
}
}
// 多个参数的方法:打印conut次数的name
public static void MyWrite3(int count,string name)
{
for (int i = 0; i < count; i++)
{
Console.WriteLine(name);
}
}
方法参数的赋值
方法参数的赋值分为两种:值类型、引用类型
值类型:
方法调用的时候,如果传入的是变量,或者是表达式,都会先进行计算,然后再传递
也就是说,方法调用传递变量,传递过去的是这个变量的值,而不是变量本身
引用类型
当给方法传递一个引用类型的时候,传递的也是这个变量的值
只不过引用类型的变量存储的数据的内存地址,所以传递进去的也是内存地址,相当于两个地方操作的是一个内存地址,一个改变,另一个也会发生改变
static void Main(string[] args)
{
Test1(10);
//原理
int c = 2;
int b = c;
b = 20;
Console.WriteLine($"c=={c}");
People p1= new People() { Name="李四"};
Test2(p1);
Console.WriteLine(p1.Name);//张三
//原理:
People p2 = new People() { Name = "李四" };
People p3 = p2;
p3.Name = "张三;
Console.WriteLine(p2.Name);
}
public static void Test1(int x)
{
Console.WriteLine($"传入的参数为{x}");
x = 20;
}
public static void Test2(People p)
{
Console.WriteLine($"传入的参数p.name为{p.Name}");
p.Name = "张三";
}
}
//创建的一个类
class People
{
public string Name;
}
引用传参
方法传递参数有两种方案:
值传递:(值参数):方法默认的传递方式,这种方式调用方法,会在方法执行的时候,声明一个新的变量接收一个参数,实参的值会赋值给这个新的变量,当我们传递的数据类型不同的时候,也会出现不同的效果
当传递的是一个值类型的数据的时候,方法内部修改形参,不会影响外部,当传递的是一个引用类型的数据的时候,方法内部修改形参,会影响外部
引用传递(引用传参):当传递一个基本数据类型的时候,方法内部修改形参,会影响外部
当方法内部需要修改传递进来的变量的时候,就需要使用引用传递
static void Main(string[] args)
{
int x = 88888;
//使用引用传递的时候,传递变量就是传递的这个变量本身,而不是变量里面保存的值
Test(ref x);//传递参数的时候,必须加上ref关键字
Console.WriteLine("x:"+x);
//需求:定义一个函数,交换a和b的值
int a = 6666;
int b = 7777;
Huan(ref a, ref b);
Console.WriteLine(a);
Console.WriteLine(b);
}
//给方法的某个形参的前面加上ref关键字,这个参数就将进行引用传递(直接传递变量本身)
public static void Test( ref int a)
{
Console.WriteLine("参数"+a);
a = 9999;
}
public static void Huan( ref int x,ref int y)
{
(x, y) = (y, x);
}
总结:
方法内部修改形参的时候,外部是否会收到影响
1. 看方法内部是怎么样改的 如果是 形参=xxx 外部不会受到影响
如果是 形参.xxx=xxxx 外部受影响
2. 如果使用的是引用传递(ref) 内部使用 形参=xxx 外部也会受到影响
方法的返回值
方法的返回值:方法通过返回值将方法内部计算的结果返回给调用的地方,需要在定义方法的位置,指定方法的返回值类型,如果没有返回值 写void
需要注意的是:当方法在定义时添加了返回值的类型,那么方法内部就必须要有返回对应类型的数据
static void Main(string[] args)
{
string str = Test();
Console.WriteLine(str);
//需求:定义一个函数,传入两个参数,返回两个参数的和
int a = 100;
int b = 200;
Console.WriteLine(Sum(a,b));
}
public static string Test()
{
//注意:方法标注了返回值类型,那么这个方法内部就必须要返回对应类型的数据
return "张三123";
}
public static int Sum(int x,int y)
{
//return 关键字不仅可以用于返回数据,还可以用于终止方法的执行
//return 关键字后面的代码不会执行
return x + y;
// Console.WriteLine(x+y);
}
输出参数与输入参数
ref 输入关键字
out 输出关键字
return 关键字用于返回方法执行的结果,但是只能返回一个数据,如果需要同时返回多个数据到调用的时候,就可以使用输出关键字
两者之间的区别:
1.out传递参数,可以不同赋值
2.out传递的参数,在方法中必须赋值
3.ref传递参数,可以在方法中获取值,out传递参数,只能在赋值之后取值(out不能传递进去数据)
ref 的主要作用是为了传入数据,因此传入的时候必须进行赋值
out的主要作用是为了传出数据,因此在传入的的时候可以不进行初始化.并且在方法中必须赋值
总结:ref 可以把值传到方法里,也可以把值传到方法外;out 只可以把值传到方法外
注意:string 作为特殊的引用类型,其操作是与值类型看齐的,若要将方法内对形参赋值后的结果传递出来,需要加上ref 或 out 关键字。
static void Main(string[] args)
{
int a = 1;
int b = 2;
Test1(ref a, ref b);
Console.WriteLine($"a=={a},b=={b}");
int c;
int d;
Test2(out c, out d);
Console.WriteLine($"c=={c},d=={d}");
}
public static void Test1(ref int x ,ref int y)
{
Console.WriteLine($"Test1方法中x:{x}y:{y}");
x = 30;
y = 40;
}
public static void Test2(out int x, out int y)
{
x = 30;
y = 40;
Console.WriteLine($"Test2方法中x:{x}y:{y}");
}
参数列表
一个方法除了可以接收固定个数的参数外,还可以接收未知数量的参数
当我们需要参数要求多的时候就可以去使用参数列表,如果当一味的只使用多参数方法,会使我们的代码量变大,代码变得臃肿,而使用参数列表就可以使代码变得整洁,方便我们查询和解决bug
优点:代码整洁
当需求变换时不必再去修改方法
格式:params 数据类型[] 参数的名字
static void Main(string[] args)
{
//一个方法除了可以接收固定个数的参数外,还可以接收未知数量的参数
Sum(10,20,20,5);
Console.WriteLine(Sum(101,20, 5));
Test(1, "a", "d", "a");
}
//参数列表的格式 : params 数据类型[] 参数的名字
public static int Sum(params int[] nums)
{
int sum = 0;
//获取参数的长度,就是参数的个数
Console.WriteLine(nums.Length);//3
//索引 获取参数列表的某一个值 索引从0开始 0 表示获取第一个值 1表示获取第二个值....
//Console.WriteLine(nums[0]);
//Console.WriteLine(nums[1]);
//Console.WriteLine(nums[2]);
//Console.WriteLine(nums[3]);
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
// sum = sum + nums[i];
sum += nums[i];
}
return sum;
}
public static void Test(int a,string s,params string[] str)
{
}