C# 类从字符串中识别端口

C# 类从字符串中识别端口,c#,string,url,C#,String,Url,我有一个方法,可以在不同的变量中获取用户的URL,如 foo.bar.com:5678 我需要像这样把港口弄出来 System.Uri foo = new Uri("foo.bar.com:5678"); int port = foo.Port; 但是它总是返回-1而不是5678来从URI获取端口,这要求URI具有协议 如果您有一个没有协议的简单字符串,您可以预先添加http://或ftp://或其他,但请记住,如果您预先添加了协议,并且如果您的URI没有端口,它将返回该协议的默认端口。请注意

我有一个方法,可以在不同的变量中获取用户的URL,如

foo.bar.com:5678

我需要像这样把港口弄出来

System.Uri foo = new Uri("foo.bar.com:5678");
int port = foo.Port;
但是它总是返回-1而不是5678来从URI获取端口,这要求URI具有协议


如果您有一个没有协议的简单字符串,您可以预先添加http://或ftp://或其他,但请记住,如果您预先添加了协议,并且如果您的URI没有端口,它将返回该协议的默认端口。请注意,port4将协议预先添加到字符串中,或者使用自定义方法将其拆分:

static readonly char[] s_splitter = new char[1] { ':' };
static int GetPort(string s)
{
    int port = -1;
    if (string.IsNullOrEmpty(s))
        return port;

    string[] parts = s.Split(s_splitter);
    if (parts.Length == 2)
        int.TryParse(parts[1], out port);
    return port;
}
如果您使用的是.NET Core或NuGet软件包,则可以在不分配任何其他字符串的情况下检索端口:

static int GetPort(string s)
{
    int port = -1;
    if (string.IsNullOrEmpty(s))
        return port;

    ReadOnlySpan<char> span = s;
    int index = span.IndexOf(':');
    if (index == -1 || s.Length < index)
        return port;

    int.TryParse(span.Slice(index + 1), out port);
    return port;
}

这不是Uri类的有效值:-需要指定Uri字符串中应有的协议。
static int GetPort(string s)
{
    int port = -1;
    if (string.IsNullOrEmpty(s))
        return port;

    ReadOnlySpan<char> span = s;
    int index = span.IndexOf(':');
    if (index == -1 || s.Length < index)
        return port;

    int.TryParse(span.Slice(index + 1), out port);
    return port;
}