通过ref返回解决C# struct结构体链式调用的问题
通常结构体不能进行链式调用,因为返回值是一个新的值,需要赋回原值。但现在通过ref关键字配合扩展方法,也能进行链式调用了。
结构体:
public struct Foo { public int a; public Foo AddOne() { a++; return this; } public Foo AddTwo() { a += 2; return this; } }
执行测试:
Foo foo = new Foo(); foo .AddOne() .AddTwo(); Debug.Log(foo.a);//1(错误)
那么借助c#新的ref关键字,我们可以引用返回结构:
public ref Foo AddOne() { a++; return ref this;/*ref不能返回this*/ }
但是编译器不能通过,没关系,可以通过扩展方法实现。
扩展方法实现ref返回:
public static class FooExtensions { public static ref Foo AddOneRef(this ref Foo foo) { foo.AddOne(); return ref foo; } public static ref Foo AddTwoRef(this ref Foo foo) { foo.AddTwo(); return ref foo; } }
调用测试:
Foo foo = new Foo(); foo .AddOneRef() .AddTwoRef(); Debug.Log(foo.a); //3
可见,结果正确。并且使用ref,函数返回时不会创建新的结构体。