2011-04-30 29 views
4

在聲明或使用string代碼,我通常看到開發商宣稱它是這樣的:什麼時候在字符串之前使用@會更好?

string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 

相反的:

string randomString = "C:\\Random\\RandomFolder\\ThisFile.xml"; 

這是我看到的是更好地使用的唯一的事情@前綴,因爲你不需要做\\,但是當它比沒有它更好的時候有沒有其他用途?

回答

8

@標誌指示編譯器該字符串是verbatim string literal,因而不需要你逃跑的任何字符。當然不只是反斜槓。編譯器不會處理任何類型的轉義序列。

無論是「更好」還是非常難回答的問題。這是一個純粹的文體選擇。有些人可能會爭辯說,當你使用字符串時,字符串內容更多是可讀的,而不是必須轉義所有字符。其他人可能更喜歡一致性,其中包含通常需要轉義的字符的所有字符串都必須轉義。這使得更容易注意到代碼中的錯誤。 (對於它的價值,我屬於後一陣營。我的所有路徑具有\\。)

話雖這麼說,這是的正則表達式,爲這否則你可以逃避所有的地方非常方便。而且由於它們看起來不像常規字符串,所以混淆的風險很小。

+0

同意,因爲C#是C的一個子集,它被設計用於UNIX路徑,其中正斜槓字符被用作路徑分隔符,所以反斜線字符被用作轉義字符。 爲什麼微軟選擇反斜線字符作爲他們的路徑分隔符是一個奇怪的問題,尤其是考慮到Windows資源管理器與IE「神祕地聯繫」,這當然也使用UNIX路徑來訪問URL。 只有在窗口中使用路徑和調試時才使用這個litteral。除此之外,通常認爲路徑不應該被硬編碼。 所以是的,任何時候你需要一個字符串w /很多反斜槓。 – awiebe 2012-08-20 01:44:34

5

Windows路徑名不是唯一帶有大量反斜槓的東西。例如,@字符串對於正則表達式非常有用,因爲它們避免了必須雙重轉義所有內容。

它們也可以跨越多行,所以如果最終不得不在代碼中使用多行字符串,它們會使它更方便一些。

1

使正則表達式的簡單

@"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$"; 

多線串

string s = @"testing 
some 

string with multiple 
lines"; 
1

這對於顯式地匹配反斜槓字符的正則表達式尤其有用。由於這是C#字符串語法和正則表達式語法中的特殊字符,因此需要「雙重轉義」。例如:使用@ -notation

string regex = "\\\\.*\\.jpg" 

相同的表達會更整潔:

string regex = @"\\.*\.jpg" 
相關問題