C#将静态方法更改为非静态方法
我对C#相当陌生,对处理静态类/方法也非常陌生。我正在开发一个应用程序,它过去只是一个独立的应用程序,现在正被转换成一个插件应用程序。我有一个插件是全局数据表,另一个插件是使用全局数据表副本的模型,但可以在运行模型之前进一步操作它。 因此,我创建了一个名为DatasheetControl的自定义控件。全局数据表插件和建模插件使用控件的实例。我正在修复从一个独立的数据表到在两个不同的插件中访问此控件的相关错误。 控件使用一个类来获取和设置列信息C#将静态方法更改为非静态方法,c#,plugins,static,C#,Plugins,Static,我对C#相当陌生,对处理静态类/方法也非常陌生。我正在开发一个应用程序,它过去只是一个独立的应用程序,现在正被转换成一个插件应用程序。我有一个插件是全局数据表,另一个插件是使用全局数据表副本的模型,但可以在运行模型之前进一步操作它。 因此,我创建了一个名为DatasheetControl的自定义控件。全局数据表插件和建模插件使用控件的实例。我正在修复从一个独立的数据表到在两个不同的插件中访问此控件的相关错误。 控件使用一个类来获取和设置列信息 public class dtColumnInfor
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; }
}
及
你把我甩了。我不太清楚他们在做什么,以及如何在我的整个课程中进行更改以避免使用静态的东西。
谢谢 getDtCI()只是一个使用单值缓存的初始值设定项。如果静态字段尚未初始化,则它将对其进行初始化并返回静态字段中的值。如果传入的init参数为true,则它将初始化静态字段的新值并返回该值。静态字段的上一个值将被丢弃。多次调用init=false的getdtCI()将返回相同的dtColumnInformation实例。这种单值缓存可能是一种节省内存的方法,用于大量请求和/或构建成本高昂的内容
如果希望多个容器具有独立的dtColumnInformation对象,则必须以某种方式对此进行更改。最简单的方法是完全消除单项缓存—更改getdtCI()以始终创建dtColumnInformation的新实例。查看对getdtCI()的引用以调查代码影响。如果构造dtColumnInformation不需要大量的时间或内存,并且代码没有调用getdtCI()数百万次,那么您可能可以完全消除静态缓存,并始终构造dtColumnInformation的新实例
如果总是构造一个新的dtColumnInformation需要太多时间或消耗大量内存,那么您可能会将单项缓存存储位置从dtColumnInformation类移到使用dtColumnInformation实例的容器类中。也许这就是您的数据表控件。最直接的方法是将静态字段和getdtCI()静态方法移动到容器类
如果您遇到调用getdtCI()的代码,而该代码没有访问容器类的权限,那么使用这个简单的解决方案将有困难。过了这一步,情况变得非常糟糕PgetDtCI()只是一个使用单值缓存的初始值设定项。如果静态字段尚未初始化,则它将对其进行初始化并返回静态字段中的值。如果传入的init参数为true,则它将初始化静态字段的新值并返回该值。静态字段的上一个值将被丢弃。多次调用init=false的getdtCI()将返回相同的dtColumnInformation实例。这种单值缓存可能是一种节省内存的方法,用于大量请求和/或构建成本高昂的内容
如果希望多个容器具有独立的dtColumnInformation对象,则必须以某种方式对此进行更改。最简单的方法是完全消除单项缓存—更改getdtCI()以始终创建dtColumnInformation的新实例。查看对getdtCI()的引用以调查代码影响。如果构造dtColumnInformation不需要大量的时间或内存,并且代码没有调用getdtCI()数百万次,那么您可能可以完全消除静态缓存,并始终构造dtColumnInformation的新实例 如果总是构造一个新的dtColumnInformation需要太多时间或消耗大量内存,那么您可能会将单项缓存存储位置从dtColumnInformation类移到使用dtColumnInformation实例的容器类中。也许这就是您的数据表控件。最直接的方法是将静态字段和getdtCI()静态方法移动到容器类 如果您遇到调用getdtCI()的代码,而该代码没有访问容器类的权限,那么使用这个简单的解决方案将有困难。过了这一步,情况变得非常糟糕欢迎来到C#!您可能想看看.NET名称指南:欢迎使用C#!您可能需要查看.NET名称指南://(builds dictionary of keys, <string>datetime and values <bool>enabled/disabled col)
dsControl1.DTCI = VBCommon.Metadata.dtColumnInformation.getdtCI(dsControl1.DT, true);
private static dtColumnInformation dtCI = null;
public static dtColumnInformation getdtCI(DataTable dt, bool init)