Действительно Передает потоком. Располагайте всегда Поток вызова. Близко (и Поток. Сброс)

Если вы не можете использовать инструкцию break, вы можете определить локальную переменную в вашем модуле и добавить условие второго запуска в цикл for. Например, как следующий код:

#include <stdio.h>
#include <stdbool.h>

static bool continueLoop = true;

void foo (int a)
{
    bool doBreak = true;

    printf("a: %d",a);

    if(doBreak == true){
        continueLoop = false;
    }
    else {
        continueLoop = true;
    }
}
int main(void) {
    continueLoop = true;   // Has to be true before entering the loop
    for (int i = 0; (i <= 100) && continueLoop; i++)
    {
        foo(i);
    }
    return 0;
}

Обратите внимание, что в этом примере это не совсем break -инструкция, но цикл for не будет выполнять другую итерацию. Если вы хотите сделать break, вы должны вставить if -условие с переменной continueLoop, что приводит к break:

int main(void) {
    continueLoop = true;   // Has to be true before entering the loop
    for (int i = 0; i <= 100; i++)
    {
        foo(i);
        if(!continueLoop){
            break;
        }
    }
    return 0;
}
62
задан Binary Worrier 26 May 2009 в 15:57
поделиться

7 ответов

Могу я просто вызвать MySW.Dispose () и пропустить Close, даже если это при условии?

Да, именно для этого.

Существуют ли какие-либо реализации Stream которые не работают должным образом (например, CryptoStream)?

Можно с уверенностью предположить, что если объект реализует IDisposable , он удалится должным образом.

Если нет, то это будет ошибкой.

Если нет, то это просто плохо код:

Нет, этот код является рекомендуемым способом работы с объектами, реализующими IDisposable .

Более полезная информация содержится в принятом ответе на Close and Dispose - что вызывать?

81
ответ дан 24 November 2019 в 16:35
поделиться

Я использовал Reflector и обнаружил, что System.IO.Stream.Dispose выглядит так:

public void Dispose()
{
    this.Close();
}
58
ответ дан 24 November 2019 в 16:35
поделиться

И StreamWriter.Dispose (), и Stream.Dispose () освобождают все ресурсы, удерживаемые объектами. Оба они закрывают базовый поток.

Исходный код Stream.Dispose () (обратите внимание, что это детали реализации, поэтому не полагайтесь на него):

public void Dispose()
{
    this.Close();
}

StreamWriter.Dispose () (так же, как с Stream. Dispose ()):

protected override void Dispose(bool disposing)
{
    try
    {
        // Not relevant things
    }
    finally
    {
        if (this.Closable && (this.stream != null))
        {
            try
            {
                if (disposing)
                {
                    this.stream.Close();
                }
            }
            finally
            {
                // Not relevant things
            }
        }
    }
}

Тем не менее, я обычно неявно закрываю потоки / средства записи потоков перед их удалением - я думаю, это выглядит чище.

3
ответ дан 24 November 2019 в 16:35
поделиться

Все стандартные потоки (FileStream, CryptoStream) будут пытаться очистить при закрытии / удалении. Я думаю, вы можете положиться на это для любых реализаций потоков Microsoft.

В результате Close / Dispose может генерировать исключение, если сброс завершился неудачно.

На самом деле IIRC была ошибка в реализации FileStream .NET 1.0. в том, что он не сможет освободить дескриптор файла, если сброс вызовет исключение. Это было исправлено в .NET 1.1 путем добавления блока try / finally к методу Dispose (boolean).

3
ответ дан 24 November 2019 в 16:35
поделиться

Stream.Close реализуется вызовом Stream.Dispose или наоборот - поэтому методы эквивалентны. Stream.Close существует только потому, что закрытие потока звучит более естественно, чем удаление потока.

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

2
ответ дан 24 November 2019 в 16:35
поделиться

Как сказал Дэниел Брукнер, Dispose и Close - это одно и то же.

Однако Stream НЕ вызывает Flush (), когда он удаляется / закрывается. FileStream (и я предполагаю, что любой другой Stream с механизмом кэширования) действительно вызывает Flush () при удалении.

Если вы расширяете Stream, MemoryStream и т. Д., Вам нужно будет реализовать вызов Flush () при удалении / закрытии, если это необходимо.

21
ответ дан 24 November 2019 в 16:35
поделиться

Для объектов, которые необходимо закрыть вручную, следует приложить все усилия, чтобы создать объект в блоке using.

//Cannot access 'stream'
using (FileStream stream = File.Open ("c:\\test.bin"))
{
   //Do work on 'stream'
} // 'stream' is closed and disposed of even if there is an exception escaping this block
// Cannot access 'stream' 

Таким образом, невозможно получить неправильный доступ к «потоку» из контекст предложения using, и файл всегда закрыт.

3
ответ дан 24 November 2019 в 16:35
поделиться
Другие вопросы по тегам:

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