参考文章:http://www.cnblogs.com/slmk/archive/2012/03/19/2406429.html
说明:https://msdn.microsoft.com/zh-cn/library/14akc2c7.aspx
探究ref
对值类型和引用类型的影响
测试代码:
public class TestRefClass
{
public void TestPrint()
{
Console.WriteLine("\n-------------- 对比1 ---------------");
// ref 对 值类型的作用
int testInt = 0;
Console.WriteLine("值类型 = " + testInt);
TestFunc1(testInt);
Console.WriteLine("测试1 = "+ testInt);
testInt = 0;
TestFunc2(ref testInt);
Console.WriteLine("测试2 = " + testInt);
Console.WriteLine("\n-------------- 对比2 ---------------");
//ref 对 引用类型的作用
DataClass m_ref = new DataClass();
Console.WriteLine("原值 = " + m_ref.GetHashCode() + " content = " + m_ref.content);
TestFunc3(m_ref);
Console.WriteLine("测试3 = " + m_ref.GetHashCode() + " content = " + m_ref.content);
m_ref = new DataClass();
Console.WriteLine("原值 = " + m_ref.GetHashCode() + " content = " + m_ref.content);
TestFunc4(ref m_ref);
Console.WriteLine("测试4 = " + m_ref.GetHashCode() + " content = " + m_ref.content);
Console.WriteLine("\n-------------- 对比3 ---------------");
m_ref = new DataClass();
Console.WriteLine("原值 = " + m_ref.GetHashCode() + " content = " + m_ref.content);
TestFunc5(m_ref);
Console.WriteLine("测试5 = " + m_ref.GetHashCode() + " content = " + m_ref.content);
m_ref = new DataClass();
Console.WriteLine("原值 = " + m_ref.GetHashCode() + " content = " + m_ref.content);
TestFunc6(ref m_ref);
Console.WriteLine("测试6 = " + m_ref.GetHashCode() + " content = " + m_ref.content);
}
void TestFunc1(int value)
{
value = 1;
}
void TestFunc2(ref int value)
{
value = 2;
}
void TestFunc3(DataClass dataClass)
{
dataClass.content = 3;
}
void TestFunc4(ref DataClass dataClass)
{
dataClass.content = 4;
}
void TestFunc5(DataClass dataClass)
{
dataClass = new DataClass();
dataClass.content = 5;
Console.WriteLine("\t方法TestFunc5 = " + dataClass.GetHashCode() + " content = " + dataClass.content);
}
void TestFunc6(ref DataClass dataClass)
{
dataClass = new DataClass();
dataClass.content = 6;
Console.WriteLine("\t方法TestFunc6 = " + dataClass.GetHashCode() + " content = " + dataClass.content);
}
}
public class DataClass
{
public int content = 0;
}
测试打印:
总结:
函数参数是引用类型时,没用使用ref传参,对参数成员的修改会反馈到参数对象(对比2);若重新初始化参数再修改参数成员则不会影响到原来的参数对象(对比3),会在方法内创建一个新的副本对象。
使用ref传参时,对参数成员的修改会反馈到参数对象(对比2);若重新初始化参数再修改参数成员(对比3),会创建一个新的存储副本,并将原参数对象指向新的存储地址。