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)