- 投稿日:2019-10-12T21:49:03+09:00
Template Method Pattern C# 8.0風味
Template Method Pattern C# 8.0風味
C# 8.0の機能を活用して、今までのパターンを書き換えることができそうなので、少し記事を書いてみます。
新手法なのか、機能の悪用なのかは、今のところ判断しかねているところです(^^;調理前(C# 7.3以前)
3つの抽象メソッドを順番に呼ぶ
Execute()
メソッドを持つ、単純なサンプルです。public abstract class AbstractWorker { protected abstract void Begin(); protected abstract void Do(); protected abstract void End(); public void Execute() { Begin(); Do(); End(); } } public class MyWorker : AbstractWorker { protected override void Begin() => Console.WriteLine("▽▽▽"); protected override void Do() => Console.WriteLine("Do"); protected override void End() => Console.WriteLine("△△△"); public static AbstractWorker Create() => new MyWorker(); }調理後(C# 8.0風味)
抽象クラスで書いていた箇所を、C# 8.0 で追加されたインターフェイスの既定メンバー 機能で置き換えたものです。
public interface IWorker { protected void Begin(); protected void Do(); protected void End(); sealed void Execute() { Begin(); Do(); End(); } } public class MyWorker : IWorker { void IWorker.Begin() => Console.WriteLine("▽▽▽"); void IWorker.Do() => Console.WriteLine("Do"); void IWorker.End() => Console.WriteLine("△△△"); public static IWorker Create() => new MyWorker(); }インターフェイスでは既定で
public
かつabstract
のため、多少の違いはあるものの、ほぼほぼ同じ書き方で同じ機能を実現できました。まとめ
C# 8.0 にてインターフェイスメンバーの既定実装の機能が追加されました。これはインターフェイスのバージョンアップを容易にするための機能です。
ですが、それだけでない機能追加があることも見逃せません。みなさんも新たな機能で何ができるか試してみて、何か見つけたらQiitaで教えてください。
- 投稿日:2019-10-12T21:27:57+09:00
【C#】配列の定義
- 投稿日:2019-10-12T21:21:30+09:00
NLog 日付ログファイルのローテーションを同じフォルダで行う
はじめに
NLogでログファイル名を日付にして保存期間ありにしたいときの設定方法です。
NLogのfile targetのドキュメントには、
ローテーションがDateのときは、archiveFileは別のフォルダにしなければいけないと説明があります。
CurrentFileに日付ファイル名を指定して、同じフォルダのままできないかと思い、設定の組み合わせを見つけました。環境
Windows10 Professional 1903
Microsoft Visual Studio Enterprise 2019 Version 16.3.1
Microsoft .NET Framework Version 4.7.2
Microsoft Visual C# 7.0
NLog for .Net Framework 4.5 ver.4.6.7Example
NLog.config<targets> <target xsi:type="File" name="MyFile" fileName="C:\hoge\Log\${date:format=yyyyMMdd}.log" layout="${longdate} :${level} ${logger}:: ${message} ${exception}" encoding="UTF-8" archiveFileName="C:\hoge\Log\{#}.log" archiveNumbering="Date" archiveDateFormat="yyyyMMdd" maxArchiveFiles="7" concurrentWrites="true" /> </targets> <rules> <logger name="*" minlevel="Info" writeTo="MyFile" final="true" /> </rules>ローテーションのarchiveEvery="Day"を指定しないようにすると、archiveが実行されないで、CurrentFileに日付を指定してもうまくローテーションができました。
logフォルダの結果
currentFile(20191012.log)とarchiveFileの7ファイルを残して削除ができました。
- 投稿日:2019-10-12T14:00:42+09:00
Exception Class からエラーコードを解析する ~超基礎編~
仕事で C# プロジェクトが吐き出したエラーコードを解析しエラーの箇所を特定するために、Exception class を活用することがありました。これまで Exception Class についてあまり把握しきれてなかったので、勉強のため整理してみようと思います。
この記事では、まず Exception Class の超基本的な使い方を整理し、色々な Exception Class を今後使えるようにしていこうと思います。Visual Studio で 適当な C# コード書いてみる
まずは、Visual Studio の「新しいプロジェクトの作成」から、適当な ASP.core のコンソールアプリを作成します。
今回は、以下コードを入力し、割り算を算出するコンソールアプリを作成しました。program.csusing System; namespace ConsoleApp20191012 { class Program { static void Main(string[] args) { int num1 = 0; int num2 = 0; Console.WriteLine("Console Calcutator i C#\r"); Console.WriteLine("Type a number, and then press Enter"); num1 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Type a number, and then press Enter"); num2 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine($"Your result: {num1} / {num2} = " + (num1 / num2)); Console.Write("Press any key to close the Calculator console app..."); Console.ReadKey(); } } }このコードは単純にコンソールで入力した二つの数字を割り算するコードです。
例えば最初の数字を100、二つ目の数字を4と入力すると、25という答えがでます。
この時入力した値は、100 と 4 という明らかな整数でしたが、これをたとえばひらがなを入力してみるとどうなるでしょうか。
コンソールの入力で「あ」と入力したときには、ハンドルされていない例外というアラートと共にデバックが停止しました。
これは Visual Studio の機能の一つですが、こういった例外が入力された際に、デバッグの途中で停止するのではなく、コンソールに何かしらの文字を返すような処理をしたいときに便利なのが、「Exception Class」です。Exception Class を挿入する
Exception Class の挿入は簡単で、try/catchを使います。
Try の中で処理されるものの例外が、Catch に飛ばされるという感じです。
例えば先ほどの例外処理にあった「あ」という数字以外のものが入力された際に、コンソールに「正しい値を入力してください」という書き込みをする処理をさせるためには、以下のようなコード書きます。最初の文字を入力する際に、例外処理がある場合にコンソールに文字「正しい値を入力してください」を出力されるような処理です。実施にデバッグしてみると、以下のような結果になります。
これが例外処理の超基礎的なコードです。
これは単純におかしな値が入力されたときに例外を返す処理を行っていますが、例えば「〇〇÷0」というように分母の正しくない数字が入力された場合は「ArithmeticException Class」を使います。ArithmeticException Class を使ってみる
Exception Class は色々な Class が用意されていますが、その中にある、数式的な例外があったときに処理を実行する ArithmeticException Class を使ってみます。
先ほどのコードを以下のように置き換えてみます。
計算をする処理のところで例外処理で、「分母には正しい文字を入力してください」という文字を返すようにしています。結果分子に100、0を入力すると、例外処理を返すようになっています。
これで正しく例外処理を設定できました。
以下コードです。program.csusing System; namespace ConsoleApp20191012 { class Program { static void Main(string[] args) { int num1 = 0; int num2 = 0; Console.WriteLine("Console Calcutator i C#\r"); Console.WriteLine("Type a number, and then press Enter"); try { num1 = Convert.ToInt32(Console.ReadLine()); } catch (Exception e) { Console.WriteLine("正しい値を入力してください"); } Console.WriteLine("Type a number, and then press Enter"); num2 = Convert.ToInt32(Console.ReadLine()); try { Console.WriteLine($"Your result: {num1} / {num2} = " + (num1 / num2)); } catch (ArithmeticException e) { Console.WriteLine("分母には正しい文字を入力してください"); } Console.Write("Press any key to close the Calculator console app..."); Console.ReadKey(); } } }超基礎編は以上ですが、上記の処理は毎日ウォーミングアップで書いても良いくらいよく使うので、しっかり理解していきたいと思います。次回の例外の記事では、例外と throw メソッドを活用したデバッグについて整理していきたいと思います。
参考URL
Visual Studio でシンプルな C# コンソール アプリを作成する
https://docs.microsoft.com/ja-jp/visualstudio/get-started/csharp/tutorial-console?view=vs-2019Exception Class
https://docs.microsoft.com/ja-jp/dotnet/api/system.exception?view=netframework-4.8ArithmeticException Class
https://docs.microsoft.com/ja-jp/dotnet/api/system.arithmeticexception?view=netframework-4.8