日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中的Explicit和Implicit了解一下吧

發(fā)布時間:2023/12/4 C# 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中的Explicit和Implicit了解一下吧 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天在研究公司項(xiàng)目框架的時候看到了下面的用法,public static implicit operator JsonData(int data);。貌似很久沒用過這種隱式轉(zhuǎn)換的寫法了,因此重新溫習(xí)一下C#中轉(zhuǎn)換相關(guān)的知識。

作者:依樂祝

原文地址:https://www.cnblogs.com/yilezhu/p/10898582.html

implicit

implicit 關(guān)鍵字用于聲明隱式的用戶自定義的類型轉(zhuǎn)換運(yùn)算符。 如果可以確保轉(zhuǎn)換過程不會造成數(shù)據(jù)丟失,則可使用該關(guān)鍵字在用戶定義類型和其他類型之間進(jìn)行隱式轉(zhuǎn)換。

使用隱式轉(zhuǎn)換操作符之后,在編譯時會跳過異常檢查,所以隱式轉(zhuǎn)換運(yùn)算符應(yīng)當(dāng)從不引發(fā)異常并且從不丟失信息,否則在運(yùn)行時會出現(xiàn)一些意想不到的問題。

示例

class Digit
{
? ?public Digit(double d) { val = d; }
? ?public double val;
? ?// ...other members

? ?// User-defined conversion from Digit to double
? ?public static implicit operator double(Digit d)
? {
? ? ? ?return d.val;
? }
? ?// User-defined conversion from double to Digit
? ?public static implicit operator Digit(double d)
? {
? ? ? ?return new Digit(d);
? }
}

class Program
{
? ?static void Main(string[] args)
? {
? ? ? ?Digit dig = new Digit(7);
? ? ? ?//This call invokes the implicit "double" operator
? ? ? ?double num = dig;
? ? ? ?//This call invokes the implicit "Digit" operator
? ? ? ?Digit dig2 = 12;
? ? ? ?Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
? ? ? ?Console.ReadLine();
? }
}

隱式轉(zhuǎn)換可以通過消除不必要的強(qiáng)制轉(zhuǎn)換來提高源代碼的可讀性。 但是,因?yàn)殡[式轉(zhuǎn)換不需要程序員將一種類型顯式強(qiáng)制轉(zhuǎn)換為另一種類型,所以使用隱式轉(zhuǎn)換時必須格外小心,以免出現(xiàn)意外結(jié)果。 一般情況下,隱式轉(zhuǎn)換運(yùn)算符應(yīng)當(dāng)從不引發(fā)異常并且從不丟失信息,以便可以在程序員不知曉的情況下安全使用它們。 如果轉(zhuǎn)換運(yùn)算符不能滿足那些條件,則應(yīng)將其標(biāo)記為 explicit。 有關(guān)詳細(xì)信息,請參閱使用轉(zhuǎn)換運(yùn)算符

explicit顯示轉(zhuǎn)換

explicit 關(guān)鍵字聲明必須通過顯示的調(diào)用用戶定義的類型轉(zhuǎn)換運(yùn)算符來進(jìn)行轉(zhuǎn)換。

以下示例定義從 Fahrenheit 類轉(zhuǎn)換為 Celsius 類的運(yùn)算符。 必須在 Fahrenheit 類或 Celsius 類中定義運(yùn)算符:

public static explicit operator Celsius(Fahrenheit fahr)
{
? ?return new Celsius((5.0f / 9.0f) * (fahr.Degrees - 32));
}

如下所示,調(diào)用用戶定義的轉(zhuǎn)換運(yùn)算符來強(qiáng)制轉(zhuǎn)換:

Fahrenheit fahr = new Fahrenheit(100.0f);
Console.Write($"{fahr.Degrees} Fahrenheit");
Celsius c = (Celsius)fahr;

此轉(zhuǎn)換運(yùn)算符從源類型轉(zhuǎn)換為目標(biāo)類型。 源類型提供轉(zhuǎn)換運(yùn)算符。 不同于隱式轉(zhuǎn)換,顯式轉(zhuǎn)換運(yùn)算符必須通過轉(zhuǎn)換的方式來調(diào)用。 如果轉(zhuǎn)換操作會導(dǎo)致異常或丟失信息,則應(yīng)將其標(biāo)記為 explicit。 這可阻止編譯器靜默調(diào)用可能產(chǎn)生意外后果的轉(zhuǎn)換操作。

省略轉(zhuǎn)換將導(dǎo)致編譯時錯誤 CS0266。

有關(guān)詳細(xì)信息,請參閱使用轉(zhuǎn)換運(yùn)算符

示例

下面的示例提供了 FahrenheitCelsius 類,其中每個類均提供轉(zhuǎn)換為其他類的顯式轉(zhuǎn)換運(yùn)算符。

class Celsius
{
? ?public Celsius(float temp)
? {
? ? ? ?Degrees = temp;
? }
? ?
? ?public float Degrees { get; }
? ?
? ?public static explicit operator Fahrenheit(Celsius c)
? {
? ? ? ?return new Fahrenheit((9.0f / 5.0f) * c.Degrees + 32);
? }
}

class Fahrenheit
{
? ?public Fahrenheit(float temp)
? {
? ? ? ?Degrees = temp;
? }
? ?
? ?public float Degrees { get; }
? ?
? ?public static explicit operator Celsius(Fahrenheit fahr)
? {
? ? ? ?return new Celsius((5.0f / 9.0f) * (fahr.Degrees - 32));
? }
}

class MainClass
{
? ?static void Main()
? {
? ? ? ?Fahrenheit fahr = new Fahrenheit(100.0f);
? ? ? ?Console.Write($"{fahr.Degrees} Fahrenheit");
? ? ? ?Celsius c = (Celsius)fahr;

? ? ? ?Console.Write($" = {c.Degrees} Celsius");
? ? ? ?Fahrenheit fahr2 = (Fahrenheit)c;
? ? ? ?Console.WriteLine($" = {fahr2.Degrees} Fahrenheit");
? }
}
// 輸出:
// 100 Fahrenheit = 37.77778 Celsius = 100 Fahrenheit

示例

下面的示例定義結(jié)構(gòu) Digit,它表示單個的十進(jìn)制數(shù)字。 將運(yùn)算符定義為從 byteDigit 的轉(zhuǎn)換,但由于并非所有字節(jié)都可轉(zhuǎn)換為 Digit,因此該轉(zhuǎn)換應(yīng)該應(yīng)用顯式轉(zhuǎn)換。

struct Digit
{
? ?byte value;
? ?public Digit(byte value)
? {
? ? ? ?if (value > 9)
? ? ? {
? ? ? ? ? ?throw new ArgumentException();
? ? ? }
? ? ? ?this.value = value;
? }

? ?// 定義從byte到Digit的顯示轉(zhuǎn)換 explicit operator:
? ?public static explicit operator Digit(byte b)
? {
? ? ? ?Digit d = new Digit(b);
? ? ? ?Console.WriteLine("轉(zhuǎn)換已完成");
? ? ? ?return d;
? }
}

class ExplicitTest
{
? ?static void Main()
? {
? ? ? ?try
? ? ? {
? ? ? ? ? ?byte b = 3;
? ? ? ? ? ?Digit d = (Digit)b; // 顯示轉(zhuǎn)換
? ? ? }
? ? ? ?catch (Exception e)
? ? ? {
? ? ? ? ? ?Console.WriteLine("{0} 捕獲到一成.", e);
? ? ? }
? }
}
/*
輸出:
轉(zhuǎn)換已完成
*/

參考資料

  • explicit

  • operator (C# Reference)

  • How to: Implement User-Defined Conversions Between Structs

  • implicit

.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?


總結(jié)

以上是生活随笔為你收集整理的C#中的Explicit和Implicit了解一下吧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。