2013-05-23 4 views
2

Приложение печатает 24, но не должно быть печати 18, когда мы знаем, что без ключевого слова ref только копия объекта передается и никаких изменений в исходный объект не производится. Я создал класс под названием myclass и объект me. age - это переменная public в классе myclass. Я поставил me.age в 18 и через метод показа я изменил его до 24.Передача объектов в качестве параметров

class Program 
{   
    static void Main(string[] args) 
    { 
     myclass me = new myclass(); 
     me.age = 18; 
     show(me); 
     Console.WriteLine(me.age); 
     Console.ReadLine(); 
    } 

    public static void show(myclass you) 
    { 
     you.age = 24;   
    } 
} 

class myclass 
{ 
    public int age; 
} 
+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

«без ключевого слова ref только копия объекта передана и никаких изменений в исходный объект» неверна. Правильный оператор: «без ключевого слова' ref' или 'out' передается копия * значения *, а исходная * переменная * не изменяется, если значение * получено из переменной *. 'ref' делает псевдоним переменной *. –

ответ

2

Не путайте переменную и то, на что указывает переменная.

Когда у вас есть:

MyClass myVar = new MyClass(); 
MyClass myVar2 = myVar; 

Это создаст только один экземпляр объекта, но 2 переменных, указывающих на него.

То же самое происходит с вашим параметром: you - это копия переменной me, но оба указывают на один и тот же объект. Поэтому, когда вы изменяете you.age, вы также изменяете me.age.

В функции, если вы тогда сделали

you = new myClass(); 

только тогда me и you относятся к разным объектам. Если вы это сделали, me все равно укажет на исходный объект.

Если вы добавили ref параметру you, то если вы сделали

you = new myClass(); 

тогда переменная me будет обновляться, чтобы указать на тот же объект.

Для объектов вам необходимо отделить переменную от точки, на которую указывает переменная.

+0

спасибо ... много помогли .. – user2375245

0

Вы отправляете объект к вашей функции.

Не атомный тип или структура, поэтому он отправляется по ссылке (так работает C#), все, что вы измените в этом объекте в функции, также изменится в исходном объекте, потому что оно то же самое.

Более подробная информация о параметрах, проходящими: http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

1

Вы путаете типы значений и ссылочные типы.

public void addTwo(int a) 
{ 
    a += 2; 
} 

... 

int a = 5; 
addTwo(a); 
Console.WriteLine(a); // will give "5"; 

public void addTwo(ref int a) 
{ 
    a += 2; 
} 

... 

int a = 5; 
addTwo(ref a); 
Console.WriteLine(a); // will give "7"; 

Для ссылочных типов (все, что определяется как class вместо struct, что вы передаете на это ссылка на объект, а не копия. Так что вы на самом деле изменяя объект.

2

это печать правильно.

myclass является объектом, и поведение по умолчанию, чтобы передать справочник ce объекта в C#, поэтому, когда вы ничего не укажете, вы передаете ссылку.

Если вы заявляете struct myclass, вы получите нужное поведение, потому что по умолчанию структуры не являются ссылками.

+0

Это довольно запутанно. 'struct' inherit от 'Object', но они не объекты? И если это по умолчанию, означает ли это, что вы можете передать экземпляр класса «по значению»? – svick

+0

В C# все наследуется от 'Object'. Но 'struct' наследует сначала от' System.ValueType' (который затем наследуется от 'Object' btw). Разница делается на уровне компилятора. Когда компилятор «видит» что-то наследует от «System.ValueType», он передает значение, когда оно не наследуется от «System.ValueType», оно передает ссылку. – ppetrov

+0

взгляните на это сообщение: http://stackoverflow.com/questions/13049/whats-the-difference-between-struct-and-class-in-net есть хорошее объяснение различий между классом и структурой – ppetrov

2

Возможно, вы сбиваете с толку классы C++. В C# классы - это ссылочные типы, что означает, что всякий раз, когда у вас есть переменная типа, которая является классом, эта переменная не удерживает сам объект, она содержит только ссылку (вы можете думать об этом как указатель). Итак, когда вы передаете свой объект в метод, вы фактически передаете ссылку на этот объект. Это означает, что поведение, которое вы наблюдаете, является правильным.

C# также поддерживает типы значений (в отличие, например Java), который вы создаете с помощью struct вместо class. Если вы изменили myclass на srtuct, вы получите ожидаемое поведение.

+0

да! я сбивал с толку C++ .. спасибо за ответ .. – user2375245

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