これは、実際にも理論的にも非常に難しい問題です。メモ化、自動並列化など、正確にシナリオの副作用を防止または分離する方法について一生懸命考えていますが、それは難しく、C# の実行可能なソリューションにはまだほど遠いです。だから、約束はありません。(本当に副作用を排除したい場合は、Haskell への切り替えを検討してください。)
残念ながら、たとえ奇跡が起こり、副作用のあるメソッドのメモ化を防ぐ方法を見つけたとしても、まだ大きな問題がいくつかあります。次の点を考慮してください。
1) それ自体がメモ化された関数を呼び出している関数をメモ化するとどうなりますか? それは良い状況ですよね?メモ化された関数を構成できるようにしたい。しかし、メモ化には副作用があります。データをキャッシュに追加します! したがって、すぐにメタ問題が発生します。副作用を飼いならしたいのですが、「悪い」副作用だけです。奨励したい「良い」ものと、防ぎたい悪いもの、そしてそれらを区別するのは難しい.
2) 例外についてはどうしますか? 例外をスローするメソッドをメモ化できますか? その場合、常に同じ例外をスローしますか、それとも毎回新しい例外をスローしますか? 前者の場合、どのようにしますか?後者の場合、2 つの異なる例外がスローされるため、2 つの異なる呼び出しで 2 つの異なる結果を持つメモ化された関数が作成されます。例外は副作用と見なすことができます。例外を飼いならすのは難しいです。
3) 副作用はないが不純なメソッドについてどうするつもりですか? メソッド GetCurrentTime() があるとします。これには副作用はありません。呼び出しによって何も変更されません。ただし、2 つの呼び出しが異なる結果を生成する必要があるため、これはまだメモ化の候補ではありません。副作用検出器は必要ありません。純度検出器が必要です。
難しい技術的な問題を解決しようとするのではなく、教育とコードレビューを通じて人間の問題を解決することが最善の策だと思います。