引用类型参数传递测试(内容主要来自MSDN)
更详细的说明请参照MSDN"传递参数"
1.通过值传递引用类型
例如传递数组change(string[] str),这种方式可以改变数组的值,相当于使用了ref,但是它和ref还是有区别的,这时如果使用new重新定义数组的维数,则改变是local的,不会影响到函数change以外的str
2.通过引用传递引用类型
这种传递是明确使用ref,例如change(ref string[] str),这种方式和上面唯一的区别在于即使在函数内使用new重新定义数组也会影响到被引用的原始值,也就是change以外的str也随着change的改变而改变,是绝对的指针引用方式
以下是我的总结
-------------------------
3.对象是通过引用传递的,相当于前面使用ref
4.你可以在对象引用前加ref,这种调用和3的结果是一样的
5.对结构类型的参数是通过值传递的,函数内的改变不会影响函数外的原始值
6.接口相当于对象也是通过引用传递的,他的情况和3完全相同
具体测试代码如下:
-------------------------
using System;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
//1.通过值传递引用类型
Console.WriteLine("1.通过值传递引用类型");
TestValueRef tvr = new TestValueRef();
tvr.Test();
//2.通过引用传递引用类型
Console.WriteLine("2.通过引用传递引用类型");
TestValueRefByRef tvrbr = new TestValueRefByRef();
tvrbr.Test();
//3.交换字符串
//4.测试传递对象是否是引用类型
Console.WriteLine("4.测试传递对象是否是引用类型");
TestTest2 t = new TestTest2();
t.Test();
//5.测试传递结构是否是引用类型
Console.WriteLine("5.测试传递结构是否是引用类型");
TestStruct testStruct = new TestStruct();
testStruct.Test();
//6.测试传递接口是否是引用类型
Console.WriteLine("6.测试传递接口是否是引用类型");
TestInterface testInterface = new TestInterface();
testInterface.Test();
Console.Read();
}
}
class TestValueRef
{
public void Test()
{
string[] str = new string[5]{"1","2","3","4","5"};
print(str,"原始数据");
change(str);
print(str,"更改结束");
}
private void change(string[] str)
{
str[0] = "333";
print(str,"更改数组的一个值");
str = new string[6]{"0","1","2","3","4","5"};
print(str,"更改函数内改变数组的维数");
}
private void print(string[] str,string strMsg)
{
Console.WriteLine();
Console.WriteLine(strMsg);
foreach (string s in str)
{
Console.WriteLine(s);
}
}
}
class TestValueRefByRef
{
public void Test()
{
string[] str = new string[5]{"1","2","3","4","5"};
print(str,"原始数据");
change(ref str);
print(str,"更改结束");
}
private void change(ref string[] str)
{
str[0] = "333";
print(str,"更改数组的一个值");
str = new string[6]{"0","1","2","3","4","5"};
print(str,"更改函数内改变数组的维数");
}
private void print(string[] str,string strMsg)
{
Console.WriteLine();
Console.WriteLine(strMsg);
foreach (string s in str)
{
Console.WriteLine(s);
}
}
}
class TestObjectRef
{
public string strTest = "this is a test";
}
class TestTest2
{
public void Test()
{
TestObjectRef o = new TestObjectRef();
Console.WriteLine(o.strTest);
Change(ref o);
Console.WriteLine(o.strTest);
}
public void Change(ref TestObjectRef o)
{
o.strTest = "change object";
Console.WriteLine(o.strTest);
}
}
struct MyStruct
{
public string str1;
public string str2;
public string str3;
}
class TestStruct
{
public void Test()
{
MyStruct myStruct = new MyStruct();
myStruct.str1 = "str1";
myStruct.str2 = "str2";
myStruct.str3 = "str3";
print(myStruct,"更改前");
Change(myStruct);
print(myStruct,"更改后");
}
public void Change(MyStruct myStruct)
{
myStruct.str1 = "change1";
myStruct.str2 = "change2";
myStruct.str3 = "Change3";
print(myStruct,"更改中");
}
public void print(MyStruct myStruct,string strMsg)
{
Console.WriteLine();
Console.WriteLine(strMsg);
Console.WriteLine(myStruct.str1);
Console.WriteLine(myStruct.str2);
Console.WriteLine(myStruct.str3);
}
}
class TestInterface
{
public void Test()
{
SqlCommand cmd =new SqlCommand();
cmd.CommandText = "test";
Console.WriteLine(cmd.CommandText);
IDbCommand Icmd = (IDbCommand)cmd;
Change(Icmd);
Console.WriteLine(cmd.CommandText);
}
public void Change(IDbCommand iDb)
{
iDb.CommandText = "change";
Console.WriteLine(iDb.CommandText);
}
}
}