是否重载方法?

soo*_*ise 4 c# class-design

我这里有两个方法(killZombie)来处理你有一个参数(字符串)或多个参数(string [])的情况.因为他们做同样的事情,我做了另一个名为"killAZombie"的方法,这个方法被其他两种方法使用.我遇到的问题是方法"killAZombie"被命名为......有点奇怪.这是其他人遇到的问题吗?什么是解决这个问题的最佳方法,并将我的"KillAZombie"方法命名为"killZombie"更清楚的区别

public void killZombie(string zombieLocation){
    killAZombie(zombieLocation);
}

public void killZombie(string[] zombieLocations){
    foreach(string zombieLocation in zombieLocations){
        killAZombie(zombieLocation);
    }
}

public void killAZombie(string zombieLocation){
    //Kills a zombie at specified location
}
Run Code Online (Sandbox Code Playgroud)

我可以看到这个问题得到解决的另一种方法是通过代替重载"killZombie"有两种不同的方法,如下所示:

public void killZombie(string zombieLocation){
    //Kills a zombie at specified location
}

public void killZombies(string[] zombieLocations){
    foreach(string zombieLocation in zombieLocations){
        killZombie(zombieLocation);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我们只有两个更容易理解的方法,但是方法没有重载.在我看来,重载方法似乎是一件好事(这只是意味着方法更少,更少杂乱)所以我也不确定这个解决方案.我有兴趣听听解决这个问题的最佳方法,谢谢!

附录:

我的方法实际上需要4个参数,因此params将在最后.params变量是最重要的变量,因此将其作为使params工作的最后一个参数似乎有点笨拙.我是否担心将最重要的论点放在最后,足够合法将方法分解为KillZombie和KillZombies,或者params仍然是正确的做事方式吗?

Eri*_*ert 6

这是一些想法.

首先,公共方法的C#约定是将它们大写:"KillZombie",而不是"killZombie".

如果需要,您只需一种方法即可完成此操作.这是一个占用一个或多个位置的方法.来电者可以只提供一个清单:KillZombies(location1, location2, location3);

private void KillOneZombie(string location) { ... }
public void KillZombies(string location, params string[] additionalLocations)
{
    KillOneZombie(location);
    if (additionalLocations == null) return;
    foreach(string additionalLocation in additionalLocations)
        KillOneZombie(additionalLocation);
}
Run Code Online (Sandbox Code Playgroud)

如果你想要有两个方法,可以考虑让一个方法IEnumerable<string>代替一个数组; 这样调用者可以传入列表,查询,数组等等.

你的第二个命名模式更标准:KillZombie和KillZombies.

params变量是最重要的变量,因此将其作为使params工作的最后一个参数似乎有点笨拙.我是否担心将最重要的论点放在最后,足够合法将方法分解为KillZombie和KillZombies,或者params仍然是正确的做事方式吗?

我会考虑你期望如何使用该方法.考虑例如:

Console.WriteLine("User: {0} Score: {1}", user[i].Name, scores[i]);
Run Code Online (Sandbox Code Playgroud)

在这里,我们清楚地期望"params"将用于支持调用者中的可变数量的参数.从来没有人这样做过:

object[] results = new object[] { user[i].Name, scores[i] };
Console.WriteLine("User: {0} Score: {1}", results);
Run Code Online (Sandbox Code Playgroud)

即使这是完全合法的.如果您希望您的方法将像Console.WriteLine一样使用,其中将传入不同数量的参数,但参数的数量在编译时是已知的,则使用params.

如果你期望它将与第二种模式一起使用 - 某人有一系列位置 - 那么就不要使用params; 制作两个方法,KillZombie和KillZombies,并让其中一个采用IEnumerable字符串.

  • @Joan:很有见地.是的,所有参与者都希望我们在C#1.0天内拥有IEnumerable <T>.如果我们有,那么params将使用IEnumerable <T>而不是可变数组; 99.99%的时间你只读这个东西.多年来,我们在未来的功能列表上都有"可枚举的参数",但它从来没有被高度重视,无法实际进入实现.我们考虑过为LINQ做这件事,因为这意味着你可以在没有ToArray的情况下传递查询"params".但要证明进度风险的合理性并不重要. (3认同)