Tag: pass by reference

使用REF和OUT关键字在C#中按值传递和传递值

这是我到目前为止所理解的: 通过价值 按值传递意味着传递参数的副本。 对该副本的更改不会更改原始副本。 通过参考 通过引用传递意味着传递对原始的引用。 对引用的更改会影响原始引用。 REF关键字 REF告诉编译器在进入函数之前初始化对象。 REF表示该值已经设置,因此该方法可以读取并修改它。 REF有两种方式,包括进出。 OUT关键字 OUT告诉编译器该对象将在函数内初始化。 OUT表示该值尚未设置,因此必须在调用return之前设置。 OUT只是一种方式,即出局。 题 那么在什么情况下你会结合使用ref和out关键字,通过引用传递还是通过值传递? 例子会有很大帮助。 非常感谢。

使用ref节省内存传递引用类型吗?

在C#中,方法的参数可以是引用类型或值类型。 传递引用类型时,将传递引用的副本。 这样,如果在方法内部我们尝试将传递的引用重新分配给另一个对象实例,则在该方法之外,重新分配是不可见的。 为了使其工作,C#具有ref修饰符。 使用ref传递引用类型实际上使用原始引用而不是副本。 (如我错了请纠正我)。 在这种情况下,由于我们没有创建引用的副本,我们是否保存了任何内存? 如果广泛调用方法,这是否会提高应用程序的整体性能? 谢谢!

为什么对象会通过引用自动传递?

在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 = […]

C#垃圾收集器如何找到唯一引用为内部指针的对象?

在C#中,据我所知, ref和out params只传递相关值的原始地址。 该地址可以是指向数组中的元素或对象内的字段的内部指针。 如果发生垃圾收集,则对某个对象的唯一引用可能是通过其中一个内部指针,如: using System; public class Foo { public int field; public static void Increment(ref int x) { System.GC.Collect(); x = x + 1; Console.WriteLine(x); } public static void Main() { Increment(ref new Foo().field); } } 在这种情况下,GC需要找到对象的开头并将整个对象视为可达。 它是如何做到的? 是否必须扫描整个堆以查找包含该指针的对象? 这似乎很慢。

“ref”关键字和引用类型

我的团队中的某个人偶然发现了引用类型上ref关键字的特殊用法 class A { /* … */ } class B { public void DoSomething(ref A myObject) { // … } } 是否有人理智会做这样的事情? 我在C#中找不到这个用途

通过引用和值传递对象

在深入研究设计课程之前,我只想检查一下我对C#处理事物的方式的理解。 我目前的理解是: Struct是一种值类型,这意味着它实际上包含在其中定义的数据成员。 Class是引用类型,意味着它包含对其中定义的数据成员的引用。 方法签名按值传递参数,这意味着将值的副本传递给方法内部,这使得大型数组和数据结构的代价很高。 使用ref或out关键字定义参数的方法签名将通过引用传递参数,这意味着提供指向对象的指针。 我不明白的是当我调用一个方法时会发生什么,实际发生了什么。 是否会调用new()? 它只是自动复制数据吗? 或者它实际上只是指向原始对象? 使用ref和out如何影响这个?