MainWindow()强制静态,但我需要调用非静态参数(C#)
我正在构建一个文件监视程序,它从一个文件中加载数据,该文件被放到SQL中的指定位置。我所有的代码都很好,除了将UI中文本框中键入的变量传递给MainWindow之外的另一个类 首先,我初始化一个FileWatcher:MainWindow()强制静态,但我需要调用非静态参数(C#),c#,C#,我正在构建一个文件监视程序,它从一个文件中加载数据,该文件被放到SQL中的指定位置。我所有的代码都很好,除了将UI中文本框中键入的变量传递给MainWindow之外的另一个类 首先,我初始化一个FileWatcher: public MainWindow() { InitializeComponent(); FileWatch.FileWatcherLoad(); } 调用文件监视程序进行初始化: public static void FileWatcherLoad() {
public MainWindow()
{
InitializeComponent();
FileWatch.FileWatcherLoad();
}
调用文件监视程序进行初始化:
public static void FileWatcherLoad()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = //some path;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
出现此问题是因为MainWindow强制我将FileWatcherLoad声明为静态类型。从文件WatcherLoad()中删除静态类型时,出现错误:
an object reference is required for the non-static field, method or property 'FileWatch.FileWatcherLoad()'
请注意,FileWatcherLoad()位于另一个类FileWatch中,它是MainWindow的子类
这对我来说是一个问题,因为我希望在UI的文本框中使用用户输入的数据,但这是非静态的,因此在我声明所有其他内容为静态时会导致问题。您必须执行以下操作:
FileWatch myWatch=new FileWatch();
然后调用你的方法等等。当你调用
FileWatch.FileWatcherLoad()
你告诉编译器你想调用一个静态方法。如果要调用非静态方法,则需要对对象调用该方法
如果要在当前对象上调用该方法,可以调用this.FileWatcherLoad()
或只调用FileWatcherLoad()
如果该方法与从中调用该方法的方法不在同一个类中,则需要首先初始化一个对象
这可以通过使用new
关键字来完成
var fileWatch = new FileWatch();
fileWatch.FileWatcherLoad();
这是因为您调用它的方式与
静态
成员函数的调用方式相同。如果您希望该方法成为实例方法,那么创建一个实例并像这样调用它
FileWatch watcher = new FileWatch();
watcher.FileWatcherLoad();
(或)只需newfilewatch().FileWatcherLoad()
现在您可以将方法声明为非静态
one
public void FileWatcherLoad()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = //some path;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
您需要创建FileWatch的实例,并将其保存在窗口中的变量中。您似乎不了解静态与实例的概念,以及垃圾收集和变量作用域是如何工作的。我强烈建议您通过C#获取CLR的副本并阅读它。这不会花太长时间,您的境况会好上1000%。您来自Visual Basic,是吗?C#中没有默认实例-如果您想要某个对象的实例,则需要创建它并将引用存储在某个位置。在发布FileWatch的静态版本时,您的示例阅读起来很混乱。请在主窗体中声明一个字段,如:
private FileWatch FileWatch=new FileWatch()代码>。然后使用fileWatch.FileWatcherLoad()代码>在构造函数中。这确实有效(删除引用问题),但会导致另一个错误。InitializeComponent()现在随系统中断。StackOverFlowException@DanGStackOverflowException
主要意味着您有无限递归(示例=>一个永远调用自身的方法)。也许link可以帮助你解决这个问题。如果不是的话,我建议你问一个新问题。这很奇怪,因为如果我让它保持静态,那么它会说它很好,filewatcher工作得很好。声明变量会破坏它。我对这一切都很陌生,所以我对自己的失败并不感到惊讶it@DanG这不可能是关于方法的签名。我会逐步检查你的代码。我应该很容易找到那个不断循环的地方。如果您只添加了newfilewatch
,那么它一定与这个类有关。这似乎与FileWatch是MainWindow的一个子类这一事实有关-当我删除它时,它现在可以工作了。谢谢