【问题标题】:Does accessing a static member invoke the base class constructor?访问静态成员会调用基类构造函数吗?
【发布时间】:2014-02-03 15:37:59
【问题描述】:

即使所有常识都说不,我仍然提出这个问题只是为了获得第二意见并确定。

如果我有这样的类层次结构:

public class IntermediateObjectContext : System.Data.Objects.ObjectContext
{
    public static Action<string> PrintHello { get; set; }
}

public class MyDatabaseContext : IntermediateObjectContext
{
    public ObjectSet<Foo> Foos
    {
      get { // ... }
    }
}

然后从第三个,与实体框架对象无关,如果我访问 IntermediateObjectContext 类的静态成员,在这种情况下,如果我订阅该类的委托,那会以某种方式实例化一个新的 ObjectContext 吗?

class SomeClass
{
    public void SomeMethod()
    {
      IntermediateObjectContext.PrintHello += SayHello;
    }

    public void SayHello(string s)
    {
        Debug.Print(s);
    }
}

所有理由都说不,常识说不会,但我只是想确定一下。我正在尝试追踪一个内存占用对象。

如果

会发生什么

如果我有这样的 SomeClass 类型的静态集合,内存情况会怎样:

public class SomeClassCollection
{
    private static Collection<SomeClass> _col = 
                new Collection<SomeClass>();

    public void Add(SomeClass c) { _col.Add(c); }

    public void Remove(SomeClass c) { _col.Remove(c); }
}

然后一些代码将 SomeClass 实例添加到 SomeClassCollection,如下所示:

public SomeClassCollectionConfig
{
    public static RegisterSomeClasses()
    {
        SomeClassCollection.Add(new SomeClass());

        SomeClassCollection.Add(new DerivesClassOfSomeClass());
    }
}

【问题讨论】:

    标签: c# .net entity-framework garbage-collection clr


    【解决方案1】:

    (1) 不,它不会实例化对象。

    (2) 如果发生以下情况会发生什么:

    第一次访问SomeClassCollection 的任何成员时,它将在那里分配空集合col

    从代码中,这就是它的全部作用。您没有在提供的代码中的任何地方使用_col

    【讨论】:

    • 谢谢。请让我澄清这个问题。我忘了添加我确实将SomeClass 类型实例添加到_col 的位。我只是离开了它,因为我认为它很明显。
    • @WaterCoolrv2 好的,所以(2)将是相同的(忘了提到调用类构造函数算作被访问类的成员)。
    • 谢谢,@MatthewWatson。我最大的担心是:这是否会无意中实例化一个对象上下文,因为我的数据库有超过 1,200 个表,其中一些表有超过 400 万条记录。似乎不会,但我只是想确认一下,因为使用大量内存的代码中发生了错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多