gpt4 book ai didi

c# - 在 .NET 中,如果将结构传递给带有接口(interface)参数的方法,它是否会包含值?

转载 作者:太空宇宙 更新时间:2023-11-03 20:35:06 25 4
gpt4 key购买 nike

从一个简单的测试中我可以看出,如果将结构传递给方法,它是按值传递的,但如果你首先将它分配给接口(interface),它是按引用传递的。

interface IFoo { int Val { get; set; } }
struct Foo : IFoo { public int Val { get; set; } }

void Bar(IFoo foo) { foo.Val = 1; }

Foo foo = new Foo();
IFoo ifoo = new Foo();

Bar(foo);
Bar(ifoo);

Console.WriteLine(foo.Val); // 0, passed by value
Console.WriteLine(ifoo.Val); // 1, passed by ref

所以我的问题是,像这样传入结构体是否还有装箱操作?

最佳答案

每当一个结构被转换为一个接口(interface)时,它就会被装箱。

Foo foo = new Foo();//Doesn't box yet
IFoo ifoo = new Foo();//Boxes

Bar(foo);//creates a new boxed copy
Bar(ifoo);//Uses the old boxed version created in line 2

您可以通过使用接口(interface)作为约束使参数通用来避免装箱:

void Bar<T>(T foo)
where T:IFoo
{
}

这利用了泛型针对每种值类型进行专门化这一事实。


但是,如果您遵循可变结构是邪恶的设计准则,从而使您的结构不可变,那么代码框与否并不重要。装箱只会对性能造成轻微影响,但不会改变语义。

关于c# - 在 .NET 中,如果将结构传递给带有接口(interface)参数的方法,它是否会包含值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5363587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com