При вызове метода выполнение начинается с вычисления фактических параметров, которые являются выражениями. Для простоты понимания вызова методов можно полагать, что в точке вызова создается блок, соответствующий телу метода (в реальности все значительно эффективнее). В этом блоке происходит замена имен формальных параметров фактическими параметрами. Для выходных параметров, для которых фактические параметры также являются именами, эта замена или передача параметров осуществляется по ссылке, т. е. заменяет формальный параметр ссылкой на реально существующий объект, заданный фактическим параметром. Чуть более сложным является вызов по значению, применяемый к формальным параметрам, которые объявлены без ключевых слов ref или out. При вычислении выражений, заданных такими фактическими параметрами, их значения присваиваются специально создаваемым переменным, локализованным в теле исполняемого блока. Имена этих локализованных переменных и подставляются вместо имен формальных параметров. Понятно, что тип локализованных переменных определяется типом соответствующего формального параметра. Задание значений фактических параметров формальным параметрам выполняется так же, как и в операторе присваивания.
Если для параметра не указаны ключевые слова ref или out, то к нему будет применяться вызов по значению. Даже если в теле метода происходит изменение значения этого параметра, то оно действует только на время выполнения тела метода. Как только метод заканчивает свою работу (завершается блок), все локальные переменные (в том числе созданные для замены формальных параметров) оканчивают свое существование, так что изменения не затронут фактических параметров, и они сохранят свои значения, бывшие у них до вызова. Все выходные параметры, значения которых предполагается изменить в процессе работы метода, должны иметь ключевое слово ref или out.
В языке C# основную роль играют ссылочные типы, в основном выполняется работа с классами и объектами. Когда методу передастся объект ссылочного типа, то все поля этого объекта могут меняться в методе любым образом. А это означает, что несмотря на то, что параметр формально не является выходным (т. е. не имеет ключевых слов ref или out), но он используется, как и при вызове по значению. Сама ссылка на объект остается неизменной, но состояние объекта, его поля могут полностью обновиться. Такая ситуация является типичной и представляет один из основных способов изменения состояния объектов. Именно поэтому ref или out не очень часто появляются при описании параметров метода.