代码之家  ›  专栏  ›  技术社区  ›  David

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

  •  40
  • David  · 技术社区  · 14 年前

    我有一个修改对象的委托。我将一个对象从调用方法传递给委托,但是调用方法不会接受这些更改。如果我通过一个 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
    }
    

    更新:

    我正在路过物体 裁判 当我在里面实例化一个新的对象时 BindMyObject .

    protected delegate int MyBinder<T>(object reader, ref T myObject);
    
    1 回复  |  直到 6 年前
        1
  •  105
  •   Aaron D    10 年前

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

    默认情况下,参数的值是按值传递的-无论该值是值类型值还是引用。如果通过该引用修改了一个对象,那么调用代码也将看到该更改。

    在最初显示的代码中,没有理由使用 ref . 这个 裁判 当需要更改 参数 (例如,使其完全引用不同的对象),并使调用方可以看到该更改。

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

    private int BindMyObject(object reader, MyObject obj)
    {
        //make changes to obj in here
    }
    

    你的意思是这样的代码:

    private int BindMyObject(object reader, MyObject obj)
    {
        obj = new MyObject();
    }
    

    或者这样的代码:

    private int BindMyObject(object reader, MyObject obj)
    {
        obj.SomeProperty = differentValue;
    }
    

    ?如果是后者,那么你不需要 裁判 . 如果是前者,那么你 需要 裁判 因为您要更改参数本身,而不是更改值所引用的对象。事实上,如果你是 只是 设置的值 obj 你不必读,就应该用 out 而不是 裁判 .

    如果你能展示一个短的但是 完成 这个程序演示了你的问题,它将更容易解释发生了什么。

    这一主题很难在几段时间内做到公正-所以我有一个 entire article about it 希望能让事情变得更明显。