关于方法

  • C#中局部变量的有效范围中不允许有同名的,{}里面的也不可以

方法传值

对于值类型来说,将变量在v1、v2传入方法,a、b会复制v1、v2的值。此时有4个变量,a、b的任何操作无法影响v1、v2

void DoSth(int a,int b) {
	a++;
	b++;
	Console.WriteLine("方法内部\ta={0},b={1}",a,b);
}
int v1=0,v2=0;
DoSth(v1,v2);
Console.WriteLine("方法外部\ta={0},b={1}",v1,v2);
---out---
方法内部  a=1,b=1
方法外部  a=0,b=0

引用传值

引用传值还是比较简单的,就是传递一个引用,方法内改变会影响方法外

using System;

class Hello
{
    static void Main()
    {
        MyClass myclass=new MyClass();
        Console.WriteLine("前\t"+myclass.age);
        Hello.DoSth(myclass);
        Console.WriteLine("后\t"+myclass.age);
    }
    static void DoSth(MyClass myclass){
        myclass.age=12;
    }
}
class MyClass{
    public int age{get;set;}
} 
---
前      0
后      12

使用ref方式传递参数

仅仅对于值类型有影响,使用ref后,方法内对于值类型的改变,同样会影响到方法外的;
引用类型,天生传递引用,必定会影响

引用类型在方法内重新绑定的影响

myOut.age默认值是0,在方法外使myOut.age为111。进入方法DoSth后,myMethod引用将指向myOut的堆地址,所以此时myMethod.age=myOut.age=111。
但是当myMethod进行重新绑定后,c#会在内存中堆重新生成一个MyClass对象并绑定myMethod,所以此时myMethod.age=0。此时,内存中存在两个MyClass的实例,当方法结束后,myMythod的生命周期结束,内存中仅存在myOut的实例。

注意,如果类似于(ref myMethod),那么,方法内对于myMethod的影响会影响myOut

using System;

class Hello
{
    static void Main()
    {
        MyClass myOut=new MyClass();
        myOut.age=111;;
        Hello.DoSth(myOut);
        Console.WriteLine("方法外面\t"+myOut.age);
    }
    static void DoSth(MyClass myMethod){
        Console.WriteLine($"传入时值\t{myMethod.age}");
        myMethod=new();
        Console.WriteLine($"改变后值\t{myMethod.age}");
    }
}
class MyClass{
    public int age{get;set;}
}
---
传入时值        111
改变后值        0
方法外面        111

方法的重载

方法的重载只和方法的签名有关,在这里就是需要形参有不同(类型、数目、顺序)

//重载失败--和返回类型无关
public void DoSth(int a)
public int  DoSth(int a)
//重载失败--和限定修饰符无关
public void DoSth(int a)
private void  DoSth(int a)    
//重载成功    
public void DoSth(int a)
public void DoSth(int a,int b)
//重载成功 
public void DoSth(int a)
public void DoSth(double a)
posted @ 2022-12-05 22:13  牧绮姬  阅读(28)  评论(0编辑  收藏  举报