C#中的方法

99 阅读5分钟

方法的定义和调用

方法的定义是由: 访问修饰符 可选修饰符 返回值类型 方法名(参数列表) { 方法体构成 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#中用来标识成员访问级别的关键修饰符

  1. public 在任意地方可以访问 通常用于对外公开的接口
  2. internal 在程序集(项目)中可以访问
  3. private 只能在当前类或结构体中访问
  4. protected 只能在当前类以及派生类中可见
  5. 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结束该函数,如果一个函数有返回值则必须返回一个数据

方法的重载

方法重载:允许在同一个类下定义多个相同的方法名,但这些方法名相同的方法需要满足条件参数各不相同 编译器区分我们的方法是通过方法签名来完成的。一般用在类似功能,提供代码可读性

方法签名由以下几部分组成:

  1. 方法名
  2. 参数类型
  3. 参数数量
  4. 参数顺序
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);
        }
    }
}