Используя оператор 'использования' C# с функцией пользовательского объекта, я должен реализовать IDisposable?

 private void sendEmail(Connect connect) {
    Intent email = new Intent(Intent.ACTION_SENDTO);
    email.setData(Uri.parse("mailto:"));
    email.putExtra(Intent.EXTRA_EMAIL, new String[]{connect.getEmail()});
    email.putExtra(Intent.EXTRA_SUBJECT, "");
    email.putExtra(Intent.EXTRA_TEXT, "");
    try {
        startActivity(Intent.createChooser(email, getString(R.string.choose_email_client)));
    } catch (ActivityNotFoundException activityNotFoundException) {
        UIUtils.showShortSnackBar(fragmentConnectLayout, getString(R.string.no_email_client));
    }
}

См. https://developer.android.com/guide/components/intents-common.html#Email

.

8
задан zulkamal 22 December 2009 в 10:33
поделиться

7 ответов

Оператор using будет смотреть на последний тип выражения, то есть на то, что возвращается из .Connection () ; если это возвращает что-то, что является IDisposable , тогда все в порядке.

Компилятор сообщит вам, если вы ошиблись ;-p (он не позволит вам использовать , используя ] на то, что не является IDisposable ).

Вам, вероятно, следует следить за тем, где вы создаете два соединения:

using (var c = conn.Connection()) // <==edit
{ 
    String query = "Select * from table";
    objSql = new SqlCommand(query, c); // <==edit

    c.Open(); 
    DoSomething(); 
}

и, возможно:

public SqlConnection Connection()
{
  if(sqlConn == null) sqlConn = new SqlConnection(connStr); // <== edit
  return sqlConn;
}
12
ответ дан 5 December 2019 в 08:25
поделиться

Он будет работать, но после с использованием {} у вас останется sqlConn, который внутренне содержит Disposed SqlConnection. Не очень полезная ситуация

5
ответ дан 5 December 2019 в 08:25
поделиться

Ваш код неверен!

должен выглядеть примерно так:

Dim conn as New SQLConn();
Dim sqlConnection New SQLConnection();

sqlConnection = conn.Connection();

using (sqlConnection) 
{ 
    String query = "Select * from table";
    objSql = new SqlCommand(query, sqlConnection);      

    conn.Open(); 
    DoSomething(); 
}

Таким образом, оператор using в конце установит соединение.

1
ответ дан 5 December 2019 в 08:25
поделиться

Чтобы ответить на ваш вопрос заголовка, вы должны реализовать IDisposable в классе, чей объект вы используете с помощью "using". В противном случае вы получите ошибку времени компиляции.

Тогда да, «using» удалит ваш SqlConnection в конце блока. Думайте об «using» как о «окончательной попытке»: есть неявный вызов Dispose () в блоке «finally».

Наконец, более чистый код будет выглядеть так:

using( SqlConnection = new SqlConnection( connStr ) {
    // do something
}

По крайней мере, читатели вашего кода победили ' Чтобы понять, как заметил Хенк Холтерман, ваш объект SQLConn содержит ссылку на удаленное соединение.

1
ответ дан 5 December 2019 в 08:25
поделиться

Рабочий пример здесь - добавьте / edit в URL-адрес, чтобы играть с кодом

. Вам просто нужно использовать JavaScript setInterval функция

 $ ('html'). addClass ('js'); $ (function () {var timer = setInterval (showDiv, 5000); var counter = 0; function showDiv () {if (counter == 0) {counter ++; return;} $ ('div', '#container') .stop () .hide () .filter (function () {return this.id.match ('div' + counter);}) .show ('fast'); counter == 3? counter = 0: counter ++; }}); 
       Песочница      

Пример использования setInterval для запуска отображения Div

Первый div отобразится через 10 секунд ...

0
ответ дан 5 December 2019 в 08:25
поделиться

Из MSDN :

Объект, предоставленный пользователю заявление должно реализовывать Интерфейс IDisposable.

Вам не нужно вызывать Dispose (), хотя оператор using неявно делает это за вас.

0
ответ дан 5 December 2019 в 08:25
поделиться

Похоже, соединение будет закрыто правильно, но это не рекомендуется:

Вы можете создать экземпляр ресурса объект, а затем передайте переменную в оператор using, но это не лучшая практика. В этом случае объект остается в области действия после контроля выходит из блока using, даже если он вероятно, больше не будет доступа к его неуправляемые ресурсы. В других слова, это уже не будет полностью инициализирован. Если вы попытаетесь использовать объект вне блока using, вы риск того, что исключение будет брошен. По этой причине это как правило, лучше создать экземпляр объект в операторе using и limit its scope to the using block.

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

0
ответ дан 5 December 2019 в 08:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: