PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

C#のSystem.Threading.Timerクラスの精度を確認する

C#のTimerクラスの定周期処理で、タイマーのインターバールを1msに設定した時の実際の実行間隔を確認した話です。

真・C# と WPF でインベーダー風ゲームを作る

3日前に『C# と WPF でインベーダー風ゲームを作る』を言って、雰囲気だけ似ているオリジナルのイカのシューティングの記事を書きましたが、「インベーダー」を名乗ってあの出来栄えはさすがに我田引水が過ぎるかなと思い反省したので、本物の「インベーダー…

C# と WPF でインベーダー風ゲームを作る

VisualStudio2017が出たということで記念するわけではないですが、C#とWPFのみでインベーダー風ゲームを作ってみたいと思います。 すいません、嘘つきました。インベーダーを意識した気がするオリジナルなシューティングゲームです。リスペクトしたというこ…

List<T>の使い方

c#

C#で動的に要素を追加したり、削除したりしたいときに使う動的な配列「リスト」の使い方の簡単なメモです。

Disposeパターンを実装する

c#

Disposeパターンについて調べたので結果をまとめてみようと思います。 Disposeパターン コード例 基底クラスの実装 派生クラスの実装 利用側のコード 注意点 参考資料 Disposeパターン Disposeパターンですが、c#で基底クラスが アンマネージリソースを使用…

C#とC++間でchar*もしくはLPSZをやり取りする

C#からC++のDLLを呼び出すためにDllImportしたときにchar*が引数にある場合のやり取りの仕方です。 C++側はシグネチャを持つコードがあった場合 // C++側宣言 uint32_t __stdcall Function(char* szMessage); // もしくは uint32_t __stdcall Function(LPSTR…

c#でJsonをシリアライズ、デシリアライズする

c#

c#でJsonデータをシリアライズデシリアライズする方法のメモです。.NET Frameworkの標準ライブラリにあるDataContractJsonSerializerを使ってファイルやネットワークから読みとったJson文字列をC#のオブジェクトへ変換したり、オブジェクトの内容をJson文字…

C#とWFでk-measn法のビジュアル化してみた

クラスタリングで定番のk-means, k-平均法をc#とWPFをつかって視覚化してみました。 今回は、以下2つのサイトに刺激を受けて作成しています。 play.google.com tech.nitoyon.com このアルゴリズムですがはだいたい以下のような手順で進みます。 データを座標…

c#のis演算子とtypeofの型判定の挙動の違い

c#

コード書けばすぐわかる事なんですがis演算子の挙動の話です。is演算子は複数の型でtrueになる可能性があります。 親子関係がある型で厳密に型を判定したい場合、GetType()とtypeofを使います。 // こんなクラスがあったとして、、 public class BaseClass {…

c#のeventとdelegateの違い

c#

マウスをクリックした場合などに発生する"イベント"の話ではなく、c#の予約語の"event構文"の話です。本当にざっくりとした先に結論を書くと、"event構文"は"delegate専用のプロパティ"の一種です。delegate型をクラス外に公開する場合だけ特別に、"プロパテ…

ObservableCollectionにAddRangeを追加する

c#

タイトルの通りなんですが、ObservableCollectionやIListにはAddRangeが無いんですよね。WPFでObservableCollectionの入れ替えを毎回foreachでやってたら憤死しそうにりました。けっこう前から結構不便に感じていたのでライブラリ作りました。こんな感じです…

c#のイベントのnullチェックがめんどくさい

c#

Begin 1 System.ArgumentException: 型 'System.String' のオブジェクトを型 'System.Int32' に変換できません。 ...System.Reflection.TargetParameterCountException: パラメーター カウントが一致しません。 ...System.Reflection.TargetParameterCountEx…

c#のconstとstatic readonlyの使い分け

c#

c#でプログラム書いてるとコードを書いているときは、constとreadonlyの区別ってあんまりありませんよね。ついつい定数は全部、constと書いてしまいます。 public static class HogeDefine { public const uint MaxLength = 10; public static uint DataSize…

VisualStudio2013へ.NET Framework4.6.1を導入する

ちょっと前に、VisualStudio2013へ.NET4.6の導入の仕方を書いたけど.NET4.6.1も同じような手順で導入できます。 4.6.2の導入の仕方 takachan.hatenablog.com 4.6の導入のしかた 前に書いた記事です。takachan.hatenablog.com http://blog.hatena.ne.jp/Takac…

c#でスレッドIDを取得する

c#

マルチスレッド処理中にログを出力したい時にスレッド番号があったらいいなと思ったので調べてみました。捕捉: GUIアプリのasync/await/Invokeが絡む画面操作関係でこの出力すると全部同じ値になってしまいます。UIがシングルスレッドアパートメントなので当…

コードのコメントはシンタックスじゃなくセマンティクスを書こう

コードの構造とか文法を一生懸命説明するシンタックスコメント職人が世の中に結構いるみたいです。例えばこんなの // ログを出力する Log.WriteLine("ERROR", "Failed to hogehoge function."); Log.WriteLine("ERROR", ex.ToString()); コード見ればわかる…

C#のvarとtry~catchはクソじゃなかった

c#

例外をcatch節で受けるときにException型で受けちゃうとコードインスペクションで引っ掛かります。で、ネットでどうなってるのか調べていたときにメッチャパッションしてるエントリを見つけたので思ったこと書こうと思います。C#のvarとtry~catchが糞すぎる…

WCFで通信エラーになる場合

c#

WCFで通信エラーc#とWCFでプロセス間通信をするためにNetTcpBindingを使って通信を行っていたら以下のメッセージが出力され通信エラーとなりました。 System.ServiceModel.CommunicationException: ソケット接続が中止されました。これは、メッセージ処理時…

ガチャの確立をシミュレーションしてみた

グラブルが確率を偽って景品表示法に違反しているだとか、To LOVEるのガチャの確率が異様に低いとか世の中ソーシャルゲーム内に設置されれているガチャで騒ぎが起きているようです。その確率で、実際にどれくらいガチャを引けば当たるのか、少し気になります…

c#とJavaの微妙な違い

c#とJavaって基本的な構文は相当似てるんですが、やっぱり違う言語なので微妙に違います。両方を使い比べてみて、やっぱり全く違うんだな、と感じたことをいくつか書いてみようと思います。 アクセス修飾子 アクセス修飾時を省略したときの挙動 Javaの場合 c…

MahAppsのTreeViewをWPFで使ったときの話

MahAppsは、WPFでフォームやコントロールの見た目をユニバーサルアプリ風(旧メトロ風)に表示するためのUIライブラリです。 紹介はほかのサイトが詳しいと思いますが、コードがGitHubで公開されていて、紹介とドキュメントが以下のページに乗っています。http…

c#のstaticクラスとシングルトン考察

c#には言語固有機能としてstaticクラスがあります。クラス自体をstaticと宣言することによってインスタンス作成を禁止し、static宣言したクラスのインスタンスが複数作成できないようにします。ですがこの機能GoFのデザインパターンのシングルトンと何か違う…

VisualStudio2013へ.NET Framework4.6を導入する

c#

ちょっと前に、VisualStudio2013へ.NET4.5.2の導入の仕方を書いたけど.NET4.6も同じような手順で導入できます。 4.5.2の導入のしかた 前に書いた記事です。 takachan.hatenablog.com 背景的なもの .NET4.6はVisualStudio2015買ってね。的な事をMSさんおっし…

paizaで杏ちゃんにサンタコスさせてみた

そろそろクリスマスですね!彼女の杏ちゃんにもサンタクロースの恰好を要求してもいいんじゃないですかね?!水着、メガネを杏ちゃんにご着用頂いていましたが今回はサンタコスに挑戦してもらいます。水着回の記事 takachan.hatenablog.comめがね回の記事 ta…

paizaで杏ちゃんにめがねをプレゼントしてみた

昨日は杏ちゃんに水着を着てもらいましたが今日はめがねをプレゼントして様子を見たいと思います。Paizaのイベント paiza.jp水着回 takachan.hatenablog.comサンタコス回 takachan.hatenablog.com ショートカットに「めがね」きっと似合うと思います。ぐふふ…

c#のプロパティ構文のアクセス修飾子の指定

c#

本来プロパティは、setter/getterのシンタックスシュガーです。c#は(自動実装)プロパティが便利すぎてsetter/getterだという事を高頻度で忘れてしまうので改めて基本的な事を確認したいと思います。 まずはプロパティの書き方 まず、書き方のおさらいです。s…

c#固有の構文はUMLでどう書けばいいのか?

最終的な実装言語がc#と決まっていて、設計を検討していて、資料作成にUMLを使うと表現が少々難しい事あります。Javaのコンテキストには無いc#固有の文を扱う時にどうやって書けばいいのかわからない構文がいくつかあるので表現方法をどうするか考察します。

c#のIPAddressクラスでIPv4のフォーマット検証はできない話

c#

c#にはIPAddressクラスがあります。プリニティブ型と同様にParse, TryParseメソッドが用意されています。しかし、これをIPv4のフォーマットの検証に使うと思わぬ落とし穴にはまることになります。 文字列を4つの1バイト数値と3つのピリオドで成る文字列かど…

WCFの大容量通信でハマった話

c#

WCFでオブジェクトの数が多い(リストに10万件弱)を通信しようとしたところクライアント側で以下のメッセージが表示されました。 System.ServiceModel.CommunicationException: 基礎になる接続が閉じられました: 接続が予期せずに閉じられました ---> Syste…

c#とWPFでマンデルブロ集合を表示してみた

せっかく夏休みなのでc#とWPFでマンデルブロ集合を表示してみました。 ちなみに数学的な理解はそんなにしていませんので数式の意味とか方程式的な解説は他のサイトさんをご確認ください。ちなみに前回テトリスを作った時の記事はこちら。テトリスを c# と WP…

c#で現在のメモリ使用量を取得する

Environmentクラスで取得する プロセスが使用しているメモリ使用量を取得するにはEnvironmentクラスのWorkingSetPropertyを参照すれば現在の使用量が取得できます。 long currentSet = Environment.WorkingSet Console.WriteLine("現在のメモリ使用量は{0}by…

c# の Dictionary<TKey, TValue> の 使い方

c#

c# で連想配列型のデータ構造を利用する場合 Dictionary を使います。割と使用頻度が高いですが安易な利用は後で痛い目に合います。そこで基本的な使い方と痛い目に合わないプラクティスをちょっと紹介したいと思います。 1. 宣言編/使用編 c# はこの手のサ…

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

c#

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

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

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

WPF で TreeViewItem をノードを展開したときに動的に取得する

よく WindowsForm で TreeView の Items にダミーデータ突っ込んであたかも展開可能のように見せることをしてたけどそれを WPF でもやろうと思います。コードビハインドではなく、MVVM 形式で実現しようと思います。 完成イメージ XAML定義 XAML 上では以下2…

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…

開始前チェックは確実に

大抵の処理は引数を受け取って開始される。そうでない場合、何らかの知識をオブジェクト自身から読み取って処理を開始するだろう。その時に受け取れるものが明確に定められる場合チェックを行うのは当然だ。例えば以下のようなコードがあったとしよう。 publ…