c#与取消注释被调用方法中的所有内容相比,取消注释对方法的调用时的行为差异
c# Difference in behavior when call to method is uncommented in comparison to uncommenting everything in called method
我有一个使用 chrome 的 Selenium 浏览器扩展的应用程序。
由于此扩展不会在进程退出时关闭 chrome 浏览器,因此我在我的应用程序中实现了以下代码:
static void OnProcessExit(object sender, EventArgs e)
{
API.Quit();
}
class API
{
public static IWebDriver browser = new ChromeDriver(Service(), Options());
public static void Quit()
{
if (!String.IsNullOrEmpty(browser.CurrentWindowHandle))
{
browser.Quit();
browser.Dispose();
}
}
}
请注意,OnProcessExit
和 Quit
都位于两个单独的 类 文件和命名空间中。我将它们放在一起以便于查看代码。
当驱动程序当前未打开时,似乎存在打开 chrome 的错误。这就是我实施 if 案例的原因。
奇怪的事情来了:
即使我取消注释 Quit()
中的所有内容,浏览器也会打开:
static void OnProcessExit(object sender, EventArgs e)
{
API.Quit();
}
class API
{
public static IWebDriver browser = new ChromeDriver(Service(), Options());
public static void Quit()
{
/*
if (!String.IsNullOrEmpty(browser.CurrentWindowHandle))
{
browser.Quit();
browser.Dispose();
}
*/
}
}
而当我取消注释调用时,浏览器没有打开:
static void OnProcessExit(object sender, EventArgs e)
{
//API.Quit();
}
class API
{
public static IWebDriver browser = new ChromeDriver(Service(), Options());
public static void Quit()
{
if (!String.IsNullOrEmpty(browser.CurrentWindowHandle))
{
browser.Quit();
browser.Dispose();
}
}
}
我的问题:为什么我的应用程序在我取消注释调用或 Quit()
中的所有内容时表现不同?
我认为是因为静态构造函数。
在你的第一个例子中,你的伪代码是这样的:
- 致电
API.browser = new ChromeDriver(Service(), Options());
- 致电
API.Quit()
在你的第二个例子中没有任何反应,因为你没有调用 static class.
要进一步测试,请尝试在 API class:
中创建此方法
public static void FakeInit() //use to invoke static class constructor.
{
//leave it empty.
}
然后调用它而不是退出:
API.FakeInit();
您会看到浏览器已初始化但未关闭。看起来很神奇,但这个调用实际上是这样做的:
- 致电
API.browser = new ChromeDriver(Service(), Options());
- 调用
API.FakeInit()
是空的
PS
主要建议 - 如果您不使用扩展或编组某些非托管代码,请不要使用静态。像这样使用它:
new API().Quit();
这是完全正常的,你可以在启动时创建它,将它传递给其他 classes,关闭并在你喜欢的时候处理它。通过这种方式,您将完全了解正在发生的事情,以及为什么您的浏览器会在一些意想不到的地方打开,只是因为您从静态 class 调用了一些辅助方法。虽然,我经常将静态用于扩展方法(创建 DSL),但我非常不喜欢将其用作单例。
我有一个使用 chrome 的 Selenium 浏览器扩展的应用程序。
由于此扩展不会在进程退出时关闭 chrome 浏览器,因此我在我的应用程序中实现了以下代码:
static void OnProcessExit(object sender, EventArgs e)
{
API.Quit();
}
class API
{
public static IWebDriver browser = new ChromeDriver(Service(), Options());
public static void Quit()
{
if (!String.IsNullOrEmpty(browser.CurrentWindowHandle))
{
browser.Quit();
browser.Dispose();
}
}
}
请注意,OnProcessExit
和 Quit
都位于两个单独的 类 文件和命名空间中。我将它们放在一起以便于查看代码。
当驱动程序当前未打开时,似乎存在打开 chrome 的错误。这就是我实施 if 案例的原因。
奇怪的事情来了:
即使我取消注释 Quit()
中的所有内容,浏览器也会打开:
static void OnProcessExit(object sender, EventArgs e)
{
API.Quit();
}
class API
{
public static IWebDriver browser = new ChromeDriver(Service(), Options());
public static void Quit()
{
/*
if (!String.IsNullOrEmpty(browser.CurrentWindowHandle))
{
browser.Quit();
browser.Dispose();
}
*/
}
}
而当我取消注释调用时,浏览器没有打开:
static void OnProcessExit(object sender, EventArgs e)
{
//API.Quit();
}
class API
{
public static IWebDriver browser = new ChromeDriver(Service(), Options());
public static void Quit()
{
if (!String.IsNullOrEmpty(browser.CurrentWindowHandle))
{
browser.Quit();
browser.Dispose();
}
}
}
我的问题:为什么我的应用程序在我取消注释调用或 Quit()
中的所有内容时表现不同?
我认为是因为静态构造函数。 在你的第一个例子中,你的伪代码是这样的:
- 致电
API.browser = new ChromeDriver(Service(), Options());
- 致电
API.Quit()
在你的第二个例子中没有任何反应,因为你没有调用 static class.
要进一步测试,请尝试在 API class:
中创建此方法public static void FakeInit() //use to invoke static class constructor.
{
//leave it empty.
}
然后调用它而不是退出:
API.FakeInit();
您会看到浏览器已初始化但未关闭。看起来很神奇,但这个调用实际上是这样做的:
- 致电
API.browser = new ChromeDriver(Service(), Options());
- 调用
API.FakeInit()
是空的
PS
主要建议 - 如果您不使用扩展或编组某些非托管代码,请不要使用静态。像这样使用它:
new API().Quit();
这是完全正常的,你可以在启动时创建它,将它传递给其他 classes,关闭并在你喜欢的时候处理它。通过这种方式,您将完全了解正在发生的事情,以及为什么您的浏览器会在一些意想不到的地方打开,只是因为您从静态 class 调用了一些辅助方法。虽然,我经常将静态用于扩展方法(创建 DSL),但我非常不喜欢将其用作单例。