以下分配右侧的类层次结构/调用链是什么?
byte[] data= Encoding.UTF8.GetBytes("hag");
我目前的理解是:
UTF8 是抽象编码类的静态属性。此属性实例化并返回类型的对象 System.Text.UTF8Encoding 。此对象有一个名为 GetBytes()的方法,它是Encoding.GetBytes()的重写版本。
1)上述陈述是否正确?
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也许会很有趣。