方法的定义与调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _03_方法的定义与调用
{
internal class Program
{
static void Main(string[] args)
{
//方法:函数
//就是把一系列相关的代码组织(封装)到一起,用于执行一系列的任务的代码块
//一个方法分为两部分: 1. 方法的定义(声明) 2.方法的调用(执行)
//Math.Max();
//2.方法的调用:在方法的名字后面添加() ()称之为执行运算符
Console.WriteLine(1);
Test();
Console.WriteLine(2);
Test();
Test();
//练习:封装一个方法,在控制台输入10次吴亦凡
//特定的功能:输出10次吴亦凡
MyWrite();
MyWrite();
MyWrite();
// 在控制台打印13次吴亦凡;
}
//1.方法的定义, 一个方法一般情况下,写在一个类中
/*
* 格式: 访问修饰符 返回值类型 方法的名字 (参数列表){
* 这个方法的代码块
* }
*
*
* 访问修饰符: public """暂且先记住这一个"""
* 返回值类型: void 没有返回值
* 方法的名字 :自定义,一个以大驼峰命名(见名知意)
*/
//方法在声明之后,会发现无法再Main中使用,因为Main是静态方法,Test不是静态方法,所以两个方法之间是不互通的,只能把Test修饰成静态方法
//注意!!!! 不是所有的方法都需要static关键字修饰成静态方法
//''''暂且''''' 在所有的方法上添加static关键字(后续详解)
public static void Test()
{
Console.WriteLine("我在C#中学习到的第一个方法");
}
public static void MyWrite()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("吴亦凡");
}
}
}
}
方法的参数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _04_方法的参数
{
internal class Program
{
static void Main(string[] args)
{
//上个课件中的练习:方法的功能十分的单一
//如果我们需要输出13次吴亦凡,就需要再次封装一个方法
//这两个需求的功能是相似的,我们就可以通过传递参数,来控制一个方法做出不同的功能
//参数: 形参和实参
//形参: 形式参数,方法在定义的时候,声明在()里面的变量,这个形参的值由实参决定
//实参: 实际参数,方法在调用的时候,写在()中的数据,这个数据将会赋值给对应的形参
Test(1);
MyWrite1();
MyWrite2(1);
MyWrite3(2, "罗志祥");
MyWrite3(5, "李云迪");
MyWrite4(6, "李云迪");
MyWrite4(6);
int c = 5;
string s = "aaaa";
//传递参数的时候,不仅可以直接写数据,也可以写一个变量,会自动将变量的值传递给形参
MyWrite4(c, s);
}
public static void Test(int x)
{
Console.WriteLine(x);
}
//原始方法 1.0
//功能:打印10次吴亦凡
public static void MyWrite1()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("吴亦凡");
}
}
//2.0 打印任意次数的吴亦凡
public static void MyWrite2(int count)
{
for (int i = 0; i < count; i++)
{
Console.WriteLine("吴亦凡");
}
}
//3.0 打印任意次数 任意内容
public static void MyWrite3(int count,string name)
{
for (int i = 0; i < count; i++)
{
Console.WriteLine(name);
}
}
//4.0版本 如果传入内容, 则打印传入的内容,如果不传入内容,则打印默认值"劣迹明星"
//方法在定义的时候,可以给形参设置一个默认值,当方法调用的时候,如果没有传递参数,则使用这个默认值(这个参数是可选参数)
//注意:可选参数必须写在必选参数的后面
//比如: f(int a,int b) √ 两个都是可选参数
//f(int a,int b=666) √ 可选参数在必选参数的后面
//f(int a=888,int b=666) √ 两个参数都是可选参数
//f(int a=888,int b) X 可选参数,不能设置在必选参数的前面
public static void MyWrite4(int count, string name="劣迹明星")
{
for (int i = 0; i < count; i++)
{
Console.WriteLine(name);
}
}
//注意:1.形参的类型和实参的类型要保持一致
//2.形参的个数和实参的个数也要保持一致
}
}
方法参数的赋值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _05_方法参数的赋值
{
internal class Program
{
static void Main(string[] args)
{
//值类型
//方法调用的时候,如果传入的是变量,或者是表达式,都会先进行计算,然后再传递
//也就是说,方法调用传递变量,传递过去的是这个变量的值,而不是变量本身
Test1(10);
Test1(5 + 5);
int z = 10;
Test1(z);
Console.WriteLine($"z=={z}");
//原理:
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;
}
}
引用传参
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _06_引用传参
{
internal class Program
{
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);
/*
* 总结:
* 方法内部修改形参的时候,外部是否会收到影响
*
*
* 1. 看方法内部是怎么样改的 如果是 形参=xxx 外部不会受到影响
* 如果是 形参.xxx=xxxx 外部受影响
* 2. 如果使用的是引用传递(ref) 内部使用 形参=xxx 外部也会受到影响
*/
}
//给方法的某个形参的前面加上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);
}
}
}
方法的返回值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _07_方法的返回值
{
internal class Program
{
static void Main(string[] args)
{
//Math.Max(10, 20);
//有些方法的功能仅仅用于输入工作,调试工作
//有些方法的功能以计算为主要目标,一般在方法执行结束后,获取结果
string str = Test();
Console.WriteLine(str);
//需求:定义一个函数,传入两个参数,返回两个参数的和
int a = 100;
int b = 200;
Console.WriteLine(Sum(a,b));
}
//方法通过返回值将方法内部计算的结果返回给调用的地方
//需要在定义方法的位置,指定方法的返回值类型,如果没有返回值 写void
public static string Test()
{
//Console.WriteLine("吴亦凡");
//注意:方法标注了返回值类型,那么这个方法内部就必须要返回对应类型的数据
return "吴亦凡123";
}
public static int Sum(int x,int y)
{
//return 关键字不仅可以用于返回数据,还可以用于终止方法的执行
//return 关键字后面的代码不会执行
return x + y;
// Console.WriteLine(x+y);
}
}
}
out输出参数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _08_out输出参数
{
internal class Program
{
static void Main(string[] args)
{
//ref 输入关键字
//out 输出关键字
//return 关键字用于返回方法执行的结果,但是只能返回一个数据,如果需要同时返回多个数据到调用的时候,就可以使用输出关键字
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}");
/*
* out和ref的区别
* 1.out传递参数,可以不同赋值
* 2.out传递的参数,在方法中必须赋值
* 3.ref传递参数,可以在方法中获取值,out传递参数,只能在赋值之后取值(out不能传递进去数据)
*
*
* ref 的主要作用是为了传入数据,因此传入的时候必须进行赋值
* out的主要作用是为了传出数据,因此在传入的的时候可以不进行初始化.并且在方法中必须赋值
*/
}
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}");
}
}
}
参数列表
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _09_参数列表
{
internal class Program
{
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)
{
}
}
}
作用域
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10_作用域
{
internal class Program
{
static void Main(string[] args)
{
//作用域: 就是一个变量可以使用的范围
//局部作用域:声明的变量仅仅能在某个代码块中使用
int a = 6666;
Console.WriteLine(a);
}
public static void Test() {
// Console.WriteLine(a);
int b = 10;
Console.WriteLine(b);
{
Console.WriteLine(b);
int c = 20;
}
//Console.WriteLine(c);
for (int i = 0; i < 10; i++)
{
}
}
}
}