【问题标题】:Generic classes with shared static fields in C#C# 中具有共享静态字段的泛型类
【发布时间】:2009-08-10 20:22:44
【问题描述】:

我有一个类似这样的通用类定义:

public sealed class MyClass<TProperty,TOwner>
{
    ...
}

现在,无论 TProperty 或 TOwner 的类型如何,我都希望 MyClass&lt;TProperty,TOwner&gt; 的任何实例共享一个 Hashtable。我想创建一个带有 Hashtable 类型的受保护内部静态字段的内部 MyClassBase 并从中继承。我真的只希望 MyClass 的定义能够访问这个哈希表。

这是一种合理的方法吗?我无法密封 MyClassBase,所以这可能会导致以后打开一罐蠕虫......

还有其他方法吗?

【问题讨论】:

    标签: c# .net generics .net-3.5 static


    【解决方案1】:

    受保护的静态哈希表是一种很好的方法(确保同步它)。您不能有一个派生类是公共的内部基类 - 但您可以通过将其默认构造函数设置为内部来防止它在您的程序集之外派生:

    public abstract class MyBaseClass
    {
        internal MyBaseClass() { }
    
        private static Hashtable _hashtable;
    
        protected static Hashtable Hashtable
        {
            get
            {
                if(_hashtable == null)
                {
                    _hashtable = Hashtable.Synchronized(new Hashtable());
                }
                return _hashtable;
            }
        }
    }
    

    【讨论】:

    • 喂,是的,睡眠不足,内部类显然比公共类更难访问。我有同步锁...感谢内部构造函数提示...
    【解决方案2】:

    另一种选择是创建一个带有暴露成员的internal static class,并且只能从MyClass&lt;T,U&gt; 访问它。当然,它会在您的程序集中可见,但与protected 成员相比,这很容易控制。只要确保只在您的MyClass&lt;T,U&gt; 中使用它就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多