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();
        }
    }
}

请注意,OnProcessExitQuit 都位于两个单独的 类 文件和命名空间中。我将它们放在一起以便于查看代码。

当驱动程序当前未打开时,似乎存在打开 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() 中的所有内容时表现不同?

我认为是因为静态构造函数。 在你的第一个例子中,你的伪代码是这样的:

  1. 致电API.browser = new ChromeDriver(Service(), Options());
  2. 致电API.Quit()

在你的第二个例子中没有任何反应,因为你没有调用 static class.

要进一步测试,请尝试在 API class:

中创建此方法
public static void FakeInit() //use to invoke static class constructor.
{
    //leave it empty.
}

然后调用它而不是退出:

API.FakeInit();

您会看到浏览器已初始化但未关闭。看起来很神奇,但这个调用实际上是这样做的:

  1. 致电API.browser = new ChromeDriver(Service(), Options());
  2. 调用 API.FakeInit() 是空的

PS

主要建议 - 如果您不使用扩展或编组某些非托管代码,请不要使用静态。像这样使用它:

new API().Quit();

这是完全正常的,你可以在启动时创建它,将它传递给其他 classes,关闭并在你喜欢的时候处理它。通过这种方式,您将完全了解正在发生的事情,以及为什么您的浏览器会在一些意想不到的地方打开,只是因为您从静态 class 调用了一些辅助方法。虽然,我经常将静态用于扩展方法(创建 DSL),但我非常不喜欢将其用作单例。