2016-07-18 34 views
0

定义字段,我有以下静态类,静态字段:在静态类

public static class IncludeExtender { 

    private static readonly MethodInfo _include = typeof(EntityFrameworkQueryableExtensions).GetTypeInfo(); 

} 

是否有前面的例子之间有什么区别以下其中一个字段值是在类的构造函数中定义?

public static class IncludeExtender { 

    private static readonly MethodInfo _include; 

    static IncludeExtender() { 
    _include = typeof(EntityFrameworkQueryableExtensions).GetTypeInfo(); 
    } 

} 

什么是最好的选择呢?

+0

不,这是一样的 – Mangist

+0

同样在某些定义的术语中? – Jay

+0

有关您将使用哪种方法的建议? –

回答

1

不,它们是相同的。 readonly -modifier指出成员值可能仅在对象初始化期间才会更改。这可以直接在类的主体或构造函数中。

但是,通过在构造函数中初始化变量,您可以在前面添加影响值的更多逻辑,例如可以根据特定条件更改值。看到这个:

static IncludeExtender() { 
    var a = "Test"; 
    _include = a.GetType().GetTypeInfo(); 
    } 
+4

不完全正确,如果构造函数没有运行,那么前面的例子将不会执行,后者在构造函数运行之前运行。 – Jay

+0

@Jay如果您以任何方式引用该类,静态构造函数将确定运行。所以两者都会产生相同的结果。 – HimBromBeere

+0

想想那个......如果你OOM它会如何运行?此外,分配给外部的成员可能会或可能不会被分配。 – Jay

-2

不,他们是不相同的。

一个示例在类型上定义了一个静态成员。

另一个在静态类型中定义了一个构造函数,该静态类型分配也是静态的成员。

如果你的构造函数没有运行或者有异常,那么这个赋值就不会发生,因为前面的例子不会遭受同样的确切语义。

这不是你需要考虑的全部,也就是说。如果构造函数处于运行的MIDDLE中,并且该线程被中止或中断或者其他情况,那么您认为会发生什么?

+0

那么你会考虑使用哪种方法info始终是相同的,并将用于其他类方法? –

+0

但是不会构造函数运行吗?我只有这个,是一个静态类。 –

+0

它依赖于场景,而且你的问题非常诚实地不传达真正的底层问题,是关于代码语义还是代码中的实体......?!!? – Jay