我正在学习C#中的编码,我不明白为什么不将ASCIIEncoding.GetBytes()定义为静态方法,我的意思是为什么需要创建一个ASCIIEncoding实例来使用它!
发布于 2015-02-14 10:58:46
ASCIIEncoding并不是唯一的编码方式。还有UnicodeEncoding、UTF8Encoding等。
它们都是从抽象基类派生的,Encoding和GetBytes都是在该基类中定义的。这允许您接收任何类型的Encoding (在编译时不知道确切的类型),并且仍然能够调用GetBytes,并在运行时解析正确的逻辑。
不能使用这种动态分派(称为多态)继承、重写和调用static方法。
发布于 2015-02-14 10:58:06
因为这样就无法编写处理任何编码的方法:
public byte[] GetBytes(string input, Encoding encoding)
{
return encoding.GetBytes(input);
}这就是它在不同地方的框架中的使用方式。
发布于 2015-02-14 11:00:55
这是因为静态方法不能用于覆盖虚拟方法。
GetBytes是Encoding的一个virtual方法,是ASCIIEncoding的基类。为了覆盖基类中的方法,ASCIIEncoding必须将其声明为实例方法。
如果您经常使用ASCIIEncoding,请在类中设置一个静态只读变量,以避免创建该类的新实例:
private static readonly Encoding ASCII = new ASCIIEncoding();
...
var res = ASCII.GetBytes(...);https://stackoverflow.com/questions/28514857
复制相似问题