我正在查看并尝试理解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();
}
TcpServices 和 UdpServices 是枚举。这是 TcpServices 的内容:
public enum TcpServices : short
{
/// <summary>
/// Domain Name Server Port
/// </summary>
Domain = 53
}
这里是 UdpServices:
public enum UdpServices : short
{
/// <summary>
/// Domain Name Server Protocol Port
/// </summary>
Domain = 53
}
假设端口号为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);
}
我写了下面这个简短的控制台应用程序来进行测试:
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()
将使用枚举值的名称,如果有的话。" 您调用它时使用的值不对应于任何命名的枚举值。 - Daniel Fischer