2013-03-15 3 views
1

Я пишу фрагмент кода (C#) в Windows Phone 8 (имел ту же проблему с окнами 8).Объект передан по ссылке, а не по значению

И мне интересно, как оценить значение одного объекта, а не его ссылку.

Позвольте мне объяснить, с одной Exemple:

public MyClass 
{ 
    private Foo foo //my object. 

    public void Init() 
    { 
     foo = new Foo(); 
     foo.age = 5; 
     ChangeFooValue(foo); 
    } 
    private void ChangeFooValue(Foo temp) 
    { 
     temp.age = 10; 
     //I want to change temp and NOT foo. 
     //But at the end of this 
     //foo.age = 10; 
     //and 
     //temp.age = 10; 
    } 
} 

Решено: я имел это в моем классе, чтобы создать глубокую копию:

public Foo DeepCopy() 
     { 
      Foo other = (Foo) this.MemberwiseClone(); 
      return other; 
     } 

пс: Это может быть глупый вопрос (если это так, пожалуйста, предоставьте мне некоторый учебник, чтобы иметь возможность решить его самим).

+0

температура на самом деле «передается по значению», это просто тип ссылки и, следовательно, поведение. Вы должны клонировать переданный объект. – Styxxy

+0

Почему бы не использовать структуру вместо класса для вашего типа Foo? – mbm

ответ

7

Адрес ссылочного типа передается по значению, поэтому вы видите этот эффект. Вы можете отправить create a deep copy своего объекта перед передачей функции.

Вы должны увидеть: Parameter passing in C# by Jon Skeet

+0

, но глубокое копирование создаст новый объект – TalentTuner

+0

@Saurabh, да, это единственный способ, когда вы не хотите, чтобы метод модифицировал членов класса – Habib

+0

@Saurabh yea, и ему то, что ему нужно – derape

0

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

http://www.codeproject.com/Articles/14686/C-Parameter-Pass-object-by-value-The-copy-construc

Оттуда вы могли бы пройти, как так

ChangeFooValue(new Foo(foo)); 
+2

Это потребует 'Foo' для реализации конструктора копий, и это опять-таки глубокое копирование – Habib

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