C#中的方法

普通方法的定义:无参无返回值。
void sun()
{
    Console.WriteLine("这是一个函数,也叫一个方法(无参无返回值)");
}
sun(); //在同一个类中,不需要实例化,即可直接调用,这种叫函数调用。
Pro p = new Pro();
p.sun();//类外方法调用,其实这里也是一个类,C#只有方法没有函数,也可以说函数就是方法。

class Pro 
{
    public void sun() { Console.WriteLine("Python有这样一句话:类中定义叫方法,类外定义叫函数。"); }
}

有参有返回值:另外【有参无返回值,无参有返回值】这两种不在做演示

Pro p = new Pro();
string s = p.sun("void空,无返回值;改string就是返回一个字符串,带返回值的方法必须return");//实参可以不用传值,返回默认值实参
Console.WriteLine(s);  
class Pro 
{
    public string sun(string str, int i=0) //str是形参,i是实参,实参必须定义在行参后面
    { 
        return str + i; //返回的是字符串string
    }
}

命名参数:改变传递时参数的位置

Pro p = new Pro();
string s = p.sun(i: 11, str: "利用命名参数指定传递,改变参数位置。");
Console.WriteLine(s);
class Pro
{
    public string sun(string str, int i ) //正常传递,是先str,在传i
    {
        return str + i; 
    }
}

一、方法参数传递关键字:ref,out,params

栈:存放值类型会被初始化;堆:存放引用类型的不会被初始化数据。
将值类型改为引用类型传递:【ref关键字和out关键字】,两个意思是一样的只是使用方法不一样。
ref和out的区别

//ref:传递前必须初始化赋值,有进有出
int a = 10;
ChangeNum(ref a);//方法也需要有ref关键字
Console.WriteLine("\n关键字ref下的a = {0}", a);//此时a = 11  

static void ChangeNum(ref int num)//传参时也需要有ref关键字
{
    num++;//ref,在方法体中可以不对变量赋值,返回的就是初始化的值,不会报错。
}

//out:传递前不需要赋值,只出不进。
int i;
ChangeNum2(out i);
Console.WriteLine("\n关键字out下的i = {0}", i);

static void ChangeNum2(out int num)
{
    num = 111; //out规定:方法体返回前必须给变量赋值。否则会报错。
}
params多参数传递:不能与ref、out修饰同一个参数,不能一起使用,且params必须定义最后一个参数,当数组传递。
Testt("params多参数传递,", 99, 88, 77, 44, 55, 66);//params会自动识别为同类型数据,这里自动识别为一个数组,或者直接传一个数组也可以

static void Testt(string str, params int[] a)//params关键字必须是最后一个参数,不要给数组定义长度。
{
    int sum = 0;
    foreach (int i in a) { sum += i; }
    Console.WriteLine("{0}这个班的总成绩是:{1}", str, sum);
}

二、方法重载

方法名相同,参数不同。

Pro p = new Pro();
p.sun();
string s = p.sun("只要方法名相同,参数不同都叫方法重载,跟有无返回值无关");
Console.WriteLine(s);
class Pro
{
    public void sun()
    {
        Console.WriteLine("方法重载");
    }
    public string sun(string str)
    {
        return str;
    }
}

三、构造方法

与类同名的方法,不能有返回值,可以重载

Pro p = new Pro();//默认无参构造实例化,调用时自动运行
Pro p2 = new Pro("构成方法用于传递初始化数据");
Console.WriteLine(p2.str);

class Pro
{
    public Pro()
    {
        Console.WriteLine("每个类默认自带无参构造,当定义了有参后,隐藏的无参构造就消失,代码需要重新写上无参才生效。");
    }
    public Pro( string str1) //str1只作用方法体内,str作用于整个类
    {
        this.str = str1; //this表示当前类
    }
    public string str ="";//字段
}

四、回调函数

相当于循环,方法掉用方法本身,自己调用自己。

sun();

void sun()
{
    Console.WriteLine("没有条件判断,直接回调就是死循环");
    sun();//自己调用自己
}

 五、匿名方法

匿名函数也叫【lamdba表达式】,语法:(参数列表)=>{方法体}
对典型的:()=>{ } //无参无返回值

Func<int, int, int> f  = (a, b) => { return a * b; }; //两个参数一个返回值,因为方法需要调用所以需要配合委托来学习。

 

posted @ 2022-10-13 04:05  Akai_啊凯  阅读(77)  评论(0编辑  收藏  举报