将一个short作为枚举,然后转换为字符串有什么意义?

JMK*_*JMK 3 c# refactoring

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

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();
}
Run Code Online (Sandbox Code Playgroud)

TcpServices和UdpServices是枚举.这是TcpServices:

public enum TcpServices : short
{
    /// <summary>
    /// Domain Name Server Port
    /// </summary>
    Domain = 53
}
Run Code Online (Sandbox Code Playgroud)

这是UdpServices:

public enum UdpServices : short
{
    /// <summary>
    /// Domain Name Server Protocol Port
    /// </summary>
    Domain = 53
}
Run Code Online (Sandbox Code Playgroud)

假设端口号是1.如果协议类型是TCP或UDP,则输出将是:

1(1)

如果协议类型是其他任何东西,输出是这样的:

(1)

因此,我想为我的项目重写这个方法(仍然完全归功于原始开发人员等):

private static string GetServerByPort(short port, ProtocolType protocolType)
{
    if (protocolType == ProtocolType.Tcp || protocolType == ProtocolType.Udp)
    {
        return string.Format("{0}({0})", port);
    }

    return string.Format("({0})", port);
}
Run Code Online (Sandbox Code Playgroud)

我编写了以下简短的控制台应用程序来测试:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

截图

但是我不禁想到开发人员为了这个复杂性而出于我没有看到的原因.

我的问题是我是否可以按照我计划的方式重构这种方法,或者是否有充分的理由说明原始开发人员这样做我没有看到的方式,如果我这样做会导致我遇到问题事情比较简单?

Jon*_*eet 6

如果有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);
    }
}
Run Code Online (Sandbox Code Playgroud)