0

在 .NET 中,有一个在 .NET 中调用的System.Text.Encodingmscorlib。但是当你这样做时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 是具有 Encoding 类型(ASCII、UTF-(7/8/16/32) 等)的类,所以这意味着ASCIIEncoding也需要这些变量,不是吗?

任何人都可以帮助消除这种困惑吗?

4

1 回答 1

3

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

不,因为Encoding.ASCIIetc 是静态属性,可能由静态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...

于 2012-10-31T17:48:50.830 回答