System.Text.Encoding类如何工作?

时间:2012-10-31 17:46:35

标签: .net character-encoding mscorlib

在.NET中,System.Text.Encoding中有一个名为mscorlib的类。但是当您执行System.Text.Encoding.ASCII时,您可以访问ASCII编码类。

起初,我认为这是班级中的一类:

class Encoding {
    class ASCII { ... }
    ...
}

但令人困惑的是,您还可以使用System.Text.ASCIIEncoding来访问相同的功能。

无法反编译.NET(因为.NET Reflector花钱而且我不太了解IL [所以没有ildasm]),我无法理解这两个类是如何相等的。可能是这样的吗?

class ASCIIEncoding {
    internal ASCIIEncoding() { ... }
    /* static functions */
}
static class Encoding {
    public static readonly ASCIIEncoding ASCII = new ASCIIEncoding();
    ...
}

这似乎是最可能的方式,但函数原型是

public static Encoding ASCII { get; }

返回从Encoding派生的类没有意义,因为Encoding是一个具有编码类型(ASCII,UTF-(7/8/16/32)等)的类,所以这意味着ASCIIEncoding也需要这些变量,不是吗?

任何人都可以帮助解决这种困惑吗?

1 个答案:

答案 0 :(得分:3)

  

返回从Encoding派生的类没有意义,因为Encoding是一个具有编码类型(ASCII,UTF-(7/8/16/32)等)的类,因此这意味着ASCIIEncoding将需要那些变量也没有?

不,因为Encoding.ASCII等是静态属性,可能由 static 字段支持(尽管这是一个实现细节 - 该属性可能只是创建一个新实例每次,或者它使用的ASCIIEncoding内可能存在静态内部字段等。

就像这样:

public class BaseClass
{
    private readonly static BaseClass firstDerived = new FirstDerived();
    private readonly static BaseClass secondDerived = new SecondDerived();

    public static BaseClass First
    { 
        get { return firstDerived; } 
    }

    public static BaseClass Second
    { 
        get { return secondDerived; } 
    }
}

public class FirstDerived : BaseClass {}
public class SecondDerived : BaseClass {}

这是完整的代码 - 尽管在实际上任何事情的派生类方面都没用。确保您了解其工作原理,然后将其应用于Encoding ...