你如何使C#函数参数作为值?

Jes*_*ond 1 c# parameters function

我的问题与C#函数参数有关.我习惯于C++,默认情况下参数是值,除非你明确地将它们指定为引用.那么,在C#中,如何使函数参数按值而不是按引用传递?实际上,我只想知道如何传递变量,并且在调用函数后没有修改该变量.

例如:

void foo(Widget w)
{
     w.X = 3;//where w wouldn't really be modified here
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*off 10

没人提到structs是按值传递的:

struct Foo
{
    public int X;
    public override string ToString()
    {
        return "Foo.X == " + X.ToString();
    }
}

class Program
{
    static void ModifyFoo(Foo foo)
    {
        foo.X = 5;
        System.Console.WriteLine(foo);
    }

    static void Main()
    {
        Foo foo = new Foo();
        foo.X = 123;
        ModifyFoo(foo);
        System.Console.WriteLine(foo);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ mono ./a.exe
Foo.X == 5
Foo.X == 123

如果您使用structs作为类型,那么您只能在明确使用refout在方法中修改实例...但显然这仅在您控制所涉及的类型时才有效.