Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ascienceoding.GetBytes()不是静态方法?_C# - Fatal编程技术网

C# 为什么ascienceoding.GetBytes()不是静态方法?

C# 为什么ascienceoding.GetBytes()不是静态方法?,c#,C#,我正在学习C语言的编码,我不明白为什么AscienceOding.GetBytes不被定义为静态方法,我的意思是为什么需要创建一个AscienceOding实例来使用它 因为这样您就无法编写任何编码的方法: public byte[] GetBytes(string input, Encoding encoding) { return encoding.GetBytes(input); } 这是关于它如何在不同地方的框架中使用。这是一个API设计问题。编码形成了一个继承频繁使用的类层次

我正在学习C语言的编码,我不明白为什么AscienceOding.GetBytes不被定义为静态方法,我的意思是为什么需要创建一个AscienceOding实例来使用它

因为这样您就无法编写任何编码的方法:

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更主观。