【问题标题】:Is a class with static members and a public constructor a static class?具有静态成员和公共构造函数的类是静态类吗?
【发布时间】:2011-08-22 18:06:30
【问题描述】:

如果我有一个未标记为static 的类,但它确实有static 成员变量,这是否会使类本身成为static?它像它一样在代码中使用,但它有一个公共构造函数。我以为他们只能有私有构造函数?

此外,在网页中的 Web 应用程序中,我调用一个静态类并将其分配给一个静态成员变量以在页面中使用。如果用户离开页面,静态成员变量会保留在内存中吗?我只是在考虑该用户会话的持续时间,对吗?或者 GC 会在更长的时间内不收集它吗?

好的,这里有一些代码:

 public class CustomerManager
{

    private static MyFactory _customerFactory = MyFactory.GetInstance();

    public CustomerManager()
    { }

     public static List<CustUser> GetCustomersByWebRequest(int iClientID, string sEmployeeNumber)

它在另一个静态类中被调用,如下所示:

 List<CustUser> customers = CustomerManager.GetCustomersByWebRequest(1, "23434");

这是在生产中。

【问题讨论】:

  • 你的问题不是很清楚,因为你一开始说的是一个非静态类,然后把它称为静态类...
  • 好的更新以反映对非静态类的更好理解。 :) 需要澄清网络应用程序的内存管理。谢谢

标签: c#


【解决方案1】:

不,非静态类包含静态成员是完全合理的。

Static classes 没有 any 实例构造函数。默认情况下,非静态类具有公共实例构造函数,但您可以使用私有实例构造函数防止“从外部”实例化。

编辑:ASP.NET 用户会话与 .NET 中的内存管理几乎没有关系,除非某些数据肯定存储在他们的会话中 - 这基本上 只是 充当对该对象的强引用。

静态变量将防止它所引用的对象在其所属的AppDomain 仍然存在时被垃圾回收。

关于 customers 变量 - 只要变量被认为是“活动的”,这只会阻止 List&lt;CustUser&gt; 被垃圾收集 - 这将取决于它是什么类型的变量以及它是如何被使用的。

【讨论】:

  • 静态类可以有静态私有构造函数。它在类第一次加载到内存时调用。
  • @Dani:不过,这不是正常意义上的构造函数。当有人说“构造函数”而不指定其他任何内容时,他们几乎总是指“实例构造函数”。请注意,您不能给静态构造函数 any 访问修饰符,包括私有,因此“静态私有构造函数”没有多大意义。将编辑以使这一点绝对清楚...
  • 嗨,乔恩,我添加了一些代码让您更好地理解我的意思。
  • 好的,在阅读您的回复后,我有一个带有静态成员和方法的非静态类。由于方法是静态的,您可以像上面的代码调用一样调用它。 Gotcha 现在内存管理问题呢?
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多