最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# 使用模式匹配以及 is 和 as 運算符安全地進行強制轉(zhuǎn)換

 更新時間:2020年10月13日 10:37:03   作者:olprod  
這篇文章主要介紹了c# 使用模式匹配以及 is 和 as 運算符安全地進行強制轉(zhuǎn)換,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

由于是多態(tài)對象,基類類型的變量可以保存派生類型。 要訪問派生類型的實例成員,必須將值強制轉(zhuǎn)換回派生類型。 但是,強制轉(zhuǎn)換會引發(fā) InvalidCastException 風險。 C# 提供模式匹配語句,該語句只有在成功時才會有條件地執(zhí)行強制轉(zhuǎn)換。 C# 還提供 is 和 as 運算符來測試值是否屬于特定類型。

下面的示例演示如何使用模式匹配 is 語句:

class Animal
{
  public void Eat() { Console.WriteLine("Eating."); }
  public override string ToString()
  {
    return "I am an animal.";
  }
}
class Mammal : Animal { }
class Giraffe : Mammal { }

class SuperNova { }

class Program
{
  static void Main(string[] args)
  {
    var g = new Giraffe();
    var a = new Animal();
    FeedMammals(g);
    FeedMammals(a);
    // Output:
    // Eating.
    // Animal is not a Mammal

    SuperNova sn = new SuperNova();
    TestForMammals(g);
    TestForMammals(sn);
    // Output:
    // I am an animal.
    // SuperNova is not a Mammal
  }

  static void FeedMammals(Animal a)
  {
    if (a is Mammal m)
    {
      m.Eat();
    }
    else
    {
      // variable 'm' is not in scope here, and can't be used.
      Console.WriteLine($"{a.GetType().Name} is not a Mammal");
    }
  }

  static void TestForMammals(object o)
  {
    // You also can use the as operator and test for null
    // before referencing the variable.
    var m = o as Mammal;
    if (m != null)
    {
      Console.WriteLine(m.ToString());
    }
    else
    {
      Console.WriteLine($"{o.GetType().Name} is not a Mammal");
    }
  }
}

前面的示例演示了模式匹配語法的一些功能。 if (a is Mammal m) 語句將測試與初始化賦值相結(jié)合。 只有在測試成功時才會進行賦值。 變量 m 僅在已賦值的嵌入式 if 語句的范圍內(nèi)。 以后無法在同一方法中訪問 m。 前面的示例還演示了如何使用 as 運算符將對象轉(zhuǎn)換為指定類型。
也可以使用同一語法來測試可為 null 的值類型是否具有值,如以下示例所示:

class Program
{
  static void Main(string[] args)
  {
    int i = 5;
    PatternMatchingNullable(i);

    int? j = null;
    PatternMatchingNullable(j);

    double d = 9.78654;
    PatternMatchingNullable(d);

    PatternMatchingSwitch(i);
    PatternMatchingSwitch(j);
    PatternMatchingSwitch(d);
  }

  static void PatternMatchingNullable(System.ValueType val)
  {
    if (val is int j) // Nullable types are not allowed in patterns
    {
      Console.WriteLine(j);
    }
    else if (val is null) // If val is a nullable type with no value, this expression is true
    {
      Console.WriteLine("val is a nullable type with the null value");
    }
    else
    {
      Console.WriteLine("Could not convert " + val.ToString());
    }
  }

  static void PatternMatchingSwitch(System.ValueType val)
  {
    switch (val)
    {
      case int number:
        Console.WriteLine(number);
        break;
      case long number:
        Console.WriteLine(number);
        break;
      case decimal number:
        Console.WriteLine(number);
        break;
      case float number:
        Console.WriteLine(number);
        break;
      case double number:
        Console.WriteLine(number);
        break;
      case null:
        Console.WriteLine("val is a nullable type with the null value");
        break;
      default:
        Console.WriteLine("Could not convert " + val.ToString());
        break;
    }
  }
}

前面的示例演示了模式匹配用于轉(zhuǎn)換的其他功能。 可以通過專門檢查 null 值來測試 NULL 模式的變量。 當變量的運行時值為 null 時,用于檢查類型的 is 語句始終返回 false。 模式匹配 is 語句不允許可以為 null 值的類型,如 int? 或 Nullable<int>,但你可以測試任何其他值類型。 上述示例中的 is 模式不局限于可為空的值類型。 也可以使用這些模式測試引用類型的變量具有值還是為 null。
前面的示例還演示如何在變量為其他類型的 switch 語句中使用類型模式。
如果需要測試變量是否為給定類型,但不將其分配給新變量,則可以對引用類型和可以為 null 的值類型使用 is 和 as 運算符。 以下代碼演示如何在引入模式匹配以測試變量是否為給定類型前,使用 C# 語言中的 is 和 as 語句:

class Animal
{
  public void Eat() { Console.WriteLine("Eating."); }
  public override string ToString()
  {
    return "I am an animal.";
  }
}
class Mammal : Animal { }
class Giraffe : Mammal { }

class SuperNova { }

class Program
{
  static void Main(string[] args)
  {
    // Use the is operator to verify the type.
    // before performing a cast.
    Giraffe g = new Giraffe();
    UseIsOperator(g);

    // Use the as operator and test for null
    // before referencing the variable.
    UseAsOperator(g);

    // Use the as operator to test
    // an incompatible type.
    SuperNova sn = new SuperNova();
    UseAsOperator(sn);

    // Use the as operator with a value type.
    // Note the implicit conversion to int? in
    // the method body.
    int i = 5;
    UseAsWithNullable(i);

    double d = 9.78654;
    UseAsWithNullable(d);
  }

  static void UseIsOperator(Animal a)
  {
    if (a is Mammal)
    {
      Mammal m = (Mammal)a;
      m.Eat();
    }
  }

  static void UsePatternMatchingIs(Animal a)
  {
    if (a is Mammal m)
    {
      m.Eat();
    }
  }

  static void UseAsOperator(object o)
  {
    Mammal m = o as Mammal;
    if (m != null)
    {
      Console.WriteLine(m.ToString());
    }
    else
    {
      Console.WriteLine($"{o.GetType().Name} is not a Mammal");
    }
  }

  static void UseAsWithNullable(System.ValueType val)
  {
    int? j = val as int?;
    if (j != null)
    {
      Console.WriteLine(j);
    }
    else
    {
      Console.WriteLine("Could not convert " + val.ToString());
    }
  }
}

正如你所看到的,將此代碼與模式匹配代碼進行比較,模式匹配語法通過在單個語句中結(jié)合測試和賦值來提供更強大的功能。 盡量使用模式匹配語法。

以上就是c# 使用模式匹配以及 is 和 as 運算符安全地進行強制轉(zhuǎn)換的詳細內(nèi)容,更多關(guān)于c# 強制轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#實現(xiàn)在線點餐系統(tǒng)

    C#實現(xiàn)在線點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)在線點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C#提取PPT文本和圖片的實現(xiàn)方法

    C#提取PPT文本和圖片的實現(xiàn)方法

    這篇文章主要為大家詳細介紹了C#提取PPT文本和圖片的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • C#把文件上傳到服務(wù)器中的指定地址

    C#把文件上傳到服務(wù)器中的指定地址

    這篇文章介紹了C#實現(xiàn)文件上傳到服務(wù)器指定地址的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 簡單聊聊C#的線程本地存儲TLS到底是什么

    簡單聊聊C#的線程本地存儲TLS到底是什么

    C#的ThreadStatic是假的,因為C#完全是由CLR(C++)承載的,言外之意C#的線程本地存儲,用的就是用C++運行時提供的 __declspec(thread)或__thread來虛構(gòu)的一套玩法,下面我們就來深入講講C#的線程本地存儲TLS到底是什么吧
    2024-01-01
  • C#序列化成XML注意細節(jié)

    C#序列化成XML注意細節(jié)

    最常用的序列化是把某個類序列化成二進制文件.但有時我們也會把類序列化成xml文件,需要的朋友可以參考下
    2012-11-11
  • 實例代碼講解c# 線程(上)

    實例代碼講解c# 線程(上)

    這篇文章主要介紹了講解c# 線程的的相關(guān)資料,文中示例代碼非常詳細,供大家參考和學(xué)習,感興趣的朋友可以了解下
    2020-06-06
  • C#簡單的特殊輸出實例

    C#簡單的特殊輸出實例

    這篇文章主要介紹了C#簡單的特殊輸出,以實例實現(xiàn)了針對一些特殊字符與位置的輸出控制,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • C#判斷某程序是否運行的方法

    C#判斷某程序是否運行的方法

    這篇文章主要介紹了C#判斷某程序是否運行的方法,代碼結(jié)構(gòu)簡單功能實用,需要的朋友可以參考下
    2014-09-09
  • C#實現(xiàn)簡單的計算器功能(窗體)

    C#實現(xiàn)簡單的計算器功能(窗體)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡單的計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C# 判斷字符串為空的幾種辦法

    C# 判斷字符串為空的幾種辦法

    C# 判斷字符串為空的幾種辦法,需要的朋友可以參考一下
    2013-04-04

最新評論

高州市| 伊金霍洛旗| 洞口县| 灵川县| 静海县| 宁陵县| 榆树市| 南充市| 万源市| 蒙自县| 晋宁县| 海淀区| 罗城| 宁津县| 马公市| 石家庄市| 泰和县| 闸北区| 鄯善县| 汝城县| 浦城县| 黔东| 宣化县| 南充市| 凤阳县| 宁海县| 建昌县| 石渠县| 横峰县| 房产| 邢台县| 黄石市| 朝阳区| 闵行区| 潮安县| 台北市| 北宁市| 镇康县| 察雅县| 乌兰县| 阿巴嘎旗|