Если вы не можете использовать инструкцию 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;
}
Могу я просто вызвать MySW.Dispose () и пропустить Close, даже если это при условии?
Да, именно для этого.
Существуют ли какие-либо реализации Stream которые не работают должным образом (например, CryptoStream)?
Можно с уверенностью предположить, что если объект реализует IDisposable
, он удалится должным образом.
Если нет, то это будет ошибкой.
Если нет, то это просто плохо код:
Нет, этот код является рекомендуемым способом работы с объектами, реализующими IDisposable
.
Более полезная информация содержится в принятом ответе на Close and Dispose - что вызывать?
Я использовал Reflector и обнаружил, что System.IO.Stream.Dispose
выглядит так:
public void Dispose()
{
this.Close();
}
И 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
}
}
}
}
Тем не менее, я обычно неявно закрываю потоки / средства записи потоков перед их удалением - я думаю, это выглядит чище.
Все стандартные потоки (FileStream, CryptoStream) будут пытаться очистить при закрытии / удалении. Я думаю, вы можете положиться на это для любых реализаций потоков Microsoft.
В результате Close / Dispose может генерировать исключение, если сброс завершился неудачно.
На самом деле IIRC была ошибка в реализации FileStream .NET 1.0. в том, что он не сможет освободить дескриптор файла, если сброс вызовет исключение. Это было исправлено в .NET 1.1 путем добавления блока try / finally к методу Dispose (boolean).
Stream.Close
реализуется вызовом Stream.Dispose
или наоборот - поэтому методы эквивалентны. Stream.Close
существует только потому, что закрытие потока звучит более естественно, чем удаление потока.
Кроме того, вам следует избегать явных вызовов этих методов и использовать вместо этого оператор using
в чтобы получить правильную обработку исключений бесплатно.
Как сказал Дэниел Брукнер, Dispose и Close - это одно и то же.
Однако Stream НЕ вызывает Flush (), когда он удаляется / закрывается. FileStream (и я предполагаю, что любой другой Stream с механизмом кэширования) действительно вызывает Flush () при удалении.
Если вы расширяете Stream, MemoryStream и т. Д., Вам нужно будет реализовать вызов Flush () при удалении / закрытии, если это необходимо.
Для объектов, которые необходимо закрыть вручную, следует приложить все усилия, чтобы создать объект в блоке 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, и файл всегда закрыт.