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

弗洛里安·克莱因(Florian R.Klein)

在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),变量的值是对象本身。将变量分配给另一个变量(或通过值将其作为参数传递)将创建对象的副本。

    引用类型(如objectstring,类(未结构)等),该变量的值是对对象的引用。将变量分配给另一个变量(或通过值将其作为参数传递)会创建引用的副本,因此它仍引用相同的对象实例。

  • 按值传递参数还是按引用传递参数

    按值传递参数意味着您传递值的副本。根据是值类型还是引用类型,这意味着对象本身的副本或引用的副本。如果被调用者修改了作为参数传递的值类型的成员,则由于被调用者正在处理副本,因此调用者将看不到更改。另一方面,如果被调用者修改了作为参数传递的引用类型的成员,则调用者将看到更改,因为被调用者和调用者都具有对同一对象实例的引用。

    通过引用传递参数意味着您将引用传递给变量(可以是值类型或引用类型的变量)。该值不会被复制:它在调用方和被调用方之间共享。因此,被叫方所做的任何更改(包括将新值分配给参数)都将被调用方看到。

    除非另有说明(使用refout关键字),否则所有参数均按值传递,包括引用类型。只是对于引用类型,传递的值是引用,但仍按值传递。

我建议您阅读Jon Skeet的文章Parameter in C#中传递,以获得更好的解释。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么传递对象会自动变成按引用传递?

来自分类Dev

为什么Javascript变量没有对象通过引用传递?

来自分类Dev

为什么嵌套对象没有通过引用传递?

来自分类Dev

为什么在PHP中通过引用传递?

来自分类Javascript

为什么无法在JavaScript中通过引用传递的对象设置为null?

来自分类Dev

为什么在通过引用传递函数后调用“此”内部对象不同?

来自分类Dev

为什么通过const引用传递constexpr对象有效,但按值不能编译

来自分类Dev

为什么const引用不能延长通过函数传递的临时对象的寿命?

来自分类Dev

为什么通过引用传递从std :: function派生的对象会使程序崩溃?

来自分类Dev

为什么我在这里不能通过引用传递类对象?

来自分类Dev

通过引用传递对象

来自分类Dev

为什么这些数组通过值而不是通过引用传递?

来自分类Javascript

为该对象分配其他内容时,为什么不通过引用传递该对象?

来自分类Dev

为什么追加不起作用,通过引用传递?

来自分类Dev

为什么通过值而不是const引用传递?

来自分类Dev

为什么通过值传递QStringView比引用常量更快?

来自分类Dev

PHP:为什么只应通过引用传递变量?

来自分类Dev

Joomla为什么JFactory经常通过引用传递

来自分类Dev

为什么通过引用传递时更改了指针值?

来自分类Dev

为什么$ _SESSION在PHP 7中通过引用传递?

来自分类Dev

为什么const变量不能通过引用传递?

来自分类Dev

为什么不通过引用传递数组?

来自分类Dev

为什么通过引用传递导致崩溃(C ++)?

来自分类Dev

为什么通过引用传递解决了我的递归错误?

来自分类Dev

为什么我的INT变量通过引用传递?C#

来自分类Dev

为什么Python列表没有通过引用传递

来自分类Dev

为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

来自分类Dev

传递常量是通过引用自动传递的吗?

来自分类Dev

通过引用传递StreamReader对象

Related 相关文章

  1. 1

    为什么传递对象会自动变成按引用传递?

  2. 2

    为什么Javascript变量没有对象通过引用传递?

  3. 3

    为什么嵌套对象没有通过引用传递?

  4. 4

    为什么在PHP中通过引用传递?

  5. 5

    为什么无法在JavaScript中通过引用传递的对象设置为null?

  6. 6

    为什么在通过引用传递函数后调用“此”内部对象不同?

  7. 7

    为什么通过const引用传递constexpr对象有效,但按值不能编译

  8. 8

    为什么const引用不能延长通过函数传递的临时对象的寿命?

  9. 9

    为什么通过引用传递从std :: function派生的对象会使程序崩溃?

  10. 10

    为什么我在这里不能通过引用传递类对象?

  11. 11

    通过引用传递对象

  12. 12

    为什么这些数组通过值而不是通过引用传递?

  13. 13

    为该对象分配其他内容时,为什么不通过引用传递该对象?

  14. 14

    为什么追加不起作用,通过引用传递?

  15. 15

    为什么通过值而不是const引用传递?

  16. 16

    为什么通过值传递QStringView比引用常量更快?

  17. 17

    PHP:为什么只应通过引用传递变量?

  18. 18

    Joomla为什么JFactory经常通过引用传递

  19. 19

    为什么通过引用传递时更改了指针值?

  20. 20

    为什么$ _SESSION在PHP 7中通过引用传递?

  21. 21

    为什么const变量不能通过引用传递?

  22. 22

    为什么不通过引用传递数组?

  23. 23

    为什么通过引用传递导致崩溃(C ++)?

  24. 24

    为什么通过引用传递解决了我的递归错误?

  25. 25

    为什么我的INT变量通过引用传递?C#

  26. 26

    为什么Python列表没有通过引用传递

  27. 27

    为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

  28. 28

    传递常量是通过引用自动传递的吗?

  29. 29

    通过引用传递StreamReader对象

热门标签

归档