在C#的按引用传递和按值传递概念的上下文中,我对深层复制和浅层复制有一个一般性的问题:
在C#中,需要显式创建接受指针/引用的方法,以便能够将其传递给该方法。但是,至少作为参数传递给方法/构造函数的对象的行为与其余对象不同。如果未按此处所述进行额外的克隆,似乎总是通过引用传递它们:http: //zetcode.com/lang/csharp/oopii/。
为什么对象通过引用自动传递?在这些情况下,对它们强制进行克隆过程而不是像对待int,double,boolean等对象那样,有什么特别的好处?
这是说明我的意思的代码示例:
using System;
public class Entry
{
public class MyColor
{
public int r = 0;
public int g = 0;
public int b = 0;
public double a = 1;
public MyColor (int r, int g, int b, double a)
{
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
}
public class A
{
public int id;
public MyColor color;
public MyColor hiddenColor;
public A (int id, MyColor color)
{
this.id = id;
this.color = color;
}
}
static void Main(string[] args)
{
int id = 0;
MyColor col = new MyColor(1, 2, 3, 1.0);
A a1 = new A(id, col);
A a2 = new A(id, col);
a1.hiddenColor = col;
a2.hiddenColor = col;
a1.id = -999;
id = 1;
col.a = 0;
Console.WriteLine(a1.id);
Console.WriteLine(a2.id);
Console.WriteLine(a1.color.a);
Console.WriteLine(a2.color.a);
Console.WriteLine(a1.hiddenColor.a);
Console.WriteLine(a2.hiddenColor.a);
}
}
结果是:
-999
0
0
0
0
的实例MyCol
总是通过引用传递,而其他参数则通过值传递。我将不得不在类MyColor
和中实现ICloneable A
。另一方面,C#中存在“ ref”语句,该语句应用于显式允许并进行按引用传递。
建议大家欢迎!
为什么对象通过引用自动传递?
他们不是。
在这些情况下,对它们强制进行克隆过程而不是像对待int,double,boolean等对象那样,有什么特别的好处?
对于引用类型,没有“克隆过程”,仅对于值类型。
我认为您在混淆不同的概念:
值类型与引用类型
对于值类型(例如原始数字类型,枚举和类似的结构DateTime
),变量的值是对象本身。将变量分配给另一个变量(或通过值将其作为参数传递)将创建对象的副本。
引用类型(如object
,string
,类(未结构)等),该变量的值是对对象的引用。将变量分配给另一个变量(或通过值将其作为参数传递)会创建引用的副本,因此它仍引用相同的对象实例。
按值传递参数还是按引用传递参数
按值传递参数意味着您传递值的副本。根据是值类型还是引用类型,这意味着对象本身的副本或引用的副本。如果被调用者修改了作为参数传递的值类型的成员,则由于被调用者正在处理副本,因此调用者将看不到更改。另一方面,如果被调用者修改了作为参数传递的引用类型的成员,则调用者将看到更改,因为被调用者和调用者都具有对同一对象实例的引用。
通过引用传递参数意味着您将引用传递给变量(可以是值类型或引用类型的变量)。该值不会被复制:它在调用方和被调用方之间共享。因此,被叫方所做的任何更改(包括将新值分配给参数)都将被调用方看到。
除非另有说明(使用ref
或out
关键字),否则所有参数均按值传递,包括引用类型。只是对于引用类型,传递的值是引用,但仍按值传递。
我建议您阅读Jon Skeet的文章Parameter in C#中传递,以获得更好的解释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句