簡體   English   中英

“for(bool flag = true; flag; flag = false){...}” - 這是正常的嗎?

[英]“for (bool flag = true; flag; flag = false) { … }” - is this normal?

我從未見過以這種方式初始化的for循環,並且不明白為什么會以這種方式編寫?

我正在研究連接到.NET中的IMAP服務器,並開始查看名為ImapX的庫中的代碼。 我在一個方法中找到了for循環,該方法將數據寫入NetworkStream ,然后出現在funky for循環中讀取響應。 我不想逐字復制和粘貼別人的代碼,但這里是要點:

public bool SendData(string data)
{
  try
  {
    this.imapStreamWriter.Write(data);

    for (bool flag = true; flag; flag = false)
    {
      var s = this.imapStreamReader.ReadLine();
    }
  }
  catch (Exception)
  {
    return false;
  }

  return true;
}

同樣,這不是確切的代碼,但它是一般的想法。 這就是所有方法所做的,它不使用服務器響應,如果沒有拋出異常,它只返回true 我只是不明白如何或為什么這樣使用for循環; 任何人都可以解釋初始化這個優惠的優勢,如果有的話?

這是一次執行循環的可怕方式。 如果你將flag initalizer更改為並非總是true ,那么它可能會稍微有點意義,但不是很多。 我之前完全沒有建議過這個代碼:

Animal animal = ...;
for (Dog dog = animal as Dog; dog != null; dog = null)
{
    // Use dog...
}

...作為一種使用as運算符而不“污染”外部范圍的方法。 但這是語言愚蠢,而不是我真正使用過的東西。

我以前認為你正在查看原始源代碼,但是根據你的評論,你看起來就像是在查看基於MSIL的Reflector的重構C#。 重要的是要理解這並不一定與編寫的原始代碼非常相似。

在MSIL級別,沒有for循環或while循環。 只有條件分支指令。 (見這里: http//weblogs.asp.net/kennykerr/archive/2004/09/23/introduction-to-msil-part-6-common-language-constructs.aspx )任何試圖重建C#的工具都必須關於代碼最初結構的一些猜測。 似乎很可能這不是最初編寫為for循環,但是Reflector檢測到IL 可能是由for循環生成的,並且它的啟發式錯誤地猜測它應該是for循環而不是其他東西。

如果我在ILSpy中查看相同的代碼,它將呈現為while循環。 它仍然是多余的,但它看起來不那么奇怪。 此外,原始代碼可能實際上做了一些已經優化的東西,可能調用[Conditional]方法或用#if指令標記的代碼。 然后,也許原來的代碼用於做其他事情,但部分被注釋掉了 - 評論沒有留在IL中。 或者也許過去有更多的代碼,它只是簡單刪除。

簡而言之,您在Reflector中看到的方法可能與最初編寫的方式有很大不同。 您應該將它視為IL的更漂亮的呈現,而不是C#的例子,因為它是由人類編寫的。

我有這個評論,但我想這也是答案。

“循環”毫無意義。 它將flag初始化為true並且僅在flag仍然為true時聲明執行。 但是,在第一次迭代后, flag顯式設置為false 所以在這種情況下,它保證只運行一次。

我懷疑作者試圖確保控制流會在ReadLine()上暫停 - 但它仍然ReadLine() ,直到收到用戶輸入。

正如其他人所指出的那樣,for循環幾乎是一種無操作。

但它確實做了一件事,它可能會或可能不重要:它引入了命名空間范圍 變量s的范圍是for循環的主體。 一旦for循環退出, s就會超出范圍。 只需創建一個塊就可以獲得相同的效果,因此:

{
  var s = this.imapStreamReader.ReadLine();
}

這還是很傻。

不知道原作者試圖用這個來完成什么 - 或許試圖確保他s被破壞/垃圾收集/處置 - 而不是這種技術會起作用(它不會)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM