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

Dav*_*vid 40 c# pass-by-reference

我有一个修改对象的委托.我从调用方法传递一个对象到委托,但调用方法不会获取这些更改.如果我将a List作为对象传递,则相同的代码可以工作.

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

我可以修改我的代码以将ref对象传递给委托.但我想知道为什么这是必要的.或者是吗?

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
}
Run Code Online (Sandbox Code Playgroud)

更新:

我正在将对象传递ref给委托,因为我正在实例化一个新对象BindMyObject.

protected delegate int MyBinder<T>(object reader, ref T myObject);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 105

对象不通过引用传递.根本没有传递对象.

默认情况下,参数的值按值传递 - 无论该值是值类型值还是引用.如果通过该引用修改了对象,则该更改也将对调用代码可见.

在您最初显示的代码中,没有理由使用ref.ref当您需要一个更改参数值的方法(例如,使其完全引用另一个对象)并使该更改对调用者可见时,将使用该关键字.

现在,在您(最初)显示的代码中,您只得到:

private int BindMyObject(object reader, MyObject obj)
{
    //make changes to obj in here
}
Run Code Online (Sandbox Code Playgroud)

你的意思是这样的代码:

private int BindMyObject(object reader, MyObject obj)
{
    obj = new MyObject();
}
Run Code Online (Sandbox Code Playgroud)

或像这样的代码:

private int BindMyObject(object reader, MyObject obj)
{
    obj.SomeProperty = differentValue;
}
Run Code Online (Sandbox Code Playgroud)

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

如果您可以展示一个简短但完整的程序来演示您的问题,那么解释发生的事情会更容易.

在几个段落中很难做到这个主题正义 - 所以我有一篇关于它整篇文章,这将有希望使事情变得更加明显.