您的位置:首页 > 编程语言 > C#

C#学习基本概念之类与结构--向方法传递结构与类引用之间的区别

2016-11-25 22:51 441 查看
下面的示例演示如何使用 结构 到方法与通过 实例不同传递给方法。 在此示例中,两个参数 (结构和类实例) 将值和两个方法通过更改参数的一个字段的值。 但是,这两个方法的结果是不同的,因为的传递,当您通过时结构什么不同通过,则可以通过类的实例。
由于结构是 值类型,那么,当您对方法的 使用结构值 ,方法受到并对结构参数的副本。 方法无法访问原始结构中调用方法并不能将其更改任何方式。 该方法可以仅更改副本。
类的实例是 引用类型,而不是值类型。 当对方法的 引用类型通过值
,方法进行引用的复制到类实例。 即方法受到实例,而不是复制实例的地址的副本。
在调用方法的类实例都有一个地址,在调用方法的参数的地址的副本,因此,两个地址是否引用同一对象。
由于该参数包含该地址的副本,调用方法不能更改类实例的地址在调用方法的。 但是,调用方法可以使用该地址访问原始地址和该副本引用的类成员。
如果调用方法将类成员,在调用方法的原始类的实例也会发生更改。
下面的示例的输出显示差异。 ,因为该方法在参数中使用该地址查找类的实例,的指定字段调用将类实例的
willIChange
字段的值传递给方法
ClassTaker
。 调用不更改结构的
willIChange
字段在调用方法为方法
StructTaker
,因为参数的值是结构的副本,而不是复制其地址。
StructTaker
更改该副本,因此,该副本丢失,在向
StructTaker
调用完成时。
class TheClass
{
public string willIChange;
}
struct TheStruct
{
public string willIChange;
}
class TestClassAndStruct
{
static void ClassTaker(TheClass c)
{
c.willIChange = "Changed";
}
static void StructTaker(TheStruct s)
{
s.willIChange = "Changed";
}
static void Main()
{
TheClass testClass = new TheClass();
TheStruct testStruct = new TheStruct();

testClass.willIChange = "Not Changed";
testStruct.willIChange = "Not Changed";

ClassTaker(testClass);
StructTaker(testStruct);

Console.WriteLine("Class field = {0}", testClass.willIChange);
Console.WriteLine("Struct field = {0}", testStruct.willIChange);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}    /* Output:
Class field = Changed
Struct field = Not Changed
*/


备注:转载自https://msdn.microsoft.com/zh-cn/library/8b0bdca4.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  结构比较