C# 例外の強化

PHPz
リリース: 2017-03-12 15:45:50
オリジナル
1250 人が閲覧しました

0. ディレクトリ

C#6 新しい 機能ディレクトリ

1. C#5​​ での await の使用と finally ブロック

新しい非同期 プログラミングをサポートするためのキーワードのペアの導入 モデル は、C# の非同期プログラミング モデル (APM->EAP->TAP->await/async) をさらに簡略化します。C# の非同期プログラミング モデルは、この記事の一部ではありません。 はじめに キー ポイント、詳細情報こちらにアクセスしてください。Asynchronousプログラミングパターン)。 await/async は C#5 で導入されましたが、catch および finally ステートメント ブロックでは使用できないなど、いくつかの制限があります。この制限は C#6 では適用されません。


 1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4  5 namespace csharp6 6 { 7     internal class Program 8     { 9         private static void Main(string[] args)10         {11             do12             {13                 Log(ConsoleColor.White, "caller method begin", true);14                 CallerMethod();15                 Log(ConsoleColor.White, "caller method end");16             } while (Console.ReadKey().Key != ConsoleKey.Q);17         }18 19         public static async void CallerMethod()20         {21             try22             {23                 Log(ConsoleColor.Yellow, "try ", true);24                 throw new Exception();25             }26             catch (Exception)27             {28                 Log(ConsoleColor.Red, "catch await begin", true);29                 await AsyncMethod();30                 Log(ConsoleColor.Red, "catch await end");31             }32             finally33             {34                 Log(ConsoleColor.Blue, "finally await begin", true);35                 await AsyncMethod();36                 Log(ConsoleColor.Blue, "finally await end");37             }38         }39 40         private static Task AsyncMethod()41         {42             return Task.Factory.StartNew(() =>43             {44                 Log(ConsoleColor.Green, "async method begin");45                 Thread.Sleep(1000);46                 Log(ConsoleColor.Green, "async method end");47             });48         }49 50         private static void Log(ConsoleColor color, string message, bool newLine = false)51         {52             if (newLine)53             {54                 Console.WriteLine();55             }56             Console.ForegroundColor = color;57             Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");58         }59     }60 }
ログイン後にコピー

実行結果は次のとおりです:

注意して見ると、async メソッド begin:6 の色は実際には私が設定した緑ではなく白であることがわかります。順序も乱れており、再度実行すると緑色になる可能性があります。これは実際には、私の Log メソッド (非スレッド safe メソッド) の 2 行のコードが複数のスレッドによって呼び出されていることが原因です。 (C# でこれを行う方法はたくさんありますが、これはそのうちの 1 つにすぎません):


1 Console.ForegroundColor = color;2 Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");
ログイン後にコピー

少し話が逸れているようですが、本題に戻り、catch およびfinally ステートメント ブロックで await キーワードをサポートします。 IL 命令は必要ありません。 サポートは CLR サポートを必要としませんが、コンパイラーによって行われる単なるコード変換です (await/async はデリゲートするラムダのようなものです)。特定の IL については説明しません。大きすぎるため、一般的な状況を示す図を以下に示します。


CallerMethod で作成したコードは Move

Next

に転送されました (詳細については、ブログをご覧ください)モバイル ガーデンの友人「Dev_Eric」による: 高度な記事: IL を剣として使用し、async/await を直接指す) (catch とfinally の await ステートメントを含む)。

2. 例外

フィルター

実際、この言語機能は VB と F# で長い間サポートされており、現在は C#6 でも使用できるようになりました。

 1 [MethodImpl(MethodImplOptions.Synchronized)] 2 private static void Log(ConsoleColor color, string message, bool newLine = false) 3 { 4     if (newLine) 5     { 6         Console.WriteLine(); 7     } 8     Console.ForegroundColor = color; 9     Console.WriteLine($"{message,-20} : {Thread.CurrentThread.ManagedThreadId}");10 }
ログイン後にコピー

when ブロックは、例外フィルターが有効になる場所です。 when の後に

expression

が続きます。式の結果が true の場合、現在の catch ステートメント ブロックに入ります。

3. リファレンス

非同期プログラミング パターン

C# 6.0 await in catch/finally

C# 6.0 例外フィルター

http://www.php.cn/

以上がC# 例外の強化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
c#
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート