为什么ASCIIEncoding.GetBytes()不是静态方法?

时间:2015-02-14 10:53:29

标签: c#

我正在学习C#中的编码,我不明白为什么ASCIIEncoding.GetBytes()没有被定义为静态方法,我的意思是为什么有必要创建一个ASCIIEncoding实例来使用它!

4 个答案:

答案 0 :(得分:5)

ASCIIEncoding不是唯一的编码类型。还有UnicodeEncodingUTF8Encoding

它们都来自抽象基类EncodingGetBytes在该基类中定义。这允许您接收任何类型的Encoding(在编译时不知道确切类型)并且仍然能够调用GetBytes,并在运行时解析正确的逻辑。

static方法不能使用这种动态分派(称为多态)来继承,覆盖和调用。

答案 1 :(得分:2)

因为那时你无法编写适用于任何编码的方法:

public byte[] GetBytes(string input, Encoding encoding)
{
    return encoding.GetBytes(input);
}

关于它如何在各个地方的框架中使用。

答案 2 :(得分:2)

这样做是因为静态方法不能用于覆盖虚方法。

GetBytesvirtual的{​​{1}}方法,是Encoding的基类。为了覆盖其基类ASCIIEncoding中的方法,必须将其声明为实例方法。

如果您经常使用ASCIIEncoding,请在类中创建一个静态只读变量,以避免创建该类的新实例:

ASCIIEncoding

答案 3 :(得分:1)

这是一个API设计问题。编码形成一个类层次结构,具有大量使用的继承。这是整体设计,它强制GetBytes成为实例方法。关键是你可以通过输入变量Encoding来使算法使用任何编码。

也可以将此方法作为静态方法提供(可能使用不同的名称)。框架作者选择不这样做,可能是为了不造成混淆。事后你可以自己做这件事。