首页 > 解决方案 > C#:带有大括号和匿名对象的`using`语句的目的

问题描述

我知道在 C#using中使用大括号来确保对象的处理方式如下:

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}

因此,这段代码是完全清楚的。
但我正在阅读一个代码,其中using大括号与匿名实例化一起使用。这里有一些示例:

public partial class FrmAuthenticate : Form
{
    public String Username { get; set; }
    public String Password { get; set; }
    private void btnOk_Click(object sender, EventArgs e)
    {
        NetworkCredential writeCredentials = new NetworkCredential(txtUsername.Text, txtPassword.Text);
        using (new NetworkConnection(IpPath, writeCredentials))
        {
            Username = txtUsername.Text;
            Password = txtPassword.Text;
        }
    }
}

或者

using (new NetworkConnection(TargetProgramSldDir, writeCredentials))
using (new NetworkConnection(@"\\"+ this.TargetServerIp, writeCredentials))
{
    if (Directory.Exists(TargetProgramSldDir + @"\MyService"))
        Copy(TargetProgramSldDir + @"\MyService", backupDir + @"\MyService");
}

这两种情况下如何使用匿名对象?NetworkConnection两个代码中如何使用创建的对象?我不明白using特别是第一个示例代码的陈述的目的是什么?

标签: c#using

解决方案


两个代码中如何使用创建的 NetworkConnection 对象?

它只是放置在块的末尾。

我假设正在发生的事情是,如果凭据无效,构造函数将失败 - 所以在这种情况下,属性永远不会更新。如果构造函数成功,则更新属性,然后NetworkConnection释放 。

代码的一个问题是异常没有被捕获——它会传播到事件循环中,希望它附加一个异常处理程序——但这真的不是很令人愉快。

如果这是我维护的代码库中的代码,我会尝试将其重构为:

if (NetworkConnection.TestCredentials(IpPath, writeCredentials))
{
    Username = txtUsername.Text;
    Password = txtPassword.Text;
}
else
{
    // Report the error to the user
}

推荐阅读