C# 将short转换为枚举,然后转换为字符串有什么意义?

C# 将short转换为枚举,然后转换为字符串有什么意义?,c#,refactoring,C#,Refactoring,我正在看并试图理解这个项目,这是一个非常令人印象深刻的项目,但我遇到了一种方法,我不明白背后的原因 public static string GetServByPort(short port, ProtocolType proto) { StringBuilder ans = new StringBuilder(); switch (proto) { case ProtocolType.Tcp: { TcpSer

我正在看并试图理解这个项目,这是一个非常令人印象深刻的项目,但我遇到了一种方法,我不明白背后的原因

public static string GetServByPort(short port, ProtocolType proto)
{
    StringBuilder ans = new StringBuilder();

    switch (proto)
    {
        case ProtocolType.Tcp: 
        {
            TcpServices tcps;
            tcps = (TcpServices)port;
            ans.Append(tcps);
            ans.Append("(");
            ans.Append(port);
            ans.Append(")");
            break;
        }
        case ProtocolType.Udp:
        {
            UdpServices udps;
            udps = (UdpServices)port;
            ans.Append(udps);
            ans.Append("(");
            ans.Append(port);
            ans.Append(")");
            break;
        }
        default:
        {
            ans.Append("(");
            ans.Append(port);
            ans.Append(")");
            break;
        }
    }
    return ans.ToString();
}
TcpServices和UdpServices是枚举。以下是TcpServices:

public enum TcpServices : short
{
    /// <summary>
    /// Domain Name Server Port
    /// </summary>
    Domain = 53
}
public enum UdpServices : short
{
    /// <summary>
    /// Domain Name Server Protocol Port
    /// </summary>
    Domain = 53
}
我编写了以下简短的控制台应用程序进行测试:

using System;
using System.Net.Sockets;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetServByPort(1, ProtocolType.Tcp));
            Console.WriteLine(GetServByPort(2, ProtocolType.Udp));
            Console.WriteLine(GetServByPort(3, ProtocolType.SpxII));

            Console.ReadLine();
        }

        public static string GetServByPort(short port, ProtocolType proto)
        {
            switch (proto)
            {
                case ProtocolType.Tcp:
                    return string.Format("{0} ({1})", (TcpServices)port, port);
                case ProtocolType.Udp:
                    return string.Format("{0} ({1})", (UdpServices)port, port);
                default:
                    return string.Format("({0})", port);
            }
        }
    }

    public enum UdpServices : short
    {
        Domain = 53
    }

    public enum TcpServices : short
    {
        Domain = 53
    }
}
这是我的输出:

然而,我忍不住认为,开发人员之所以如此复杂,是因为我看不到一个原因

我的问题是,我以我计划的方式重构这个方法是对的,还是我没有看到原始开发人员这样做的原因,如果我以更简单的方式做事情,这会给我带来问题?

调用
ToString()
在枚举上,如果存在枚举值名称,则将使用该名称。(当没有相应的命名值时,它将给出数字版本。)例如,在
TcpServices
案例中,如果值为53,结果将是
Domain(53)
在原始代码中-但在建议的替换代码中
53(53)

不过,在这里使用
StringBuilder
没有任何意义。我将原始方法重写为:

public static string GetServByPort(short port, ProtocolType proto)
{
    switch (proto)
    {
        case ProtocolType.Tcp: 
            return string.Format("{0} ({1})", (TcpServices) port, port);
        case ProtocolType.Udp:
            return string.Format("{0} ({1})", (UdpServices) port, port);
        default:
            return string.Format("({0})", port);
    }
}

如果该值实际上是枚举成员之一,则该函数将返回类似“Domain(53)”的内容,而不是“53(53)”
StringBuilder
本质上调用
ToString
,用于所有内容和将返回值名称(如果存在)的枚举值(否则为数字)

如果您想重构其中一些代码,可以将公共“(端口)”部分移到交换机之外,完全删除默认情况,并去掉不需要的临时变量。即:

public static string GetServByPort(short port, ProtocolType proto)
{
    StringBuilder ans = new StringBuilder();

    switch (proto)
    {
        case ProtocolType.Tcp: 
            ans.Append((TcpServices)port);
            break;
        case ProtocolType.Udp:
            ans.Append((UdpServices)port);
            break;
    }

    ans.Append("(").Append(port).Append(")");

    return ans.ToString();
}

对于知名服务,您的输出将如下所示:

Domain (53)
HTTP (80)
HTTPS (445)
FTP (21)
等等,而未知的将如你所示:

1 (1)
2 (2)

等等。

谢谢你的回答,我最初认为是这样,但我写了一个快速测试应用程序来确认,这不是我看到的,因此产生了混乱。我已经更新了我的question@JMK“在枚举上调用
ToString()
将使用枚举值名称(如果有)。”您调用它时使用的值与任何命名的枚举值都不对应。我也这么认为,但我已经更新了问题,解释了我看到的内容以及我为什么感到困惑。我在做一些愚蠢的事情吗?更改/附加更新后的代码以包含53作为端口,您应该会看到不同。
1 (1)
2 (2)