我们知道结构是值类型,类是引用类型。关于值类型以及引用类型在内存中的分配情况详情见博客:https://www.cnblogs.com/tonney/archive/2011/04/28/2032205.html
在函数中进行按值传递结构体变量或是按引用传递类类型变量的时候。按值传递过程中形参得到堆栈中实参的一个副本,这个副本在函数执行完后被销毁,其不会影响实参的值改变。那如何通过引用传递结构类型变量。可以使用ref关键字。
由于任何变量传递给方法之前,无论是按值传递还是引用传递,必须初始化(实参)。故ref在使用前也是要进行初始化的。使用out的时候变量无需初始化,因为其在方法中进行初始化。
当函数要返回多个值的时候一般有三种处理方式:A.定义结构体 B.定义元组 C.使用out关键字
namespace BlogDemo
{
public struct Data
{
public string dataname;
public string datavalue;
}
public class DemoRefOut
{
static void Main(string[] args)
{
Data data = new Data
{
dataname = "",
datavalue = ""
};
DemoRefOut demoRefOut = new DemoRefOut();
demoRefOut.ChangeValue(data);
demoRefOut.print(data);
}
void ChangeValue(Data data)
{
data.dataname = "math";
data.datavalue = "98";
}
void print(Data data)
{
Console.WriteLine($"dataname is{data.dataname},datavalue is {data.datavalue}");
}
}
}
增加ref后改为引用传递:
static void Main(string[] args)
{
Data data = new Data
{
dataname = "",
datavalue = ""
};
DemoRefOut demoRefOut = new DemoRefOut();
demoRefOut.ChangeValue(ref data);
demoRefOut.print(data);
}
void ChangeValue(ref Data data)
{
data.dataname = "math";
data.datavalue = "98";
}
void print(Data data)
{
Console.WriteLine($"dataname is{data.dataname},datavalue is {data.datavalue}");
Console.ReadKey();
}
}
}
static void Main(string[] args)
{
string beforestr,afterstr = string.Empty;
string strvalue = "50";
ChangeValue(strvalue, out beforestr, out afterstr);
Print(beforestr,afterstr);
}
static void ChangeValue(string strvalue,out string beforestr, out string afterstr)
{
beforestr = "99";
afterstr = "101";
}
static void Print(string beforestr, string afterstr)
{
Console.WriteLine($"before value is {beforestr},aftervalue is {afterstr}");
Console.ReadKey();
}
}