我有一个具有无参数构造函数的类,我想删除(或私有)
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个参数,并不是所有都是必需的等等。
(动机是使类不可变。隐藏无参数构造函数和公共setter是第一步)
我在正则表达式上取得了一些成功(Notepad ++的正则表达式支持似乎在4次捕获后停止),但是编写一个复杂的正则表达式来一次修复6个项目实际上并没有给我带来太大的帮助。 / p>
答案 0 :(得分:1)
您可以使用在函数调用中显式指定named arguments的功能(包括构造函数)来轻松修复此 。
具体来说,您可以替换
C() { B = b, A = a }
带
C(B: b, A: a)
并且构造函数将正常运行。无论参数的顺序如何,这都可以工作,只要它们都是指定的或可选的。
您可以尝试完全不同的方法:
完全按照C
的要求做。然后创建一个CBuilder
类,它具有与C
相同的所有属性,但只有一个方法:
public C Convert()
{
return new C(this.A, this.B);
}
然后,您只需要在new C() {...};
上执行查找/替换并将其更改为(new CBuilder() {...}).Convert();
,这将是单个正则表达式替换。
这并没有立即解决问题,但它确实允许您自由重构,并且您可以制定每次使用CBuilder
的内容时制定的策略,您用C
代替该实例。渐渐地,您将重构所有代码,但它不会阻止您前进。
答案 1 :(得分:0)
建议:也许你可以使用命名参数。
新C {A = 5,B =“tt”}最终相当于新C(A:5,B:“tt”)
所以你可以将所有出现的“A =”替换成“A:”和“B =”变成“B:” 将A暂时重命名为NewNameForANotCollidingWithAnything可以更容易,这样您就可以进行大规模的盲目自动化和安全替换。
然后将“new C {...}”替换为新的“C(...)”//这是最困难的部分(我没试过)
希望它能让你更接近你所需要的......
答案 2 :(得分:-1)
完全删除无参数构造函数。编译器将在其所有用途上失败,您可以切换到使用2参数版本。