提问人:Piglet 提问时间:3/1/2023 最后编辑:Piglet 更新时间:3/1/2023 访问量:73
C# 从 using 语句设置成员
C# setting members from using statement
问:
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();
}
}
答:
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
对不起,我帮不了你。
评论
MainWindow
using
UIA2Automation
MainWindow
automation
MainWindow
automation
MainWindow
automation