Encoding.UTF8.GetBytes(“hag”)中的类层次结构/调用链是什么?

时间:2014-04-03 18:11:27

标签: c# .net

以下分配右侧的类层次结构/调用链是什么?

byte[] data= Encoding.UTF8.GetBytes("hag"); 

我目前的理解是:

  

UTF8 是抽象编码类的静态属性。此属性实例化并返回类型的对象    System.Text.UTF8Encoding 。此对象有一个名为 GetBytes()的方法,它是Encoding.GetBytes()的重写版本。

1)上述陈述是否正确?

2)如果上述语句是正确的,使用静态属性来实例化对象是否常见? (它与工厂方法模式相同)?

2 个答案:

答案 0 :(得分:2)

  

以下分配右侧的类层次结构/调用链是什么?

它相当于:

Encoding e = Encoding.UTF8;
byte[] data= e.GetBytes("hag"); 
  

以上陈述是否正确?

  

使用静态属性来实例化对象是很常见的吗?

嗯,它并不是实例化一个对象 - 该对象已经存在,您只是使用静态引用。但是,使用静态属性来公开一组有限的易分类类实例是常见的做法。例如,查看Color类。

编辑

我想我更了解你的问题 - 该属性在第一次调用getter时实例化一个对象 。之后,它会在后续获取时返回相同的实例

  

是否与工厂方法模式相同

类似,工厂模式看起来更像

Encoding.GetEncoder("UTF8").GetBytes("hag"); 

工厂模式通常会生成单个类型的多个实例(尽管某些工厂会重复使用实例)。

答案 1 :(得分:1)

对于这样的问题,您可以查看最近更新的.NET reference source website。搜索“encoding.utf8”(是的,这有效)会产生source code that shows the actual construction

private static volatile Encoding utf8Encoding;
public static Encoding UTF8 
{
     get 
     {
         if (utf8Encoding == null) 
             utf8Encoding = new UTF8Encoding(true);
         return utf8Encoding;
     }
}

如果你称之为wuth“utf8”,那么注意到Encoding.GetEncoding("...") actually returns the UTF8 property也许会很有趣。