さまざまな場所で小さな操作を繰り返す必要があるメソッドに取り組んでいますが、繰り返されるコードはメソッド専用である必要があります。明らかな解決策は入れ子関数です。しかし、私が何をしようとも、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 */ };
そして実際にコンパイラーにその維持を獲得させます。
このような割り当ては禁止されているため、ラムダの代わりに古いデリゲート(){}構文を使用するのと同じように、メソッド内でデリゲート型を宣言します。ただし、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ステートメントとローカル変数を使用すると、コードの再利用を犠牲にすることなく、このコンテキストで「ヘルパー」をより適切にカプセル化できます。レジスターを介してパラメーターを渡すことによって関数呼び出しをシミュレートしたい場合は、むしろアセンブラーを使用したいと思います。問題を完全に回避するためにコードをリファクタリングする許容できる方法も見つかりませんでした。
それで、この共通オブジェクト指向言語を強制的に従わせることさえ可能ですか?