2008-11-12 1 views
0

Есть ли способ, чтобы функция возвращала редактируемую ссылку на некоторые внутренние данные. Вот пример, который, я надеюсь, поможет показать, что я имею в виду.Функция, которая возвращает ссылку для редактирования в C#

class foo 
{ 
    public int value; 
} 

class bar 
{ 
    bar() 
    { 
     m_foo = new foo(); 
     m_foo.value = 42; 
    } 
    private m_foo; 
    foo getFoo(){return m_foo;} 
} 

class main 
{ 
    int main() 
    { 
     bar b = new bar(); 
     b.getFoo().value = 37; 
    } 
} 

Возвращение getFoo() в соответствии с «==» является такой же, как внутренний m_foo, пока я не пытаться изменить его. В c/C++ я бы вернул ссылку или указатель.

ответ

2

На самом деле, ваш образец кода после некоторой очистки демонстрирует, что когда вы назначаете 37 для значения, вы также меняете interman m_foo. Итак, ответ: ваша функция возвращает ссылочный тип. Теперь, может быть, ваш реальный код отличается, и это возвращение не в ссылочный тип, но в INT, тип значения или строки, своего рода специальный Beastie ...

using System; 

namespace ConsoleApplication1 
{ 
    public class foo 
    { 
     public int value; 
    }; 

    public class bar 
    { 
     public bar() 
     { 
      m_foo = new foo(); 
      m_foo.value = 42; 
     } 

     private foo m_foo; 
     public foo getFoo() { return m_foo; } 
    }; 

    public class Program 
    { 
     public static int Main() 
     { 
      bar b = new bar(); 
      b.getFoo().value = 37; 
      return 0; 
     } 
    }; 
} 

Подробнее о референции против типов значений: http://www.albahari.com/valuevsreftypes.aspx

0

Вы уже возвращаете ссылку foo в getFoo (это происходит по умолчанию). Таким образом, любые изменения, которые вы вносите в возвращаемое значение getFoo, будут отражены во внутренней структуре данных foo в bar.

0

Вы хотите использовать свойство для этого

class bar 
{ 
    private m_foo; 
    bar() 
    { 
     m_foo = new foo(); 
     m_foo.value = 42; 
    } 


    foo Foo 
    { 
    get { return m_foo;} 
    } 
} 
+0

Хотя мой пример был неправильным, это то, что я искал, я думаю. Благодаря! – 2008-11-12 03:09:48

0

Выжженных. Я собираюсь выяснить, как упростить мой нерабочий код в пример, который действительно ломается. Извините, глупость.

Смежные вопросы