C#問題集をGitBookにまとめてます

こんにちは。

先日、C#の問題を投稿していましたが、良い機会なのでGitBookでまとめることにしました。

https://223n.gitbook.io/csl/

この問題集は、自分がC#の勉強をする際につまづいたり、ほかの方に教えていた際に困っていたところなどをメモしていたのを問題集にしています。

なるべく細かい解説を入れるようにしていますが、誤っていたらGitHubのリポジトリにIssueを送っていただければと思います。

今後もよろしくお願いします。

Avaloniaを使ってみる

Ⅰ.Avalonia

Avaloniaは、「マルチ・プラットフォーム .NET UI フレームワーク」ということで、C#によるXAML形式でアプリ開発が出来るフレームワークです。

Avalonia – GitHub

Ⅱ.導入方法とプロジェクトの作成方法

※ここでは、Visual Studio 2017 Version 15.8.4で解説しています。

1.画面から「ツール(T)」→「拡張機能と更新プログラム(U)…」をクリックします。

Visual Studioのメイン画面

2.「オンライン」を選択します。

3.右上の検索ボックスに「Avalonia」を入力します。

4.「Avalonia for Visual Studio」を選択します。

5.インストールをクリックします。

6.「Visual Studioの再起動」が促されますので、一度、Visual Studioを終了して再起動します。

拡張機能と更新プログラム

7.新しいプロジェクトを開くと、「Visual C#」に「Avalonia」が追加されます。

8.「Avalonia Application」もしくは「Avalonia MVVM Application」を選択してプロジェクトを作成します。

新しいプロジェクト

後は、作成できたプロジェクトを元に開発を進めていくのですが、まだXAML開発はやったことがないため、少しずつ勉強しながらやりたいと思います。

Oracle.DataAccessでパラメータエラーが発生する

Oracle.DataAccess.dll (Oracle 12c版)を使ってSQLを発行している場合に以下のようなエラーが発生します。

パラメータ・バインディングが無効です
パラメーター名:その他

このエラーですが、SQLのコメントに「:」を含む場合や、「/* */」でコメントを書いており「/」がコメント内にあり「:」がある場合などに、パラメータと誤認してArgumentExceptionエラーが発生するようです。

全角の「:」にする、「/」を削除するなどの対策が必要です。

Pdfをc#で作りたい

とあるシステムで帳票をテンプレートから生成する機能を作ろうと思ったので、
いろいろ調べていると、ThinReportsという便利そうなアプリがあることを知りました。

rubyがあれば使えるらしいのですが、せっかくなのでpdfを勉強してc#で
ThinReportsのテンプレートファイルから生成できるような仕組みを作りたいと考えました。
それがこれ(https://github.com/223n/PDFCnet)なのですが、
まだまだ足りない機能などがあり、かなり修正が必要だなぁと感じています。
また、AdobeReaderなどで開くと保存ダイアログが表示されてしまい、
正常に生成できていないと思われます。
いつかは完成させたいと思いながら、少しずつ頑張っていきたいと思います。

テストコードの実装

テストコードはちょっとした修正結果の担保を簡単に取ることができる非常に心強い味方です。

しかし、テストコードをいざC#で書いていると、少し困ったことに遭遇してしまいました。

まず、現在のVisualStudioでは、テスト用のプロジェクトを作成して、対象のプロジェクトを参照します。

そのため、通常はテスト対象のメソッドなりプロパティは、外部から触れるpublicなどに限られてしまい、

privateは外部からアクセスしてのテストはできません。

(* 日本という国は恐ろしいもので、動的参照を用いて参照しているexeやdll内のprivateなメソッドやプロパティ、

フィールドを参照して書き換え、テストするぜヒャッハーな悪用できちゃうような技術を作ってしまう人も居るわけで…)

では、外部からアクセス可能な範囲でテストをしようとするのですが、

通常、publicを避けているのでテストしたいメソッドがprivateだったりして拡張メソッドや困ってしまいます。

(* 先の動的参照によるテストもありますが、動的参照はインテリセンスを殺してしまい、

非常に保守性が低下しがちで、誰も引き継げなくなってしまうという以前に、ナイワーを感じる今日この頃。)

自分自身、このテストの実装という経験や知識が弱いと感じているのですが、

いい資料はないものでしょうか…

C#のobject型でBool型チェック

先日行われた2016年10月度の勉強会にて、
RubyやPythonでのbool型チェックが簡単にできないというネタがありました。

そこで、C#ではどうだったかなと思い試してみました。

// 実装

今回は、拡張メソッドでobject型にIsBoolというbool型かどうかを確認できるように実装してみました。

Ref. MSDN 拡張メソッド (C# プログラミング ガイド)
Ref. MSDN is (C# リファレンス)

public static bool IsBool(this object obj)
{
return (obj is bool);
}

さて、これで完成です。
実際に使う場合は、下記のようなコードになります。

object obj = new object();
bool result = obj.IsBool(); // false

// 実行結果

実際に実行してみた結果が下図です。

Bool型かどうかの判定

// まとめ

ということで、何もなく実装できてしまいました。

C#では、言語側で“obj is type”“objがnull以外でtype型と互換性があるかどうか”
bool型で返してくれるというありがたい機能が実装されているため、問題になりませんでしたが、
他の言語だとこういう問題もあるんだなと改めて言語間の違いを感じました。

わざわざ拡張メソッドなんて定義しなくてもよかったのですが、まぁ、何事も経験だと思いますで…

また、今回の実装によってobject型に対しても拡張メソッドが実装できる、
ということを新たに知ることができました。

今まで試したことがなかったのですが、これならあの忌々しいDBNullチェックも

obj.IsDBNull()

obj.IsDBNullOrNothing()

のように実装できるんですねぇ。

DataGridViewを改造してみる

行ヘッダに日付を描画、列ヘッダの上にヘッダを追加してそれを結合させてみた話です。

DataGridViewを少し改造してみました!という小ネタです。

000003

Source:  https://github.com/223n/HiStudy/tree/master/MergeGridView2

行ヘッダに日付を描画、列ヘッダの上にヘッダを追加してそれを結合させてみました。

プロジェクトには、MergeGridView2とSampleの2プロジェクトが含まれています。
MergeGridView2は、改造したGridView本体があり、
Sampleでは、MergeGridview2を実際に配置した結果です。

CellPaintイベントやPaintイベントをトリガーに、
UpdateHeaderメソッドでは、列ヘッダを描画しており、
UpdateCellメソッドでは、行ヘッダを描画しています。

ところで、この記事を書く際にVisualStudioを更新したり再起動していたのですが、

123

なんと、メソッド等の1行上に参照数と、参照状況が確認できる機能が自動更新で追加されていたようです。

拡張メソッドの実装について

VB.NETとC#での拡張メソッドの実装方法について

とあるプロジェクトに参加している際に、以下のようなクラスがありました。

CommonExtentionClass

「やべぇ、ちゃんと拡張メソッド使ってやがる!!(VB.NETで)」
という興奮も束の間

Public Shared Function TimeToInt(ByVal pDate As Date) As Integer

それ、拡張メソッドちがうよ… (´;ω;`)

ということで、おさらいも兼ねて、VB.NETとC#での拡張メソッドの実装方法について書いていきます。

参考資料は以下のMSDNをご参照ください。

Ref. 拡張メソッド (Visual Basic) – MSDN

Ref. 拡張メソッド (C# プログラミング ガイド) – MSDN

“拡張メソッドの実装について” の続きを読む