C# 为什么ascienceoding.GetBytes()不是静态方法?
我正在学习C语言的编码,我不明白为什么AscienceOding.GetBytes不被定义为静态方法,我的意思是为什么需要创建一个AscienceOding实例来使用它 因为这样您就无法编写任何编码的方法:C# 为什么ascienceoding.GetBytes()不是静态方法?,c#,C#,我正在学习C语言的编码,我不明白为什么AscienceOding.GetBytes不被定义为静态方法,我的意思是为什么需要创建一个AscienceOding实例来使用它 因为这样您就无法编写任何编码的方法: public byte[] GetBytes(string input, Encoding encoding) { return encoding.GetBytes(input); } 这是关于它如何在不同地方的框架中使用。这是一个API设计问题。编码形成了一个继承频繁使用的类层次
public byte[] GetBytes(string input, Encoding encoding)
{
return encoding.GetBytes(input);
}
这是关于它如何在不同地方的框架中使用。这是一个API设计问题。编码形成了一个继承频繁使用的类层次结构。这是总体设计,它强制GetBytes成为一个实例方法。关键是,通过键入变量作为编码,可以让算法使用任何编码 可以将此方法作为静态方法提供,也可以使用不同的名称。框架作者选择不这样做,可能是为了不造成混乱。事实发生后,您现在可以自己进行编码。编码并不是唯一的编码方式。还有Unicode编码、UTF8编码等 它们都派生自抽象基类编码,GetBytes在该基类中定义。这允许您在编译时接收任何类型的编码,而不知道确切的编码类型,并且仍然能够调用GetBytes,并在运行时解析正确的逻辑
不能使用这种称为多态性的动态分派来继承、重写和调用静态方法。之所以这样做,是因为静态方法不能用于重写虚拟方法 GetBytes是一种虚拟的编码方法,是Asciencoding的基类。为了在基类中重写该方法,AscienceODing必须将其声明为实例方法 如果您经常使用AscienceODing,请在类中创建一个静态只读变量,以避免创建该类的新实例:
private static readonly Encoding ASCII = new ASCIIEncoding();
...
var res = ASCII.GetBytes(...);
你回答了你自己的问题。您需要创建一个实例,因为该方法不是静态的。如果你正在寻找一个关于架构和设计的解释,StackOverflow不是一个可以问的地方。我也发现它是有效的,即使是漫不经心地问。@usr我倾向于认为这个观点是有根据的。没有别的答案,只是因为框架设计者认为这是定义它的正确方法。@CodeCaster,但他们没有掷硬币。他们这样做是有原因的。这些都是客观的。@CodeCaster你的答案是100%正确的,这说明了为什么它被设计成这样的客观原因,所以我不认为这个问题本身是主观的。我不觉得它比OOP更主观。