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类,它具有与 a 相同的所有属性C,但只有一个方法:

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

然后,您只需要进行查找/替换new C() {...};并将其更改为(new CBuilder() {...}).Convert();,这将是单个正则表达式替换。

这并不能立即解决问题,但它确实让您可以自由重构,并且您可以制定政策,每次处理使用的东西时,都用 aCBuilder替换它的实例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{...}" 替换成 new "C (...)" // 这是最难的部分(我没试过)

希望它能让你更接近你所需要的......

于 2013-06-17T14:32:45.720 回答
-1

完全删除您的无参数构造函数。编译器在所有使用时都会失败,您可以切换到使用 2 参数版本。

于 2013-06-17T13:59:20.493 回答