- 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)
标签:DoSth,int,age,myOut,关于,方法,void,myMethod
From: https://www.cnblogs.com/lovecxc/p/16953727.html