欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#之用戶定義的數(shù)據(jù)類型轉換介紹

 更新時間:2014年01月16日 09:23:51   投稿:jingxian  
c#允許定義自己的數(shù)據(jù)類型,這意味著需要某些工具支持在自己的數(shù)據(jù)類型間進行數(shù)據(jù)轉換。方法是把數(shù)據(jù)類型轉換定義為相關類的一個成員運算符,數(shù)據(jù)類型轉換必須聲明是隱式或者顯式,以說明怎么使用它

c# 允許用戶進行兩種定義的數(shù)據(jù)類型轉換,顯式和隱式,顯式要求在代碼中顯式的標記轉換,其方法是在圓括號中寫入目標數(shù)據(jù)類型。

對于預定義的數(shù)據(jù)類型,當數(shù)據(jù)類型轉換時可能失敗或丟失某些數(shù)據(jù),需要顯式轉換,

1 把int數(shù)值轉換成short時,因為short可能不夠大,不能包含轉換的數(shù)值。

2 把有符號的數(shù)據(jù)轉換為無符號的數(shù)據(jù),如果有符號的變量包含一個負值,會得到不正確的結果。

3 把浮點數(shù)轉換為整數(shù)數(shù)據(jù)類型時,數(shù)字的小數(shù)部分會丟失。

此時應在代碼中進行顯式數(shù)據(jù)類型,因此編寫代碼時套把這些可能考慮在內。

c#允許定義自己的數(shù)據(jù)類型,這意味著需要某些工具支持在自己的數(shù)據(jù)類型間進行數(shù)據(jù)轉換。方法是把數(shù)據(jù)類型轉換定義為相關類的一個成員運算符,數(shù)據(jù)類型轉換必須聲明是隱式或者顯式,以說明怎么使用它。

注意:如果源數(shù)據(jù)值使數(shù)據(jù)轉換失敗,或者可能會拋出異常,就應把數(shù)據(jù)類型轉換定義為顯式。

定義數(shù)據(jù)類型轉換的語法類似于運算符重載。

例如  :隱式類型轉換:

復制代碼 代碼如下:

public static implicit operator float(Current current)
{
}

和運算符重載相同,數(shù)據(jù)類型轉換必須聲明為public和static。

注意:

當數(shù)據(jù)類型轉換聲明為隱式時,編譯器可以顯式或者隱式的調用數(shù)據(jù)類型轉換。

當數(shù)據(jù)類型轉換聲明為顯式時,編譯器只能顯式的調用類型轉換。

下面是個小例子:

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 類型轉換
{
struct Current
{
public uint Dollars;
public ushort Cents;

public Current(uint dollars, ushort cents)
{
this.Dollars = dollars;
this.Cents = cents;
}

public override string ToString()
{
return string.Format("{0}.{1,-2:00}",Dollars,Cents);
}

public static implicit operator float(Current value)
{
return value.Dollars+(value.Cents/100.0f);
}

public static explicit operator Current(float f)
{
uint dollars = (uint)f;
ushort cents = (ushort)((f - dollars) * 100);
return new Current(dollars,cents);
}

}

class Program
{
static void Main(string[] args)
{
try
{
Current balance = new Current(50, 35);
Console.WriteLine(balance);
Console.WriteLine("balance using tostring(): "+balance.ToString());
float balance2 = balance;
Console.WriteLine("After converting to float,= " + balance2);
balance = (Current)balance2;
Console.WriteLine("After converting to Current,= " + balance);
float t = 45.63f;
Current c = (Current)t;
Console.WriteLine(c.ToString());

checked
{
balance = (Current)(-50.5);
Console.WriteLine("Result is:" + balance.ToString());
}
}
catch (System.Exception ex)
{
Console.WriteLine("Exception occurred:" + ex.Message);
}
Console.ReadKey();
}
}
}


將涉及到兩個問題:

1 從float轉換為Current得到錯誤的結果50.34,而不是50.35.----圓整造成的....發(fā)生截斷問題。

答:如果float值轉換為uint值,計算機就會截斷多余的數(shù)字,而不是去圓整它。計算機中數(shù)據(jù)是通過二進制存儲的,而不是十進制,小數(shù)部分0.35不能以二進制形式儲存。因為舍棄一部分,故實際轉化成的數(shù)據(jù)要小于0.35,即可以用二進制形式存儲的值,然后數(shù)字乘以100,得到小于35的數(shù)字34.有時候這種階段是很危險的,避免這種錯誤的方式時確保在數(shù)字轉換過程中執(zhí)行智能圓整操作。

Microsoft編寫了一個類System.Covert來完成該任務。System.Covert包含大量的靜態(tài)方法來執(zhí)行各種數(shù)字轉換,我們要使用的是Convert.ToUInt16()。注意,在使用System.Covert方法產(chǎn)生額外的性能損耗,所以只有在需要的時候才使用。

注意: System.Covert方法還執(zhí)行他們自己的溢出檢查,所以

復制代碼 代碼如下:

Convert.ToUInt16((f - dollars) * 100);

可以不放在checked里面.

2 在試圖轉換超出范圍的值時,沒有發(fā)生異常。主要是因為:發(fā)生溢出的位置根本就不在Main例程中--這是在轉換運算符的代碼中發(fā)生的,改代碼在Main()方法中調用,該方法沒有標記為checked。  其解決方法:

復制代碼 代碼如下:

 public static explicit operator Current(float f)
{
checked
{
uint dollars = (uint)f;
ushort cents = Convert.ToUInt16((f - dollars) * 100);
return new Current(dollars, cents);
}
}<SPAN style="FONT-FAMILY: Arial, Verdana, sans-serif">
</SPAN>

相關文章

最新評論