Chapter 1 - Item 4 : Replace string.Format( ) with interpolated Strings

Effective C# (Covers C# 6.0), (includes Content Update Program): 50 Specific Ways to Improve Your C#, 3rd Edition By Bill Wagner 讀後心得

在 C# 6.0 以前,當我們需要組合字串時需要呼叫 string.Format;而在 C# 6.0 發表了一種新的組合字串方式 interpolated Strings,以下針對此兩種方式做比較與新方法改善之處。

1. string.Format 不易在編譯階段找到錯誤;而 interpolated Strings 提供了更清楚的表達式,讓開發者在編譯階段就能發現錯誤。

以下寫法會在運行後擲出 System.FormatException。

string _dog = "Dog";  
string _animal = "Animal";
    
// throw System.FormatException
string s1 = string.Format( "{0} is an {1}", new object[ 1 ] { _dog } );
    
// throw System.FormatException
string s2 = string.Format( "{0} is an {1}", _animal ); 

而 interpolated Strings 在編譯階段組合字串時就可檢查運行時的正確性。

string _dog = "Dog";  
string _animal = "Animal";
    
string s3 = $"{_dog} is an {_animal}";

組合字串的順序正確性也在編譯時就能檢查。
    
2. interpolated Strings 可簡化 ToString 多載,程式碼更加簡潔。

Console.WriteLine( $"The value of pi is {Math.PI.ToString( )}" );

若需要輸出至小數第二位。 

Console.WriteLine( $"The value of pi is {Math.PI.ToString( "F2" )}" );

進一步簡化。   

Console.WriteLine( $"The value of pi is {Math.PI:F2}" );

3. interpolated Strings 可內嵌條件判斷式,增加設計彈性。

Console.WriteLine( $"The cumstomer's name is {c.Name ?? "Name is missing"}" );
    
Console.WriteLine( $@"The value of pi is {( round ? Math.PI.ToString( ) : Math.PI.ToString( "F2" ) )}" );
Note:若包含判斷式 : 則無法用 2. 方式進一步簡化 ToString 多載。
// Compile Error
Console.WriteLine( $"The value of pi is {( round ? Math.PI : Math.PI:F2 )}" );
結論:
1. interpolated Strings 並"不能"組合成參數化的 SQL 命令式,而是單一字串。需注意。

2. 實務上可盡量運用 interpolated Strings 增加程式可讀性與正確性。