为什么对象会通过引用自动传递?
在C#的pass-by-reference-pass-by-value-concept的上下文中,我有一个关于深度和浅拷贝的一般性问题:
在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
和A
类中实现ICloneable。 另一方面,’#’语句存在于C#中,应该用于明确允许和传递引用。
建议欢迎!
为什么对象会通过引用自动传递?
他们不是。
在这些情况下,强制克隆过程是否有任何特别的好处,而不是更像int,double,boolean等处理对象?
参考类型没有“克隆过程”,仅适用于值类型。
我认为你混淆了不同的概念:
我建议你阅读Jon Skeet的文章参数传递C#以获得更好的解释。
除非您明确指定应使用ref
或out
关键字通过引用传递它们,否则所有方法参数都按值传递。 这意味着如果将变量传递给方法参数,则会复制变量的内容并将其传递给方法。
如果变量是值类型(基本上是指struct
,则变量包含一个对象,因此该对象被复制。 如果变量是引用类型,它基本上表示class
则变量包含对对象的引用,以便复制引用。
如果将参数声明为ref
或out
则会创建对该变量的引用,并将其传递给该方法。 如果变量包含对象,则创建对该对象的引用,如果变量包含引用,则创建对该引用的引用。
我会改写你的问题:为什么我们需要上课? 难道我们不能只有结构吗?
并非所有对象都可以安全复制。 例如,您无法以逻辑方式复制FileStream
或Button
。 这些对象具有标识,您希望所有代码都引用唯一的对象。
类或接口类型的变量,参数或字段(统称为“引用类型”)不包含类对象; 它拥有一个对象标识符 。 同样,引用类型的数组不包含对象; 它包含对象标识符。
即使.NET中的对象没有任何与它们相关联的人类可读标识符,也可能有助于推理它们,如果它们确实如此:如果在程序过程中至少创建了一些(例如592)个对象执行时,恰好一个对象将是第592个创建的对象; 一旦创建了第592个对象,其他任何对象都不会成为第592个对象。 没有办法找出哪个对象是592nd,但如果一个包含对592nd对象的引用的变量作为非ref参数传递给某个方法,它将继续保持对该方法的592nd对象的引用回报。 如果对象#592是对红色的Car
实例的引用,则局部变量myCar
保存“对象ID#592”,并且一个调用方法PaintCar(myCar);
,然后该方法将接收Object #592"
。如果该方法将汽车涂成蓝色,那么当它返回时, myCar
将保持”对象#592“,这将识别蓝色汽车。
好吧生病编辑:我从下面的文章中纠正了
嗯,我想我不擅长解释事情。
上述就是C#学习教程:为什么对象会通过引用自动传递?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1011536.html