值参数—>值类型:

int y;
Add(y);
void Add(int x)
值参数—>引用类型:创建新对象

class Program
{
static void Main(string[] args)
{
Student stu = new Student() { Name="Tim"};
SomeMethod(stu);//输出的是Tom
Console.WriteLine(stu.Name);//输出的是Tim
}
static void SomeMethod(Student s)
{
s = new Student() { Name = "Tom" };
Console.WriteLine(s.Name);
}
}
值参数—>引用类型:不创建新对象

class Program
{
static void Main(string[] args)
{
Student stu = new Student() { Name="Tim"};
UpdateObject(stu);//输出的是Tom
Console.WriteLine(stu.Name);//输出的还是Tom
}
static void UpdateObject(Student s)
{
s.Name = "Tom" ;
Console.WriteLine(s.Name);
}
}
注:
值参数创建变量副本
对值参数操作永远不影响变量的值
———————————————————————————————————————————
引用参数—>值类型:

参数和变量指向的是内存中同一个地址对参数赋新值则变量也获得新值
static void Main(string[] args)
{
int y = 1;
IWantSideEffect(ref y);
Console.WriteLine(y);//y变为101
}
static void IWantSideEffect(ref int x)
{
x = x+100;
}
——————————————————————————————————————————
引用参数—>引用类型:创建新对象

引用类型由两部分构成:值(栈中:地址)和对象(堆中:数据)
class Program
{
static void Main(string[] args)
{
Student stu = new Student() { Name="Tim"};
IWantSideEffect(ref stu);//输出Tom
Console.WriteLine(stu.Name);//也为Tom
}
static void IWantSideEffect(ref Student s)
{
s=new Student() { Name="Tom"};
Console.WriteLine(s.Name);
}
}
参数和方法引用的是同一个对象,为方法内部创建的新对象
如其中stu和s都引用的为 s=new Student() { Name="Tom"};这个Tom
———————————————————————————————————————————
引用参数—>引用类型:不创建新对象,只改变对象的值

class Program
{
static void Main(string[] args)
{
Student stu = new Student() { Name="Tim"};
Console.WriteLine(stu.Name);//输出Tim
SomeSideEffect(ref stu);//输出为Tom
Console.WriteLine(stu.Name);//仍为Tom
}
static void SomeSideEffect(ref Student s)
{
s.Name="Tom"
Console.WriteLine(s.Name);
}
}
从始至终都在操纵同一个对象:是 Student stu = new Student() { Name="Tim"};这个对象
如果没有ref关键词则为值参数:效果和上面一模一样但机理不一样这种为传值函数在内存中创建了实际参数的副本,stu和s指向的是不同的内存地址,只是两个不同的内存地址中存储的东西相同即存储相同的地址:两个不同的名字指向同一个小朋友,这个小朋友牵着一个气球
class Program
{
static void Main(string[] args)
{
Student stu = new Student() { Name="Tim"};
Console.WriteLine(stu.Name);
SomeSideEffect(stu);
Console.WriteLine(stu.Name);
}
static void SomeSideEffect(Student s)
{
s.Name="Tom"
Console.WriteLine(s.Name);
}
}
举个例子,有A,,B,C三个人,没有ref的话就是A告诉B要吃饭了,B再告诉C要吃饭了;有了ref之后就是A直接告诉C要吃饭了
传值,是复制了一把钥匙持有人的钥匙,开锁改里面的东西。引用,是拿着钥匙持有人的手,直接开锁,改里面的东西
———————————————————————————————————————————
输出参数-->值类型

class Program
{
static void Main(string[] args)
{
Console.WriteLine("please input first number");
string arg1=Console.ReadLine();
double x = 0;
bool b1=double.TryParse(arg1, out x);
if(b1==false)
{
Console.WriteLine("input error");
return;
}
Console.WriteLine("please input second number");
string arg2=Console.ReadLine();
double y = 0;
bool b2=double.TryParse(arg2, out y);
if (b2 == false)
{
Console.WriteLine("input error");
return;
}
double z = x + y;
Console.WriteLine("{0}+{1}={2}",x,y,z);
}
}
输出参数-->引用 类型
数组参数
用params修饰
class Program
{
static void Main(string[] args)
{
int result=Sum(1,2,3);//不需要提前声明一个数组,会自动声明一个
Console.WriteLine(result);
}
static int Sum(params int[] intarray)//用了params修饰
{
int sum = 0;
foreach (var i in intarray)
{sum += i; }
return sum;
}
}
字符类型
static void Main(string[] args)
{
string str = "Tim;Tom,Amy.Lisa";
string[] result = str.Split(';', ',', '.');
foreach (var name in result)
{
Console.WriteLine(name);//输出Tim Tom Amy Lisa
}
}
C#中传值、引用与数组参数解析
778

被折叠的 条评论
为什么被折叠?



