1

我对 C# 很陌生,对处理静态类/方法也很陌生。我正在开发一个以前只是独立的应用程序,现在正在转换为插件应用程序。我有一个插件是全局数据表,另一个插件是一个模型,它使用全局数据表的副本,但可以在运行模型之前进一步操作它。因此,我创建了一个名为 DatasheetControl 的自定义控件。全局数据表插件和建模插件使用控件的实例。我正在修复与从独立数据表到在 2 个不同插件中访问此控件相关的错误。控件用于获取和设置列信息的类。

public class dtColumnInformation
{
    //table to operate with
    private DataTable _dt = null;
    //dictionary to hold column info
    private Dictionary<string, bool> dictColstatus = null;
    //class variable
    private static dtColumnInformation dtCI = null;

    // method initializes a datatable cols information structure to all enabled
    public dtColumnInformation(DataTable dt)
    {
        if (dt != null)
        {
            _dt = dt.Copy();
            dictColstatus = new Dictionary<string, bool>();

            for (int c = 0; c < _dt.Columns.Count; c++)
            {
                dictColstatus.Add(_dt.Columns[c].ColumnName.ToString(), true);
            }
        }
    }

    // constructor optionally calls method to init the column information structure
    // and return the itself - singleton
    public static dtColumnInformation getdtCI(DataTable dt, bool init)
    {
        //pass null after initialization to access the DTcolInfo property
        //or pass init=true (after import) to initialize
        if (dtCI == null || init) dtCI = new dtColumnInformation(dt);
        return dtCI;
    }

    // method returns the enable/disable status of the column name (key)
    public bool getColStatus(string key)
    {
        //returns the status of a row
        bool boolStatus;
        dictColstatus.TryGetValue(key, out boolStatus);
        return boolStatus;
    }

    // method to set a table column to enable/disable
    public void setColStatus(string key, bool val)
    {
        //sets the status of a column
        dictColstatus[key] = val;
    }

    // property - structure to return column status of all columns in table...
    public Dictionary<string, bool> DTColInfo
    {
        //returns a col-status dictionary for all cols in the datatable
        set { dictColstatus = value; }
        get { return dictColstatus; }
    }

这在一些位置(包括全局数据表插件)中使用,调用类似于以下内容:

//(builds dictionary of keys, <string>datetime and values <bool>enabled/disabled col)
dsControl1.DTCI = VBCommon.Metadata.dtColumnInformation.getdtCI(dsControl1.DT, true);

所以,我开始明白为什么这不起作用。当我在全局数据表和模型之间来回切换时,dictColStatus 并没有维护每个单独的状态。当我右键单击 col 标题并想要选择是启用禁用的 col 还是禁用它时,这就会发挥作用。此函数的方法查看 dictColStatus 中的内容,以决定在右键单击菜单中填充哪些选项。

我需要将此 dtColumnInformation 类中的静态内容更改为不是静态的,以便维护控件的每个实例。我知道我需要通过实例化 dtColumnInformation 类的实例来做一些事情。但是

private static dtColumnInformation dtCI = null;

public static dtColumnInformation getdtCI(DataTable dt, bool init)

把我甩了。我不太清楚他们在做什么以及如何在我的课程中进行更改以不使用静态的东西。谢谢!

4

1 回答 1

1

getDtCI() 只是一个使用单值缓存的初始化程序。如果静态字段尚未初始化,则将其初始化并返回静态字段中的值。如果传入的 init 参数为真,那么它将为静态字段初始化一个新值并返回该值。静态字段的先前值被丢弃。使用 init=false 多次调用 getdtCI() 将返回相同的 dtColumnInformation 实例。这个单值缓存可能是为了为需要大量请求和/或构建成本高昂的东西节省内存。

如果您想拥有多个具有独立 dtColumnInformation 对象的容器,则必须以某种方式对其进行更改。最简单的方法是完全消除单项缓存 - 更改 getdtCI() 以始终创建 dtColumnInformation 的新实例。查看对 getdtCI() 的引用以调查代码影响。如果构造 dtColumnInformation 不需要大量时间或内存,并且代码没有调用 getdtCI() 数百万次,那么您可能完全消除静态缓存并始终构造新的 dtColumnInformation 实例。

如果总是构造一个新的 dtColumnInformation 花费太多时间或确实消耗大量内存,您也许可以将单项缓存存储位置从 dtColumnInformation 类移到使用 dtColumnInformation 实例的容器类中。也许那是您的 DatasheetControl。最直接的方法是将静态字段和 getdtCI() 静态方法移动到容器类中。

如果您遇到调用 getdtCI() 且无法访问容器类的代码,那么您将无法使用这个简单的解决方案。超出这一点,它变得非常丑陋。:P

于 2012-08-30T18:11:14.663 回答