2

削除したい (または非公開にしたい) パラメーターなしのコンストラクターを持つクラスがあります。

class C
{
    string A { get; set; }
    int B { get; set; }
    public C() { }    //Problem
    public C(A a, B b)
    {
        A = a;
        B = b;
    }
}

問題は、コードベースに、考えられるあらゆるバリエーション、フィールドの順序など、 new C {A = a, B = b}、 またはなどの何百もの式が散らばっていることです (括弧がオプションであることは今日まで知りませんでした)。new C() { B = b, A = a }2 引数のコンストラクターを使用するようにコードを修正する自動化された方法はありますか? 変更は些細なことですが、手動で行う必要があると気が狂ってしまうと思います。私の例には 5 つまたは 6 つの引数があり、すべてが必要なわけではありません。

(動機は、クラスを不変にすることです。パラメーターなしのコンストラクターとパブリック セッターを非表示にすることが最初のステップです)

私は正規表現で多少の成功を収めました (Notepad++ の正規表現サポートは 4 回のキャプチャ後に停止するようです) が、一度に 6 つの項目を修正する複雑な正規表現を作成しても、実際には大きな節約にはなりません。

4

3 に答える 3

1

関数呼び出し (コンストラクターを含む) で名前付き引数を明示的に指定する機能を使用して、これを比較的簡単に修正できます。

具体的には、次のように置き換えることができます。

 C() { B = b, A = a }

 C(B: b, A: a)

コンストラクターは正しく動作します。これは、引数がすべて指定されているかオプションである限り、引数の順序に関係なく機能します。


試すことができるまったく異なるアプローチを次に示します。

やりたいことを正確に実行してくださいC。次にCBuilder、 とすべて同じプロパティを持つクラスを作成しますCが、メソッドは 1 つだけです。

public C Convert()
{
   return new C(this.A, this.B);
}

次に、検索/置換を実行してnew C() {...};に変更するだけ(new CBuilder() {...}).Convert();で、単一の正規表現置換になります。

これですぐに問題が解決するわけではありませんが、自由にCBuilderリファクタリングできますC。徐々に、すべてのコードをリファクタリングしますが、前進を妨げることはありません。

于 2013-06-17T14:10:51.603 に答える
0

提案: 名前付きパラメーターを利用できるかもしれません。

new C {A = 5, B = "tt"} は、最終的には new C(A​​: 5, B: "tt") と同等です。

したがって、「A =" をすべて "A:" に、"B =" を "B :" に置き換えることができます。これは、A の一時的な名前を NewNameForANotCollidingWithAnything に変更することで簡単になり、大規模なブラインド自動化された安全な置換を行うことができます。

次に、"new C{...}" を新しい "C (...)" に置き換えます // ここが最も難しい部分です (私は試していません)

必要なものに近づけることを願っています....

于 2013-06-17T14:32:45.720 に答える
-1

パラメーターなしのコンストラクターを完全に削除します。コンパイラはすべての使用で失敗し、2 パラメータ バージョンを使用するように切り替えることができます。

于 2013-06-17T13:59:20.493 に答える