一、没有修饰符时
此时函数接收到的值是变量的副本,就算被调用时更改了变量的值,原来的变量值仍不变。
private void Form1_Load(object sender, EventArgs e)
{
string message = "123";
SendMessage(message);
MessageBox.Show(message);//第二次
}
public void SendMessage(string message)
{
message = "456";
MessageBox.Show(message);//第一次
}
第一个显示窗口是“456”,回到主函数时,窗口显示的是“123”;可见主函数中的message值没有变化。
二、out修饰符
变量由调用函数赋值,并且必须赋值(在SendMessage函数中,变量message必须被赋值),此时被调用的是主函数中变量的地址,当调用函数执行结束,主函数中的变量值也会变成调用函数的值。(主函数中变量的值可以为空)
private void Form1_Load(object sender, EventArgs e)
{
string message;//此时变量的值为空
SendMessage(out message);
MessageBox.Show(message);//第二次
}
public void SendMessage(out string message)
{
message = "456";
MessageBox.Show(message);//第一次
}
此时,第一次显示为“456”,就算在主函数中给message赋值了,第二次显示的仍是“456”。
而且out用途最广的是在一个函数中可以有多个返回值
private void Form1_Load(object sender, EventArgs e)
{
double v = SellHouse(98.5, 8356, out string test);
MessageBox.Show(v.ToString());//第一次
MessageBox.Show(test);//第二次
}
public double SellHouse(double area, double price, out string test)
{
test = "123";
return area * price;
}
可以看到在SellHouse函数中返回值只有area*price,但是我们在参数中加入了out修饰的test字符串,这样在第一次显示SellHouse函数的area*price结果,第二次显示test字符串的值。
三、ref修饰符
作用和out修饰符对于变量的变化是类似的
private void Form1_Load(object sender, EventArgs e)
{
string message = "123";
SendMessage(ref message);
MessageBox.Show(message);//第二次
}
public void SendMessage(ref string message)
{
message = "456";
MessageBox.Show(message);//第一次
}
不同点在于out修饰符必须在调用函数中赋值,而可以不在主函数赋值;
ref修饰符可以不再调用函数中赋值,但必须在主函数中赋值。