c# - 是否重载方法?

标签 c# class-design

我这里有两种方法 (killZombie),可以处理您有一个参数 (string) 或多个参数 (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
}

我可以看到这个问题得到解决的另一种方法是用两种不同的方法代替重载“killZombie”:

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

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

这样我们只有两个更容易理解的方法,但是方法不会被重载。在我看来,重载方法似乎是一件好事(这只是意味着方法更少,困惑更少)所以我也不确定这个解决方案。我很想知道解决这个问题的最佳方法是什么,谢谢!

附录:

我的方法实际上有 4 个参数,所以参数将在末尾。 params 变量是最重要的一个,因此将它作为使 params 起作用的最后一个参数似乎有点笨拙。我是否担心将最重要的论点放在最后,是否足以将方法拆分为 KillZombie 和 KillZombies,或者参数是否仍然是正确的做事方式?

最佳答案

这里有一些想法。

首先,公共(public)方法的 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);
}

如果您确实想要两种方法,请考虑使用一种方法 IEnumerable<string>而不是数组;这样调用者就可以传入一个列表、一个查询、一个数组等等。

您的第二种命名模式更标准:KillZombie 和 KillZombies。

The params variable is the most important one, so putting it as the last argument to make the params work seems kind of clunky. Is my concern over putting the most important argument last, legitimate enough to split up the methods into KillZombie and KillZombies or is the params still the right way to do things?

我会考虑您希望如何使用该方法。考虑例如:

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

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

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

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

如果您希望它将与第二种模式一起使用——某人有一个位置数组——那么不要使用参数;创建两个方法,KillZombie 和 KillZombies,并让其中一个采用 IEnumerable 字符串。

关于c# - 是否重载方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993653/

相关文章:

c# - 动画 split 襟翼显示

c# - 是否接受使用私有(private)方法来避免构造函数中的虚拟成员?

c++ - 在 C++ 中使用抽象基类和模板进行重构

c# - 我的 ISP 不支持 ASP.NET MVC。我仍然可以使用其中的一部分吗?

C++ 理解 vector 创建的 size_t 行为

uml - 类图 UML

php - PHP 中单例类实例方法与静态类方法的性能对比?

c# - 如何级联新窗口打开的位置?

c# - Moq - 检查具体类的方法调用

c# - 我可以将枚举添加到现有的 .NET 结构中,例如日期吗?