C#

C#でタイプセーフEnumパターン

C#

C#でのテストはちょっとお休みして、今日はC#でタイプセーフEnumパターンの実現方法をいくつか紹介する。 C#には十分にタイプセーフなenumがあるが、それでも基本は数値型であり、switchやifによる分岐が必要になってしまう点はC言語やC++のenumと何ら変わら…

C#でのテスト(2) nantによるビルドの自動化

C#

C#でのテスト(1) テスト用プロジェクト(?) - ぐるぐる〜に続いて、今回はnantを使ってビルドを自動化する。 その前に、Visual Studio上でNAntの設定ファイルのIntelliSenseを働かせるように設定しておく。 NAntをダウンロードして解凍すると、schemeフォル…

C#でのテスト(1) テスト用プロジェクト(?)

C#

C#でのテスト(0) まずは環境に引き続いて今回はテストプロジェクトの作り方を。 といっても、実際にはテストプロジェクトをテスト対象となるプロジェクトと分けてしまうと、internalのテストができないため、テスト対象のプロジェクト内にテスト用のディレク…

C#でのテスト(0) まずは環境

C#

環境がなければ始まらないんで、まずは環境から。 Visual Studio 2005 Professional IDE.ほぼ一択。エディションはStandard Edition以上じゃないとプラグイン*1が使えない? [http //sourceforge.net/projects/nunit:title=NUnit]:.NETのためのユニットテス…

C#でのテスト

C#

C#での*1テストに関するTips的な知識もちょっとは蓄えたので、これから少しずつ放出していこうかな。 *1:というか.NETでの

ロギング用フレームワークの作成

C#

結局ロギング用のフレームワークは自作することに。一応社内で使われているものはあるんだけど、アレを使うくらいならスタックトレースをファイルにリダイレクトするとかの方がよっぽどましだ。発生場所は分からない、例外のクラスの名前はなんかどっかで決…

ロガー

C#

納品物にオープンソースのコードを混ぜちゃいけないってんで、自作する必要が出てきそう。

Visual Studioのタスク一覧機能

Visual Studio 2005のオプションを開いて、環境、タスク一覧とたどると、タスク一覧のカスタマイズが出来る。 ここに、今回のプロジェクトでは「HACK」と「TESTCASE」を追加して、ASP.NET側の制限による変態的なコードに「HACK」を、TestLinkの発行するIDの…

プロパティとデバッグ

C#

protected string hoge; public string Hoge { get { return hoge; } } なんてコードが大量にあった。せめて、 private string hoge; public string Hoge { get { return hoge; } protected set { hoge = value; } } こうしてくれ。hogeに代入されてる文字列…

プロパティとメソッド

プロパティとメソッド、どっちを使えばいいかの境界線ってどうなってんだろ? C#前提で話を進めるとして、個人的には Object.ToString()メソッドじゃなくてObject.Textプロパティ Object.GetType()メソッドじゃなくてObject.Typeプロパティ Object.GetHashCo…

そんなにSQLが嫌いか

あけたら毒ガスが吹き出る箱を開けてしまった気分。 SQL_SELECT = "SELECT * FROM "; SQL_COUNT = "SELECT COUNT(*) FROM "; SQL_WHERE = " WHERE " SQL_ORDER = " ORDER BY "; SQL_EQUAL = " = "; SQL_AND = " AND "; SQL_OR = " OR "; ... SQL_UPDATE = "U…

ASP.NET1.1でIValidator.IsValidがfalseとなるコントロールにフォーカスを移動する方法

C#

まずは、単純な例から。 foreach (BaseValidator validator in Page.Validators) { if (!validator.IsValid) { string clientId = Page.FindControl(validator.ControlToValidate).ClientID; Page.RegisterStartupScript( "set focus", String.Format("<script>docum</script>…

C#からTracを操作する その2

C#

と、言うことで、VS2005用のTracアドインでも作ってみようかな。VSTracを試してみたら、今の段階では「見る」だけしかできないんだもんなぁ。せめてチケットの登録とチケットの解決はできないと、お話にならない。 C#からTracを操作する の続き。大体半分く…

C#からTracを操作する

C#

Visual Studio 2005で、プロジェクトはXML RPCという名前で作ったと仮定。 Tracのプロジェクトはhttp://192.168.1.11/trac/SampleProjectでアクセス可能で、ユーザ名は"user"、パスワードは"pass"でパーミッションは面倒だからTRAC_ADMINを持ってると仮定*1…

Visual Studioのアドイン

C#

が作りたいけど、全然情報が無い、というか分かりにくい。 何でこんなに分かりにくいんだ・・・ とりあえず、ユーザーコントロール作って、Connect.csのOnConnectionメソッドに Windows2 win2 = (Windows2)_addInInstance.DTE.Windows; object controlObject…

明示的なインターフェイスメンバの実装

C#ではインターフェイスメンバを明示的に実装することで、複数のインターフェイスに同じシグネチャのメソッドがあった場合に個別に実装することができる。 using System; interface IHoge { void Method(); } interface IPiyo { void Method(); } class Hoge…

インターフェイス

C#のインターフェイスはJavaのインターフェイスと基本的には同じだが、異なる部分もある。 まず、C#のインターフェイスには定数が記述できない。更に、ネストした型を宣言することも出来ない。 前者は許せるのだが、後者は慣れが必要そうだ。まぁC#にはinter…

構造体

C++の構造体とクラスはデフォルトのアクセスレベルが違うだけで、それ以外は全く同じだが、C#の構造体とクラスはかなりの違いがある。 class struct 格納場所 ヒープ スタック*1 継承 可 不可*2 *3 メンバの制限 なし あり*4 フィールドの宣言箇所での初期化…

演算子のオーバーロード

C++と同様、C#も演算子をオーバーロードすることができる。ただし、staticメソッドである必要がある。 が、結構面倒なのであまり使わないかも。

シールメソッド

この本には載ってなかったけど、シールクラスと同様、メソッドにsealedをつけるとオーバーライドを不可能にできる*1。 *1:ただし隠蔽は可能

抽象クラス

C#の抽象クラス自体はJavaとほとんど同じだが、抽象クラスを継承してクラスを作る場合、C#ではここでもovrerideキーワードを使用する必要がある。 using System; abstract class Base { public abstract void Method(); } class Sub : Base { // overrideが…

ネステッドクラス

C#のネステッドクラスはJavaのstaticなメンバクラスと同じようなもので、C#には非staticなメンバクラスは存在しない*1。 また、クラスだけじゃなくてインターフェイスや構造体、列挙体もネストさせることができる。 class Outer { class NestedClass {} inte…

ボックス化、ボックス化解除

ボックス化はJavaのオートボクシングと同じようなものだけど、ボックス化解除とJavaのオートアンボクシングは前者に比べて違いが大きい。 ボックス化は値型を参照型として扱うための仕組みで、Javaのオートボクシングのようなもの。 // intはSystem.Int32の…

Objectクラス

C#もJavaと同様、全てのクラスは必ずObjectクラスを継承していることになる。また、構造体もObjectクラスを継承している*1。 Objectクラスは引数なしのコンストラクタと、いくつかのメソッドを持っている。 宣言 概要 public virtual bool Equals(Object obj…

staticメソッド

C#ではJavaと違って、インスタンス経由でstaticメソッドを呼ぶことは出来ない。

refとout

C#のメソッドは通常、Javaと同じで値渡し、もしくは参照の値渡しだけど、refやらoutやらつけることで参照渡しもできる。 まずはrefから。 static void Method(ref int i) { if (i < 0) i = 0; } で、呼び出し側はrefをつけて呼び出す。 int data = -10; Meth…

シールクラス

Javaのfinalなクラスと同じ。 sealed class SealClass {} これは、Javaの場合 final class FinalClass {} こう書くのと同じ。Javaは同じキーワードを使いまわすけど、C#は別の役割のものには別のキーワードを割り当ててるみたい。

ポリモーフィックなメソッド

C#はポリモーフィックなメソッドに関して、Javaに比べて少し複雑になっている。 using System; class Base { public void Method() { Console.WriteLine("base class"); } } class Sub : Base { public void Method() { Console.WriteLine("sub class"); } }…

他のコンストラクタの呼び出し

スーパークラスのコンストラクタの呼び出しとオーバーロードされたコンストラクタの呼び出しはC++とJavaの中間のような感じ。 class Hoge { public Hoge(int i) {} // オーバーロードされたコンストラクタの呼び出し public Hoge() : this(10) {} } class Ex…

言語仕様

C# Language Specificationネットに言語仕様があるのはありがたいんだけど、MSDNの中、しかも変に凝ってるため非常に読みにくい。 確かC#ってJIS化してたような・・・プログラム言語 C#これか。うーん高い。会社に買ってもらおう。