首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中通过引用传递对象和对象列表

在C#中通过引用传递对象和对象列表
EN

Stack Overflow用户
提问于 2010-06-14 19:15:42
回答 1查看 62.7K关注 0票数 41

我有一个修改对象的委托。我从调用方法中将一个对象传递给委托,但是调用方法不会获取这些更改。如果我将一个List作为对象传递,同样的代码也能工作。

我认为所有对象都是通过引用传递的,所以任何修改都会反映在调用方法中。对吗?

我可以修改我的代码,将一个ref对象传递给委托。但我想知道为什么这是必要的。还是真的是这样?

代码语言:javascript
复制
public class Binder
{
    protected delegate int MyBinder<T>(object reader, T myObject);

    public void BindIt<T>(object reader, T myObject)
    {
        //m_binders is a hashtable of binder objects
        MyBinder<T> binder = m_binders["test"] as MyBinder<T>;
        int i = binder(reader, myObject);
    }
}

public class MyObjectBinder
{
    public MyObjectBinder()
    {
        m_delegates["test"] = new MyBinder<MyObject>(BindMyObject);
    }

    private int BindMyObject(object reader, MyObject obj)
    {
        obj = new MyObject
        {
            //update properties
        };
        return 1;
    }
}

///calling method in some other class
public void CallingMethod()
{
    MyObject obj = new MyObject();

    MyObjectBinder binder = new MyObjectBinder();
    binder.BindIt(myReader, obj); //don't worry about myReader

    //obj should show reflected changes
}

更新:

我现在通过ref将对象传递给委托,因为我正在BindMyObject中实例化一个新对象。

代码语言:javascript
复制
protected delegate int MyBinder<T>(object reader, ref T myObject);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-14 19:19:17

对象不是通过引用传递的。对象根本不传递。

默认情况下,参数的值由值传递--无论该值是值类型值还是引用。如果通过该引用修改对象,则调用代码也会看到该更改。

在您最初展示的代码中,没有理由使用ref。当您想要一个方法更改参数的值(例如,使它完全引用一个不同的对象)并使调用者可以看到该更改时,就会使用ref关键字。

现在,在您已经(最初)显示的代码中,您只获得了:

代码语言:javascript
复制
private int BindMyObject(object reader, MyObject obj)
{
    //make changes to obj in here
}

你的意思是这样的代码:

代码语言:javascript
复制
private int BindMyObject(object reader, MyObject obj)
{
    obj = new MyObject();
}

或者这样的代码:

代码语言:javascript
复制
private int BindMyObject(object reader, MyObject obj)
{
    obj.SomeProperty = differentValue;
}

?如果是后者,则不需要ref。如果是前者,那么您确实需要ref,因为您正在更改参数本身,而不是对所引用的对象进行更改。实际上,如果您只是在没有读取obj的情况下设置它的值,则应该使用out而不是ref

如果你能展示一个简短而完整的程序来演示你的问题,那么解释到底发生了什么就容易多了。

仅用几段时间就很难做到这一主题--所以我有了一个关于它的整篇文章,希望它能使事情变得更加明显。

票数 106
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3040170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档