C#: Назначение оператора using с фигурными скобками и анонимным объектом - PullRequest
2 голосов
/ 07 мая 2020

Я знаю, что в 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, особенно первого примера кода?

1 Ответ

2 голосов
/ 07 мая 2020

Как созданный объект NetworkConnection используется в двух кодах?

Он просто расположен в конце блока.

Я предполагаю, что происходит что конструктор завершится ошибкой, если учетные данные недействительны, поэтому в этом случае свойства никогда не обновляются. Если конструктор завершается успешно, свойства обновляются, а затем NetworkConnection удаляется.

Одна проблема с кодом в его нынешнем виде заключается в том, что исключение не перехвачено - оно будет распространяться на событие l oop, к которому, как мы надеемся, прикреплен обработчик исключений, но на самом деле это не очень приятно.

Если бы это был код из базы кода, которую я поддерживал, я бы попытался реорганизовать его до чего-то вроде:

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