我对C#很新,对处理静态类/方法也很陌生。我正在开发一个曾经只是一个独立的应用程序,现在正在转换为一个插件应用程序。我有一个插件是一个全局数据表和另一个插件是一个模型,它使用全局数据表的副本,但可以在运行模型之前进一步操作它。 所以,我创建了一个名为DatasheetControl的自定义控件。全局数据表插件和Modeling插件使用控件的实例。我正在修复与单独数据表相关的错误,以及通过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)
让我失望。我不清楚他们在做什么以及如何在我的课程中进行更改以不使用静态的东西。 谢谢!
答案 0 :(得分:1)
getDtCI()只是一个使用单值缓存的初始值设定项。如果静态字段尚未初始化,则初始化静态字段并返回静态字段中的值。如果传入的init参数为true,那么它将初始化静态字段的新值并返回该值。静态字段的先前值被丢弃。使用init = false多次调用getdtCI()将返回相同的dtColumnInformation实例。这个单值缓存可能是为了节省内存以获取大量请求和/或构建成本高昂的内容。
如果您想拥有多个具有独立dtColumnInformation对象的容器,则必须以某种方式更改它。最简单的方法是完全消除单项缓存 - 更改getdtCI()以始终创建dtColumnInformation的新实例。查看对getdtCI()的引用以调查代码影响。如果构造dtColumnInformation不需要花费大量的时间或内存,并且代码没有调用getdtCI()数百万次,那么你可以完全消除静态缓存并始终构造dtColumnInformation的新实例。
如果始终构造新的dtColumnInformation需要花费太多时间或占用大量内存,则可以将单项缓存存储位置从dtColumnInformation类移出到使用dtColumnInformation实例的容器类中。也许这就是您的DatasheetControl。最直接的方法是将静态字段和getdtCI()静态方法移动到容器类。
如果遇到调用无法访问容器类的getdtCI()的代码,则使用这个简单的解决方案时会遇到问题。超出这一点,它变得非常丑陋。 :P