.NET Standard ライブラリ内のクラスコンストラクタで例外してみた

クラスの用途が明確で、呼び出し元クラスがどんな呼び出ししてくるかわかんない、ならコンストラクタで歯止めすれば自クラスはしんどくないよねw

規定サイズの配列をもつクラスのコンストラクタで、配列サイズを必ず受け取って、それが規定内でないなら例外しようと思ったの。

ま、そう考えた経緯はこの例外クラス、TypeInitializationException を見つけたからなんだけど。

https://docs.microsoft.com/ja-jp/dotnet/api/system.typeinitializationexception?view=netstandard-2.0

今回の場合、InnerExceptionに ArgumentOutOfRangeException を仕掛けるのも筋だよね。

で、つくってみた。中身は-1で初期化なw どっかの話で書いた一行コードw

public class TypeInitSampleWithList
{
  private int[] _myList;
  public int[] MyList => _myList;
  public TypeInitSampleWithList(int size)
  {
    if ((size < 1) || (16 < size))
    {
       throw new System.TypeInitializationException (typeof(TypeInitSampleWithList).FullName,
                  new System.ArgumentOutOfRangeException());
    }
    _myList = Enumerable.Repeat(1, size).Select(f => -1).ToArray();
  }
}

んでもって、テストコードは2つ。ふつーにインスタンス返すのと、例外するのと。NUnitって書くコード少なくていいわぁ。

[Test]
public void SampleConstructorTest([Range(2,16)]int prm1)
{
  TypeInitSampleWithList act = new TypeInitSampleWithList(prm1);

  Assert.NotNull(act);
  Assert.AreEqual(act.MyList.Length, prm1);
  Assert.IsTrue(act.MyList.All(f => f == -1));
}
[Test]
public void SampleConstructorExceptionTest([Values(-1, 0, 17)]int prm1)
{
  TypeInitializationException ex = Assert.Throws<TypeInitializationException>(() => new TypeInitSampleWithList(prm1));
  Assert.AreEqual(ex.TypeName, typeof(TypeInitSampleWithList).FullName);
  Assert.That(ex.InnerException, Is.TypeOf<ArgumentOutOfRangeException>());
}

作ってビルドしたらそのまま自動実行。dotnet test コマンド様様v

image

結果はグリーンだよ。うひょひょ。

リスト要素の初期化を1行で書いてみた

Enumarable型、知ってると知らないとでは大違いw

やりたかったこと

List<List<int>> の入れ子リストを動的サイズで作った上に、中身を全部-1で埋めたい。

最初にやった処理。

int size = 31;
List<List<int>> ret = new List<List<int>>();
for (int i = 0; i < size; i++)
{
    List<int> setL = new List<int>();
    for (int j = 0; j < size; j++)
    {
        setL.Add(-1);
    }
    ret.Add(setL);
}

一行で書いた処理。

int size = 31;
List<List<int>> ret = new List<List<int>>();
ret.AddRange(Enumerable.Repeat(1, size).Select(x => Enumerable.Repeat(1, size).Select(f => -1).ToList()));

だから何?といえばそれまでなんだけど、メモ書き程度でw

C# で べき算演算子でべき算しようとしてみた

だったら x ^ 2 でビルド通すなよ!! と VBer は叫ぶ。波が逆巻く崖っぷちで。<理不尽w

始まりは、とあるサンプルテストを書いていた時。

Nunit3.xはテスト値をパラメータで渡せるので、同じテストを何回も書かなくていい。

まぁMSTestで似たようなことしようとすると、Excel出てくるわCSVやらでうっとおしい。NUnit3.xにしたのはそこが理由。

くわしくはまた後日に。

閑話休題。

サンプルコードとして、とある数字をいれたら、そのべき算-1の数字を戻す、という、何だかもう良く判らないコンセプトの計算メソッドってのを用意してみた。

private int Plus(int inNum)
{
    return (inNum ^ 2) - 1;
}

んでテストコード書いて

[Test, Sequential]
public void PlusTest([Values(1, 2, 4, 8, 16, 17)] int prm1,
                     [Values(0, 3, 15, 63, 255, 288)] int exp1)
{
    Assert.AreEqual(exp1, SignFull(prm1));
}

動かしたら、NGなんだわ、レッドなんだわ、??となってた。

image

image

Input値が 16 なんだから、16^2 で 256 で、1 ひくから 255 でしょ? んん?

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/index

XOR論理演算子だよ!!!! まじか!!!!!!!!!!!!!!!

ないよ!!! べき算演算子ないよ!!!!

そうだった、こいつはCでVBじゃないw

なので、こうした。

private int Plus(int inNum)
{
    return (inNum * inNum) - 1;
}

で、テストコードを再度実行。

image

うん、グリーンだよ。

まぁ考えりゃ、VBとCを一緒にしようなんて考え方自体がアレでそれだし、そこは空気読め、自分w

ちな、べき算はdouble型ならSystem.MathクラスのPowで出来るんだけれど、intだしね、値もそんな巨大じゃないしお遊びだからそのまま計算した。もちろん、業務アプリや納品プログラムとかの時はきちんと桁と型を考えて責任もってキャストとテストするのがセオリーってことでw

.NET Standard で LINQ を使ってみた

あるのが当たり前だってなってた自分に反省orz

.NET Standard でプログラミングする場合、通常のプロジェクトテンプレートから作ったら、LINQは使えない。

なので、参照を足す必要があるんだけれど、まさかの nuget からとはw

https://www.nuget.org/packages/System.Linq/4.1.0

インストールの仕方も書いてあって、そのとおりに。

image

入れたいプロジェクト(.NET Standard 2.0)にセットして、さくっとね。

ジェネリックのLISTでWhere句がつかえるよーん。

何気に好きなのは FirstOrDefault 。

   List<String> wlist = new List<string> { "a1", "b1", "c2", "d2" };
   String ret = wlist.FirstOrDefault(f => f.EndsWith("2"));