Передача аргументов по значению
По умолчанию аргументы в C # передаются по значению.Это означает, что копия значения создается при передаче методу:
class Test
{
static void Foo(int p)
{
p = p + 1; // Increment p by one.
Console.WriteLine(p); // Write p to screen.
}
static void Main()
{
int x = 8;
Foo(x); // Make a copy of x.
Console.WriteLine(x); // x will still be 8.
}
}
Назначение нового значения pa не меняет содержимого переменной x, поскольку p и x находятся в разных местах памяти.
Передача аргумента ссылочного типа по значению копирует ссылку , но не объект.Пример в случае строителя строк;здесь Foo видит тот же StringBuilder
объект, который был создан в main, но имеет независимую ссылку на него.Таким образом, StrBuild и fooStrBuild являются отдельными переменными, которые ссылаются на один и тот же объект StringBuilder
:
class Test
{
static void Foo(StringBuilder fooStrBuild)
{
fooStrBuild.Append("testing");
fooStrBuild = null;
}
static void Main()
{
StringBuilder StrBuild = new StringBuilder();
Foo(strBuild);
Console.WriteLine(StrBuild.ToString()); // "testing"
}
}
Поскольку fooStrBuild является копией ссылки, изменение ее значения не приводит к изменению StrBuild.
Передача по ссылке
В дальнейшем p и x относятся к одним и тем же ячейкам памяти:
class Test
{
static void Foo(ref int p)
{
p = p + 1; // Increment p by one.
Console.WriteLine(p); // Write p to screen.
}
static void Main()
{
int x = 8;
Foo(ref x); // Make a copy of x.
Console.WriteLine(x); // x is now 9.
}
}
, поэтому значение p изменяется.
Надеюсьэто помогает.