C# 从 using 语句设置成员

C# setting members from using statement

提问人:Piglet 提问时间:3/1/2023 最后编辑:Piglet 更新时间:3/1/2023 访问量:73

问:

class A
{
  TypeX PropertyX;

  void SomeMethod()
  {
    using (DisposableType y = new DisposableType())
    {
      PropertyX = y.GetX();
    }
  }
}

当 Y 被处置时,PropertyX 会发生什么情况? 如果我不知道 Y 正在处理什么,我宁愿这样做吗?

class A : IDisposable
{
  TypeX PropertyX { get; set;}
  DisposableType Y { get; set; }

  void SomeMethod()
  {
    using (Y = new DisposableType())
    {
      PropertyX = Y.GetX();
    }
  }

 void Dispose()
 {
   Y.Dispose();
 }

}
C# 使用语句

评论

0赞 Hossein Sabziani 3/1/2023
什么都不会发生,它的价值将被保留MainWindow
2赞 MakePeaceGreatAgain 3/1/2023
A 的目的不是要处理括号的所有内容,而只是要处理已使用的实例,在本例中为 .因此保持不变,但是所提供的内容将被处理掉,因此您的窗口中的成员(如果它有这样的成员)。usingUIA2AutomationMainWindowautomation
0赞 Sweeper 3/1/2023
和 之间有什么关系?根本不在乎吗?MainWindowautomationMainWindowautomation
0赞 Piglet 3/1/2023
我不知道MainWindow和自动化之间的关系。这只是一个句法例子。假设我不知道 MainWindow 是否会引用 using 语句正在处理的内容。
0赞 Piglet 3/1/2023
我替换了我的代码。问题不是关于自动化的实施。

答:

2赞 emt 3/1/2023 #1

编辑:OP改变了问题

您的 MainWindow 不会被释放,但自动化实例将在执行离开 using block 后被释放。另一种写法是:

    using var automation = new UIA2Automation();
    MainWindow = launcher.App.GetMainWindow(automation);

写同样事情的更冗长的方法是:

    var automation = new UIA2Automation();
    MainWindow = launcher.App.GetMainWindow(automation);
    
    // At this point MainWindow is already instantiated.
    // We no longer need automation instance so we dispose of it.
    automation.Dispose();

快速的谷歌搜索将我带到了 FlaUI 项目,看起来它就是您正在使用的。查看代码示例,您的方法似乎是正确的。

评论

0赞 Piglet 3/1/2023
这只是一个句法示例。我替换了我的代码以避免混淆
0赞 emt 3/1/2023
属性 X 没有任何反应。仅释放 Y。使用模式只是一种花哨的调用方式。Dispose() 一旦执行离开 using 范围,就会对 IDisposable 进行处理。因此,您可以使用“using(var x = new SomethingDisposable)”,或者通过调用 .Dispose() 中。无需两者兼而有之。我会研究以下 SO 问题:stackoverflow.com/questions/538060/......
0赞 emt 3/1/2023
我更新了我的答案,以显示它是如何工作的,没有“使用”语句。它们是等价的。
0赞 Piglet 3/1/2023
知道使用在做什么,我的财产没有被它处置。这在手册中。如果我不知道 Y 是否会处理我的成员所指的东西,该怎么办。
0赞 emt 3/1/2023
对不起,我帮不了你。