.NET Core 3.1 与 .NET 6.0

Muz*_*Muz 16 c# netcoreapp3.1 .net-6.0 visual-studio-2022

我对 Visual Studio 2022、C# 10 和 .NET 6.0 的发布感到非常兴奋,下载并安装了社区版本并测试了我正在开发的项目。我将目标框架更改为 6.0 并执行了干净的构建。太好了,一切都按预期构建。

因此,继续向上运行该项目。第一次测试失败了。我必须说我很惊讶。我开始深入研究,并非常惊讶地发现 .NET Core 3.1 和 .NET 6.0 之间的差异。

这是一个示例程序:

public class Program
{
    public static readonly string CTCPDelimiterString = "\x0001";
    public static readonly char CTCPDelimiterChar = '\x0001';

    public static void Main(string[] args)
    {
        string text = "!sampletext";

        Console.Write("  Using a char: ");
        if (text.StartsWith(CTCPDelimiterChar) && text.EndsWith(CTCPDelimiterChar))
        {
            Console.WriteLine("got CTCP delimiters");
        }
        else
        {
            Console.WriteLine("did not get CTCP delimiters");
        }

        Console.Write("Using a string: ");
        if (text.StartsWith(CTCPDelimiterString) && text.EndsWith(CTCPDelimiterString))
        {
            Console.WriteLine("got CTCP delimiters");
        }
        else
        {
            Console.WriteLine("did not get CTCP delimiters");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用“netcoreapp3.1”目标框架我得到以下输出:

  Using a char: did not get CTCP delimiters
Using a string: did not get CTCP delimiters
Run Code Online (Sandbox Code Playgroud)

使用“net6.0”目标框架我得到以下输出:

  Using a char: did not get CTCP delimiters
  Using a string: got CTCP delimiters
Run Code Online (Sandbox Code Playgroud)

所以,我只能假设它是一个 unicode 设置,但我在任何地方都找不到它(如果有的话)。我的理解是所有字符串都是UTF16但是为什么框架之间存在差异。

是的,我可以在我的代码中看到错误,无论如何它应该是一个字符,但使用“netcoreapp3.1”工作正常。

任何人都可以阐明这一点吗?

小智 2

在.Net Core 3之后,您必须通过代码突出显示您的比较模式StringComparison

改变

if (text.StartsWith(CTCPDelimiterString) && text.EndsWith(CTCPDelimiterString))
Run Code Online (Sandbox Code Playgroud)

if (text.StartsWith(CTCPDelimiterString, StringComparison.Ordinal) && text.EndsWith(CTCPDelimiterString, StringComparison.Ordinal))
Run Code Online (Sandbox Code Playgroud)