[英]“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.