五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現在的位置: 365建站網 > 365文章 > C#中String.Empty、NULL與""的用法和區(qū)別

C#中String.Empty、NULL與""的用法和區(qū)別

文章來源:365jz.com     點擊數:687    更新時間:2018-06-06 08:29   參與評論

(1)""和String.Empty的用法

   這兩個都是表示空字符串。只不過""理論上重新開辟內存空間,而String.Empty指向一處。不過優(yōu)化器會優(yōu)化的!

   我要反駁網上有人說string.Empty 不分配存儲空間,"" 分配一個長度為空的存儲空間這個觀點。首先string.Empty與""都會分配存儲空間,具體的說是都會在內存的棧和堆上分配存儲空間。,所以一般用string.Empty,為了以后跨平臺,還是用string.empty。

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

string s = "";
string s2 = string.Empty;
if (s == string.Empty) {
//if語句成立
}


(2)NULL的用法
null 關鍵字是表示不引用任何對象的空引用的文字值。null 是引用類型變量的默認值。那么也只有引用型的變量可以為NULL,如果int i=null,的話,是不可以的,因為Int是值類型的。


(3)判定為空字符串的幾種寫法,按照性能從高到低的順序是:

s.Length == 0 優(yōu)于 s == string.Empty 優(yōu)于 s == ""

總結:

1.String.Empty和""是一樣的,都是空,習慣用string.empty。 Null和他們就有區(qū)別了,就是沒有值,也沒分配地址,此處可以理解成什么都沒有。    

2.string str1="" 和 string str2=null 的區(qū)別。

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

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


實例論證:

一、string.Empty和""

1、Empty是string類中的一個靜態(tài)的只讀字段,它是這樣定義的:

// Summary:  
//     Represents the empty string. This field is read-only.  
public static readonly string Empty;

 

       也就是說 string.Empty 的內部實現是等于 "" 的。二者在優(yōu)化方面稍有差別,string.Empty 是 C# 對 "" 在語法級別的優(yōu)化。這點可以從上面 string.Empty 的內部實現看出來。也就是說 "" 是通過 CLR(Common Language Runtime)進行優(yōu)化的,CLR 會維護一個字符串池,以防在堆中創(chuàng)建重復的字符串。而 string.Empty 是一種 C# 語法級別的優(yōu)化,是在C#編譯器將代碼編譯為 IL (即 MSIL )時進行了優(yōu)化,即所有對string類的靜態(tài)字段Empty的訪問都會被指向同一引用,以節(jié)省內存空間。

        PS:MSIL(Microsoft Intermediate Language (MSIL)微軟中間語言)。

2、引用類型的數據將對象在堆上的地址保存在棧上,將對象的實際數據保存在堆上。string.Empty與 "" 都會分配存儲空間,具體的說是都會在內存的棧和堆上分配存儲空間。因此string.Empty與“”都會在棧上保存一個地址,這個地址占4字節(jié),指向內存堆中的某個長度為0的空間,這個空間保存的是string.Empty的實際值。

        代碼如下:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace string_Empty  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            stringTest();  
        }  
  
        public static void stringTest()  
        {  
            string str;  
            string str1;  
            string str2;  
            string str3;  
  
            str = string.Empty;  
            str1 = string.Empty;  
            str2 = "";  
            str3 = "";  
        }  
    }  
}

        設置斷點后運行結果如下:


 
        可以發(fā)現這種寫法下,string.Empty 和 "" 的地址是相同的。  

        由于 string.Empty 定義為 static readonly ,又根據上面運行結果得知, string.Empty 不會申請新的內存,而是每次去指向固定的靜態(tài)只讀內存區(qū)域,""也一樣。    

        string.Empty 與 "" 在用法與性能上基本沒區(qū)別。string.Empty 是在語法級別對 "" 的優(yōu)化。

二、string.Empty 和 ""與 null 的區(qū)別

        代碼如下:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace string_Empty  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            stringTest();  
        }  
  
        public static void stringTest()  
        {  
            string str;  
            string str1;  
            string str2;  
  
            str = string.Empty;  
            str1 = "";  
            str2 = null;  
        }  
    }  
}

        設置斷點后運行結果如下:


        從運行結果可以看出,string.Empty 和 "" 在棧和堆上都分配了空間,而 null 只在棧上分配了空間,在堆上沒有分配,也即變量不引用內存中的任何對象。


如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網友會為你解答??! 點擊進入論壇

發(fā)表評論 (687人查看0條評論)
請自覺遵守互聯網相關的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學習

業(yè)務咨詢

· 技術支持
· 服務時間:9:00-18:00
365建站網二維碼

Powered by 365建站網 RSS地圖 HTML地圖

copyright © 2013-2024 版權所有 鄂ICP備17013400號