C#赋值什么时候是传引用什么时候是拷贝

时间:2021-01-07 16:02:22
比如我有一个类A,有个成员变量b的类型是类B,那么我产生类A的实例调用A的构造函数,出入一个类B的实例c赋值给b。那么如果我在类外面改动c,希望b也有一样的改动。换句话说就是希望b是c的引用,请问这怎么做到。

5 个解决方案

#1


自己顶一下

#2


public A(B c)
{
     this.b=c;//如果B是class,直接赋值就是了
}

public A(ref B c)
{
     this.b=c;//如果B是struct的话【参数加ref或者out】
}

#3


引用 2 楼 nianhui 的回复:
public A(B c)
{
     this.b=c;//如果B是class,直接赋值就是了
}

public A(ref B c)
{
     this.b=c;//如果B是struct的话【参数加ref或者out】
}


这两种情况下b都是c的引用是吗?
如果需要单单是把c的值拷贝给b,而两者没有任何关系,是不是就要为类B定义一个以类B为参数的构造函数,然后调用这个构造函数?

#4


直接赋值就OK

    class A
    {
        public A(B c)
        {
            this.b = c;
        }
        B b;
    }

    class B { }


类本身是引用类型 执行this.b = c时 实际上传入b的就是c的引用
如果B是struct 似乎很难达到这种效果... 大概要用指针了

#5


引用 3 楼 srzhz 的回复:
引用 2 楼 nianhui 的回复:

public A(B c)
{
this.b=c;//如果B是class,直接赋值就是了
}

public A(ref B c)
{
this.b=c;//如果B是struct的话【参数加ref或者out】
}


这两种情况下b都是c的引用是吗?
如果需要单单是把c的值拷贝给b,而两者没有任何关系,是不是就要为类B定义一个……
值类型的参数默认传递的是变量值,引用类型的参数传递的是引用
如果想要值类型的参数传递的也是引用的话,就用 ref 或者 out 来修饰就可以了。

#1


自己顶一下

#2


public A(B c)
{
     this.b=c;//如果B是class,直接赋值就是了
}

public A(ref B c)
{
     this.b=c;//如果B是struct的话【参数加ref或者out】
}

#3


引用 2 楼 nianhui 的回复:
public A(B c)
{
     this.b=c;//如果B是class,直接赋值就是了
}

public A(ref B c)
{
     this.b=c;//如果B是struct的话【参数加ref或者out】
}


这两种情况下b都是c的引用是吗?
如果需要单单是把c的值拷贝给b,而两者没有任何关系,是不是就要为类B定义一个以类B为参数的构造函数,然后调用这个构造函数?

#4


直接赋值就OK

    class A
    {
        public A(B c)
        {
            this.b = c;
        }
        B b;
    }

    class B { }


类本身是引用类型 执行this.b = c时 实际上传入b的就是c的引用
如果B是struct 似乎很难达到这种效果... 大概要用指针了

#5


引用 3 楼 srzhz 的回复:
引用 2 楼 nianhui 的回复:

public A(B c)
{
this.b=c;//如果B是class,直接赋值就是了
}

public A(ref B c)
{
this.b=c;//如果B是struct的话【参数加ref或者out】
}


这两种情况下b都是c的引用是吗?
如果需要单单是把c的值拷贝给b,而两者没有任何关系,是不是就要为类B定义一个……
值类型的参数默认传递的是变量值,引用类型的参数传递的是引用
如果想要值类型的参数传递的也是引用的话,就用 ref 或者 out 来修饰就可以了。