UTF8Encoding.UTF8.GetBytes和Encoding.UTF8.GetBytes之间有什么区别吗?

12
今天我看到一段代码,其中使用了 UTF8Encoding.UTF8.GetBytesEncoding.UTF8.GetBytes。它们之间有什么区别吗?
4个回答

13

完全没有区别。

Encoding.UTF8 就是 UTF8Encoding

从MSDN(Encoding.UTF8):

此属性返回一个UTF8Encoding对象

您可以直接调用UTF8Encoding.GetBytes,而不是Encoding.UTF8.GetBytes


3
虽然当时的文档(.NET Framework 4)没有提到,但当前的文档(.NET Framework 4.5)表示它等同于 new UTF8Encoding(true),这将发出一个BOM。 - user247702
此外,@JonHanna的回答似乎更好地回答了实际问题:UTF8Encoding.UTF8是否与Encoding.UTF8不同。 - user247702

12

至少有一个区别。Encoding.UTF8会写入BOM,而UTF8Encoding默认情况下不会。看看这个:

using System;
using System.Text;

class UTF8EncodingExample {
    public static void Main() {
        UTF8Encoding utf8 = new UTF8Encoding();
        UTF8Encoding utf8EmitBOM = new UTF8Encoding(true);

        Console.WriteLine("utf8 preamble:");
        ShowArray(utf8.GetPreamble());

        Console.WriteLine("utf8EmitBOM:");
        ShowArray(utf8EmitBOM.GetPreamble());

        Console.WriteLine("Encoding.UTF8 preamble:");
        ShowArray(Encoding.UTF8.GetPreamble());
   }

    public static void ShowArray(Array theArray) {
        foreach (Object o in theArray) {
            Console.Write("[{0}]", o);
        }
        Console.WriteLine();
    }
}

我知道它们在这方面是不同的,只是记不清哪个会写BOM。谢谢! - Tor Haugen

6
UTF8Encoding继承自Encoding的静态UTF8属性,因此它们实际上是同一个属性。

我猜在那些类的设计中出了一些问题。调用 UTF8Encoding.ASCII 的能力似乎很奇怪。 - user247702
@Stijn 不是很糟糕。首先,你为什么要这样做?(你甚至为什么要打电话给 UTF8Encoding.UTF8?)另外,“了解编码知识”属于特定编码的概念角色,因此能够从“这里”到“那里”并不可怕。 - Jon Hanna
当然你不会这样做,但它确实会给类的使用者带来困惑。编码已经是一个复杂的话题了,所以在我看来,必须仔细阅读文档和其他互联网资源以确保理解正确是一种非最优设计的指示。 - user247702
@Stijn 首先,你应该习惯于静态成员被继承的概念,其次设计通常只需要查看 Encoding 的文档,因为 UTF8Encoding 唯一不继承也没有复写的成员是构造函数。可以说,根本不需要公开类型 UTF8Encoding,而可以通过 Encoding 的静态方法返回 Encoding,并隐藏实现来提供构造函数的所有变体。 - Jon Hanna
这只是简单的继承。子类保留了超类的公共静态成员。我认为你无法对此做任何事情。 - Nyerguds

3

这只是访问 UTF8Encoding 类并调用其静态成员 GetBytes 的两种不同方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接