我正在学习C#中的编码,我不明白为什么ASCIIEncoding.GetBytes()
没有被定义为静态方法,我的意思是为什么有必要创建一个ASCIIEncoding
实例来使用它!
答案 0 :(得分:5)
ASCIIEncoding
不是唯一的编码类型。还有UnicodeEncoding
,UTF8Encoding
等
它们都来自抽象基类Encoding
,GetBytes
在该基类中定义。这允许您接收任何类型的Encoding
(在编译时不知道确切类型)并且仍然能够调用GetBytes
,并在运行时解析正确的逻辑。
static
方法不能使用这种动态分派(称为多态)来继承,覆盖和调用。
答案 1 :(得分:2)
因为那时你无法编写适用于任何编码的方法:
public byte[] GetBytes(string input, Encoding encoding)
{
return encoding.GetBytes(input);
}
关于它如何在各个地方的框架中使用。
答案 2 :(得分:2)
这样做是因为静态方法不能用于覆盖虚方法。
GetBytes
是virtual
的{{1}}方法,是Encoding
的基类。为了覆盖其基类ASCIIEncoding
中的方法,必须将其声明为实例方法。
如果您经常使用ASCIIEncoding
,请在类中创建一个静态只读变量,以避免创建该类的新实例:
ASCIIEncoding
答案 3 :(得分:1)
这是一个API设计问题。编码形成一个类层次结构,具有大量使用的继承。这是整体设计,它强制GetBytes
成为实例方法。关键是你可以通过输入变量Encoding
来使算法使用任何编码。
也可以将此方法作为静态方法提供(可能使用不同的名称)。框架作者选择不这样做,可能是为了不造成混淆。事后你可以自己做这件事。