C# 方法

方法的定义与调用

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++)
            {
​
            }
​
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值