我正在研究一种需要在不同位置重复一个小操作的方法,但是要重复的代码应该是该方法私有的。显而易见的解决方案是嵌套函数。然而,无论我尝试什么,C# 编译器都会向我吐槽。
大致相当于这个 Perl 片段:
my $method = sub {
$helper_func = sub { code to encapsulate };
# more code
&$helper( called whenever needed );
# more code
}
是我在说什么,也是我想要在 C# 中完成的。
在这种情况下,类中的任何其他方法都不应该能够访问辅助函数。在我看来,用 C# 编写这个结构的最合乎逻辑的方法是这样的:
var helper = (/* parameter names */) => { /* code to encapsulate */ };
并且实际上使编译器赢得了它的保留。
因为这样的赋值是被禁止的,所以使用旧的 delegate(){} 语法代替 lambda 也是如此,在方法中声明委托类型也是如此——然而 csc 实际上允许我写的是:
private delegate /* return type */ Helper(/* parameters */);
private /* return type */ method(/* parameters */) {
Helper helper = (/* parameter names */) => {
/* code to encapsulate */
};
// more code
helper( /* called whenever needed */ );
// more code
}
对于不复制和粘贴大量代码并手动编辑参数来说,这一切都很好而且很花哨,但是它会将私有委托类型泄漏给类的其余部分,而不是将其保持为方法的私有。这首先破坏了目的。在这种情况下,使用 goto 语句和局部变量作为参数可以更好地封装“助手”,而不会牺牲代码重用。如果我想通过寄存器传递参数来模拟函数调用,我认为宁愿使用汇编程序。我也没有找到一种可以接受的重构代码的方法来完全避免这个问题。
那么,是否有可能强制这种通用面向对象语言服从呢?