PG日誌

受託系 PG が C# の事を書いています

c#

ArgumentNullException の文字列リテラルをやめる

c#

自分で null チェックしたときに投げる標準の例外で ArgumentNullException があるけどパラメータ名を指定した方が後々自分が助かります。 ArgumentNullException(string) ただ何も考えないで throw new ArgumentNullException("hogehoge"); とするとメソッ…

例外を握りつぶして bool で返すという闇のテクニック

最近のプロジェクトで本当によくこんなコードを見かけるんだけど public bool Foo(...) { try { // hogehoe } catch(Exception ex) { return false; } } こんなことして、.net のライブラリの応答方法とギャップがあるの気にならないのかな? 業務的な例外と…

WPFでTeeViewを展開可能なように見せかける

よくWindowsFormでTreeViewの子要素にダミーデータを突っ込んであたかも展開可能のように見せかけるために三角形を表示する奴をWPFでもやってみようと思います。コードビハインドではなく、MVVM形式で実現しようと思います。 完成イメージ ノードの左側に展…

WPF の PropertyChanged で使用するプロパティ名の文字列を動的に取得する

WPF で MVVM しようと思って ViewModel で INotifyPropertyChanged を実装した後に、プロパティ変更通知をベタ書きすると、以下のようになると思います。 this.PropertyChanged(this, new PropertyChangedEventArgs("Name")); ただこの、"Name" の部分。文字…

C#の3項演算子を久しぶりに見た件

c#

私的なことですが3項演算子は、最近仕事でお目にかかったことが無かったので提出されたときに非常に新鮮な感じを受けました。と同時に、できれば使わない方がいいかなとも思います。なぜなら、3項演算子は「これ以上拡張の余地が無いから」と考えています。…

テトリスを c# と WPF で作ってみた

物凄い今更ですが、ニコニコ動画のプログラミング界隈で伝説的な動画「【プログラミング】テトリスを1時間強で作ってみた【実況解説】」を見て、c# + WPF(Canvas) でテトリスが作れないか試してみました。参考にした動画は↓です。 www.nicovideo.jp動画は1時…

c#でProxyパターン再考

前にも記事を書いたのですが、最近人に説明しよとうとしたら案外覚えてなかったのでどんなものか復習したのでアウトプットしてみました。 Proxyパターンとは? GoFのデザインパターンに収録されているパターンの一つです。Proxyは「代理人」という意味を持ち…

c#の連想配列の名前の付け方

c#

既に知っているかと思うが、c#の連想配列のクラス名は以下の通りだ。 public interface IDictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable Javaの連想配列のクラス名は以下の通りだ。 public interface Map<K,V> これをローカルスコープで利用する際の変数</k,v></keyvaluepair<tkey,></keyvaluepair<tkey,></tkey,>…

自動実装のイベントは解放されるのか?

c#

c#では、自動実装でイベントを宣言することができる。構文は以下の通りだ。 public event Action<object, EventArgs> TheEvent; 少し気になる事がある。。これは、資源が解放されるのだろうか?イベントを設定した状態でオブジェクトを捨てるとメモリリークするのではないだろう</object,>…

ListViewクラスの挙動

c#

SelectedIndexChangedイベントはアイテムを選択するたびに N件 → 0件 0件 → N件のように2回発生するし、ClickイベントもListViewItemをクリックしないと発生しない。(余白をクリックしても何も発生しない)WPF使えってことなのか・・・?

ColumnWidthChangingイベントが発生しない

c#

おかしい。どうして反応しないんだ。ListViewのDetail表示で利用できるこのイベントは、ほぼ大半の利用シーンにおいてユーザーがカラムの幅を変更しようとする行為を妨害するために用いられる"邪悪なイベント"だ。ご多分に漏れず我らの陣営もこの方式を採用…

c#でプロパティがref/outなメソッド引数に指定できない件

c#

例えば以下のように宣言/利用をしたとする。 // 自動実装プロパティ public int No { get; set; } public void Sample(string message) { if(!int.tryParse(message, out No) { throw new ArgumentException("Failed to parse."); } } しかし、実際に以下の…

コンストラクタを見れば大体のことは分かる

c#

大抵の場合コンストラクタを見ればクラスがオブジェクトなのか、それとも構造体を拡大解釈しただけの産物なのかはある程度推測可能だ。例えば人間を表すPersonクラスがあったとしよう。コンストラクタが以下のように引数を求めている。とはいえPersonという…

c#のジェネリック

c#

ジェネリックは便利だ。特に.netの提供するSystem.Collections.Generic名前空間にあるListクラスやDictionaryクラスは課題を解決するために大いに役立つ。しかしその利便性に惑わされ実装時の設計判断を誤るケースを最近になりかなり目にした。以下のコード…

C#のコンストラクタ内での処理方針

c#

「コンストラクタで例外を投げるな」という話はどこかで聞いたことがあると思います。 だからって以下のように書くと public TheConstructor() { try { // 何らかの処理 } catch { // 例外が出ないように握り潰す } } 例外を出さないように握り潰しはダメで…

c#でProxyパターン

そういえばProxyパターンってProxyとRealSubjectが等価で交換可能って事を忘れて変なコードを書いていたので再確認です。以下c#でのコード例です。 // 共通インターフェース定義 public interface IProxy { string Foo(string message); } // プロキシじゃな…

ソフトがよく建築に例えられるけど

c#

ソフトには物理的制約が無いから云々と言うつもりはありません。 でももし本当にソフトウエアが建築と同じならこういうコードはエラーを出してほしいですね。 // 多すぎる引数を持つメソッドがあるクラス public class ManyArgs { public void Sample(string…

外部に公開しているメソッドは引数チェックをしよう

引数チェックって大切ですよね?オブジェクトが健全な状態を保つためにも外部に公開してる操作は引数チェックを行いましょう。対象は以下となります。 チェックすべき操作 public なクラス *1 public | protected なメソッドもしくはプロパティ *2 チェック…

c#の推論型

c#

推論型はタイプ数を減らす的な意味でかなり便利です。普通に宣言すると以下のようなコードになるのですが記述はIDEの補助があっても結構文字を打たないといけません。 Dictionary<string, Func<int, bool>> f_dispatcher = new Dictionary<string, Func<int, bool>>(); 推論型を使うと以下の通り結構すっきり</string,></string,>…

インターフェースと仮引数

c#

SIer業界って本当に不思議ですね。プログラミングが一切できない人がコンポーネントの"プログラミング言語的な意味"のインターフェース仕様をExcelで出してきて「これ実装して」って言われたりします。こないだ久しぶりにそういう事をされてExcel見たらこん…