Как мне использовать параметры и вернуть в C #? - PullRequest
0 голосов
/ 14 мая 2011

За всю мою жизнь, каждый учебник, который я просматриваю, каждое видео, которое я видел, каждую книгу, которую я прочитал, я просто не могу понять, как эти вещи работают точно.

Я вижу прохождение значенийпо значению, значение по ссылке, ссылка по значению, ссылка по ссылке.Может ли кто-нибудь помочь мне понять это с помощью самых простых примеров?

Тот же вопрос в отношении типов возвращаемых данных.Как они работают?

Ответы [ 3 ]

3 голосов
/ 14 мая 2011

Лучший ресурс, который вы найдете на этом, - Передача параметров в C # Джоном Скитом. Это дает очень четкое объяснение. Если после прочтения у вас остались вопросы, попробуйте задать их более конкретно, чтобы вам было легче помочь.

0 голосов
/ 14 мая 2011

Прежде всего, вы видите только передачу по значению или передачу по ссылке.Больше ничегоТеперь, чтобы понять эту концепцию, представьте, что у вас есть набор цифровых блоков с отметками 1,2,3, 4 и т. Д. Эти блоки содержат некоторые данные.Затем представьте, что у вас есть список статей, в которых указано то же самое, то есть индекс с 1,2,3,4.

Теперь вы хотите передать одно из содержимого (данных) ящиков вашему другу.Вы можете сделать это одним из этих двух способов.

  1. Передача по значению Ваш друг проверяет ваш ящик и копирует его в свой ящик / жесткий диск в любом случае.Предположим, ваш друг должен изменить эти данные.Если он это сделает, ваша оригинальная коробка не будет затронута, потому что он изменит данные, которые находятся в его коробке.

  2. Передача по ссылке Вы просто даете адрес коробки своему другу, иваш друг будет использовать вашу коробку вместо того, чтобы копировать ее.Если он изменяет данные, это будет из вашего ящика, ваши исходные данные будут изменены.

Прежде чем вы поймете типы возврата, вы должны понять типы данных.Начни там.

0 голосов
/ 14 мая 2011

Давайте немного вернемся назад и начнем с переменных.

Переменные всегда содержат определенную информацию. Для типов значений содержащаяся информация представляет собой целое значение напрямую. Для ссылочных типов содержащаяся информация является только ссылкой на какое-то другое место в памяти, где живет реальное значение.

В .Net вы можете делать вид, что переменные действительно передаются или возвращаются из функций только одним способом: по значению. Забудьте прохождение по ссылке & mdash; это просто запутает вещи. Когда вы передаете переменную по значению, вся информация , содержащаяся непосредственно в переменной, копируется в функцию. Хитрость заключается в том, чтобы понять, что это значит для ссылочных типов, и просто взять копию ссылки.

Я могу продемонстрировать простой пример кода:

void Test(int x, dynamic y)
{
    x = 3; 
    y.a = "four";
    y.b = "five";
    y = new {a = "six", b = "seven"}; // this will have no effect outside the function
}

int x = 2; // value type
var y = new {a = "one", b="two"}; //reference type

// both x and y are passed by value, but y is a reference type so the reference itself is copied
Test(x, y);

Console.WriteLine(x);  //writes 2, because the test function is working with a copy
Console.WriteLine(y.a); //writes four
Console.WriteLine(y.b); //writes five

В случае ссылочных типов вы можете принудительно вызвать «передачу по ссылке», но вы никогда не должны делать это , если вы действительно не знаете, что происходит. Это будет выглядеть примерно так:

void Test(ref dynamic y)
{
   y = new {a = "three", b="four"};
}

var y = new {a = "one", b="two"};
Test(y);

Console.WriteLine(y.a); //prints one
Console.WriteLine(y.b); //prints two

Выход по-прежнему «один» и «два», потому что функция заменила ссылку на локальную переменную. Код, вызвавший функцию, по-прежнему имеет ссылку на исходную ячейку памяти и выводит исходное значение.

...