20191012のC#に関する記事は4件です。

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で教えてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】配列の定義

配列の定義方法を忘れてしまいそうなので、自分用にメモ

方法1: 配列を定義してから、値を代入する。

int[] xList = new int[3];
xList[0] = 0;
xList[1] = 4;
xList[2] = 2;

方法2: 配列の定義と代入をワンライナーで行う。

int[] yList = new int[3] { 1, 5, 2 };

まとめ

ホントにメモ!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.7

Example

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フォルダの結果

  • ログ出力実行前

    logfolder3

  • ログ出力実行後

    logfolder4.png

currentFile(20191012.log)とarchiveFileの7ファイルを残して削除ができました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Exception Class からエラーコードを解析する ~超基礎編~

仕事で C# プロジェクトが吐き出したエラーコードを解析しエラーの箇所を特定するために、Exception class を活用することがありました。これまで Exception Class についてあまり把握しきれてなかったので、勉強のため整理してみようと思います。
この記事では、まず Exception Class の超基本的な使い方を整理し、色々な Exception Class を今後使えるようにしていこうと思います。

Visual Studio で 適当な C# コード書いてみる

まずは、Visual Studio の「新しいプロジェクトの作成」から、適当な ASP.core のコンソールアプリを作成します。
今回は、以下コードを入力し、割り算を算出するコンソールアプリを作成しました。

program.cs
using 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という答えがでます。
image.png

この時入力した値は、100 と 4 という明らかな整数でしたが、これをたとえばひらがなを入力してみるとどうなるでしょうか。

image.png

コンソールの入力で「あ」と入力したときには、ハンドルされていない例外というアラートと共にデバックが停止しました。
これは Visual Studio の機能の一つですが、こういった例外が入力された際に、デバッグの途中で停止するのではなく、コンソールに何かしらの文字を返すような処理をしたいときに便利なのが、「Exception Class」です。

Exception Class を挿入する

Exception Class の挿入は簡単で、try/catchを使います。
Try の中で処理されるものの例外が、Catch に飛ばされるという感じです。
例えば先ほどの例外処理にあった「あ」という数字以外のものが入力された際に、コンソールに「正しい値を入力してください」という書き込みをする処理をさせるためには、以下のようなコード書きます。

image.png

最初の文字を入力する際に、例外処理がある場合にコンソールに文字「正しい値を入力してください」を出力されるような処理です。実施にデバッグしてみると、以下のような結果になります。
image.png

これが例外処理の超基礎的なコードです。
これは単純におかしな値が入力されたときに例外を返す処理を行っていますが、例えば「〇〇÷0」というように分母の正しくない数字が入力された場合は「ArithmeticException Class」を使います。

ArithmeticException Class を使ってみる

Exception Class は色々な Class が用意されていますが、その中にある、数式的な例外があったときに処理を実行する ArithmeticException Class を使ってみます。

先ほどのコードを以下のように置き換えてみます。

image.png

計算をする処理のところで例外処理で、「分母には正しい文字を入力してください」という文字を返すようにしています。結果分子に100、0を入力すると、例外処理を返すようになっています。
image.png

これで正しく例外処理を設定できました。
以下コードです。

program.cs
using 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-2019

Exception Class
https://docs.microsoft.com/ja-jp/dotnet/api/system.exception?view=netframework-4.8

ArithmeticException Class
https://docs.microsoft.com/ja-jp/dotnet/api/system.arithmeticexception?view=netframework-4.8

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む