C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的區別

來源:互聯網
上載者:User

標籤:os   ar   for   資料   問題   代碼   on   c   r   

在編程過程中,資料轉換是經常要用到的,C#中資料轉換的方法很多,拿將目標對象轉換為整型(int)來講,有四種方法:分別為(int)、int.Parse()、int.TryParse()和Convert.ToInt32(),那麼這四種方法對被轉換對象有什麼限制,以及各自之間有什麼區別呢?相信很多童鞋也不能完全說清楚。

下面從被轉換對象說起,在我們實際開發項目的過程中,我們碰到需要被轉換的類型大概有3大類,分別是空值(NULL)、數字類型(包含float,double,int,long等)和字串(string)這3類。

先看第一種情況:NULL,採用如下代碼進行測試:

int a = Convert.ToInt32(null);
int b;
bool rlt = int.TryParse(null, out b);
int c = int.Parse(null);
int d = (int)null;

很明顯,在運行之前VS就會在最後一句報錯:“Cannot convert null to ‘int‘ because it is a non-nullable value type”,這是說不能將NULL轉換為INT因為INT是一個非空實值型別,然後注釋掉最後一句,再運行一下,發現這一句(int c = int.Parse(null);)會報如下錯誤:“Value cannot be null.”,值不可為空,a和b分別返回0,rlt為false;

然後繼續看第二種情況:數字類型(主要測試double和long類型),先將代碼修改如下:

double m = 1.232d;
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m.ToString(), out b);
int c = int.Parse(m.ToString());
int d = (int)m;

然後運行一下,發現這一句(int c = int.Parse(m.ToString());)會報錯:“Input string was not in a correct format.”,輸入的字串格式不正確,注釋掉這一句然後運行,然後查看傳回值,a=1,b=0,rlt=false,d=1,將m的值修改為1.532d後再運行一次,查看結果為a=2,b=0,rlt=false,d=1;下面測試long類型,將代碼修改為:

long m = 9223372036854775807;
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m.ToString(), out b);
int c = int.Parse(m.ToString());
int d = (int)m;

運行後發現(int a = Convert.ToInt32(m);)和(int c = int.Parse(m.ToString());)報錯:“Value was either too large or too small for an Int32.”,值對於Int32太大或太小,其他返回結果b=0,rlt=false,d=-1;

下面繼續看第三種情況:字串,同樣修改代碼如下:

string m = "1.32";
int a = Convert.ToInt32(m);
int b;
bool rlt = int.TryParse(m, out b);
int c = int.Parse(m);
int d = (int)m;

發現最後一句(int d = (int)m;)報錯:“Cannot convert type ‘string‘ to ‘int‘”,不能轉換string到int類型,同樣注釋掉這句再運行,發現(int a = Convert.ToInt32(m);)和(int c = int.Parse(m);)均報如下的錯誤:“Input string was not in a correct format.”,輸入的字串格式不正確,只有將m的值修改為整型的字串(如:”12”)才不會報如此錯誤。

好了,測試做完了,下面進行總結:

1)對於轉換對象,Convert.ToInt32()可以為多種類型(例出數字類型外bool,DateTime等),int.TryParse()和int.Parse()只能是整型字串類型(即各種整型ToString()之後的形式,不能為浮點型,否則int.Parse()就會出現輸入的字串格式不正確的錯誤,int.TryParse()也會返回false,輸出參數為0),(int)只能是數字類型(例float,int,uint等);

2)對於空值NULL,從運行報錯的角度講,(int)強制轉換和int.Parse()都不能接受NULL;Convert.ToInt32()其實是在轉換前先做了一個判斷,參數如果為NULL,則直接返回0,否則就調用int.Parse()進行轉換,int.TryParse()其實是對int.Parse()做了一個異常處理,如果出現異常則返回false,並且將輸出參數返回0;

3)針對於浮點型的取捨問題,浮點型只有Convert.ToInt32()和(int)能進行轉換,但是也是進行取捨了的,Convert.ToInt32()採取的取捨是進行四捨五入,而(int)則是截取浮點型的整數部分,忽略小數部分,例如Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而(int)1.5d還是返回1;

4)關於溢出,將大的資料類型轉換為小的資料類型時Convert.ToInt32()和int.Parse()都會報溢出錯誤,值對於Int32太大或太小,而(int)不報錯,但是傳回值為-1。

如此可見,我們在進行資料轉換前選擇轉換方法要謹慎,如果是數字類型可以考慮直接用(int)強制轉換,如果是整型字串類型的,考慮用int.Parse()進行轉換,如果不是這兩種類型,再考慮用Convert.ToInt32()進行轉換。

C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.