// 函数定义
public int Test(int i, ref string str1, out string str2)
{
if (1 == i)
{
str1 = "liao";
//str1 = null;
str2 = "huihui";
//str2 = null;
return 0;
}
else
{
// 这里对 ref 修饰的 str1 的操作可以不做任何处理,则在函数调用时取值
str2 = "hello world";
return 1;
}
}
// 函数调用
main()
{
int i = Convert.ToInt32(textBox1.Text.ToString());
//ref 需要初始化
//string str1; // 错误,编译通不过
//string stri = null;
string str1 = "liaohuihui";
//out 不需要初始化
//string str2; // 这里对 out 修饰的 str2 的操作可以仅仅只做声名
//string str2 = null;
string str2 = "liaohuihui";
int j = ConnectMySql.Test(i, ref str1, out str2);
MessageBox.Show(str1);
MessageBox.Show(str2);
MessageBox.Show(Convert.ToString(j));
}
以 ref 修饰的变量在定义的时候要求不严格, 三种情况都是可以的:1. 赋值;2. 初始化为空;3. 不做任何处理
但在调用的时候较为严格,必须赋值(空值也可)。要说明的是:只要他在定义的时候被赋值过(包括空值),调用函数时都取定义时所赋的值,但是如果在定义时不做任何处理,则取调用时所赋的值。
以 out 修饰的变量在定义的时候要求较为严格 仅两种情况:1. 赋值;2. 初始化为空
但在调用的时候要求相对宽松,不需要任何赋值或初始化为空操作,输出的结果也就只能取在定义的时候所赋的值。
既然是以参数作为返回值一般都在定义时赋值,以上辨析为了彻底弄清二者的区别。
以上是 Test 后的结果,如有错误之处,敬请帮忙修正。