[Bug雖小,DeBug要人命] C# 空字串

C# 判斷空字串

--------------------------------------------------------------------------------------------------------------------------

有時候會使用 != "" 來做為空字串的表示

logger.Debug("變數:"+text);
if(text != ""){
   //do something
}

但往往從log會是其他地方看起來,該變數就沒有顯示任何東西

卻沒有進入判斷區塊裡面

因為對於C#來說 null 不等於 空字串

而某些顯示的時候自動把null 的例外處理掉了 以至於看起來像空

 

不等於空字串(或是String.Empty)的方式 跟 判斷字串長度是否等於0 還有null的情況一起考慮進去的話

可以直接使用現有的函式

String.IsNullOrEmpty

指示指定的字符串是否為 null 或者 空字符串;

返回值:如果參數為 null 或者 空字符串("" 、String.Empty),結果為true,否則為false。

等效於以下代碼:

result = s == null || s == String.Empty;

 

String.IsNullOrWhiteSpace

指示指定的字符串是否為 null、空字符串 或者 僅由空字符組成。

返回值:如果參數為 null 、 空字符串("" 、String.Empty) 或者 僅由空字符組成,結果為true,否則為false。

等效於以下代碼:

result = String.IsNullOrEmpty(s) || s.Trim().Length == 0;

 

 

 

-------------------------

有時候會用.Tostring()做字串轉換來輸出,但如果物件為null的時候又需要再例外判斷很麻煩  

參考文章: https://tw.saowen.com/a/962bf234efb8313ba872e5702b19d6df3a961dd19b0f0335d744656214448675

            object obj = "";
            string str;
            str = obj.ToString();
            str = Convert.ToString(obj);
            str = (string)obj;
            str = obj as string;

1. 前兩種方法用於得到一個物件的string表示,如DateTime型別轉string型別,一般自定義物件會重寫ToString()方法;

2. 區別在於若obj=null,obj.ToString()將導致System.NullReferenceException,而Convert.ToString(obj)返回null;

3. 後兩種方法要求obj的執行時型別必須是string;

4. 區別在於若obj不為string型別(如object obj = DateTime.Now),(string)obj將導致System.InvalidCastException異常,而obj as string返回null。

 

----------------------------

Null跟DBNull及String.Empty這三者不相等

string a=""

結果是

a != null;             a != DBNull;         a = string.Empty;                string.IsNullOrEmpty(a) = true

 

string b=null

b = null;       b != DBNull;        b != string.Empty;       string.IsNullOrEmpty(b) = true

 

Null是當物件未被初始化時的情況,例如 StreamReader reader;還沒有給new StreamReader();

 

""和String.Empty  這兩個都是表示空字符串。只不過""理論上重新開闢內存空間,而String.Empty指向一處。

string.Empty不分配存儲空間, ""分配一個長度為空的存儲空間,所以一般用string.Empty,為了以後跨平台,還是用string.empty。

在C# 中,大多數情況下 "" 和 string.Empty 可以互換使用。

 

DBNull:當至資料庫查詢,符合的資料回傳的資料欄位沒有值,為null時,此時此欄位的值就=DBNull.

當至資料庫查詢,沒有符合的資料回傳時,此時回傳的結果就=Null.

ex :

object o=cmd.ExecuteScalar();(回傳一個欄位的值)

狀況1:當DB回傳有符合的資料,但該欄位沒有值時.o = DBNull 可是 o != null

狀況2:當DB回傳沒有符合的資料時, o = null可是o != DBNull

狀況3:不論是狀況1或狀況2的結果,Convert.ToString(o)=string.Empty;

 

string str1="" 和 string str2=null 的區別。

str1是一個空字符串,空字符串是一個特殊的字符串,只不過這個字符串的值為空,在內存中是有準確的指向的,

string str2=null,這樣定義後,只是定義了一個string 類的引用,str2並沒有指向任何地方,在使用前如果不實例化的話,都將報錯。

 

-------------------------------------------------------------------------------------------------------

它:「我愛寫程式ㄟ!」

我:「你...愛寫程式?」

它:「是阿!」

我:「你...愛用程式解決問題?愛寫出被大家所使用的程式?愛能夠用程式改變世界的力量?」

它:「沒錯!你說得太...」

我:「你愛日以繼夜焚膏繼晷的寫程式?你愛無法離座坐到屁股長痔瘡的寫程式?你愛寫程式愛到奮不顧身?」

它:「你...」

我:「你愛想破頭想到拿頭去撞牆想到掉光頭髮的寫程式?你愛被時程、需求、主管、客戶追著跑的寫程式?你愛寫程式即使程式不愛妳?」

我:「你愛你明明知道這樣不是好的寫法卻仍然得這樣寫?你愛維護別人寫出來的爛程式?你愛聽不懂的主管胡說八道該怎麼寫?」

它:「你在說什麼東西啦!你也沒有這樣子阿!」

我:「是阿,所以我不愛寫程式。」

它:「你懂不懂寫程式阿?」

我:「:)」