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

C# で強い typedef

C#

C#と諸々 強い typedef が欲しい弱い typedef (alias) に継承は使えないけど、強い typedef には継承が使えるというか、持ってこいだと言うことに今まで全く気付いていなかった・・・ T4 Template は存在自体知らなかったけど、かなり良さそうなので早速導入…

値渡しと参照渡し (と参照の値渡し)

値渡しと参照渡しは、分かってしまえば何も難しいところはないんだけど、分かるまでにちょっとした壁があるというかなんとうか・・・ てことでちょっとまとめておきますねー 値渡し (call-by-value) と参照渡し (call-by-reference) の違い 値渡しと参照渡し…

KeyValuePairリテラル

static な可変長引数のインデクサから更に妄想して、KeyValuePairリテラルとか考えてみた。 KeyValuePair<int, int> pair1 = 10:10; KeyValuePair<int, KeyValuePair<int, int>> pair2 = 10:20:30; さらに、 (int:int) pair1 = 10:10; (int:int:int) pair2 = 10:20:30; とか。 static な可変長引数</int,></int,>…

可変長引数のインデクサって何に使うんだろ・・・

class Program { int this[params int[] args] { get { return args[args.Length - 1]; } } static void main(string[] args) { Program p = new Program(); Console.WriteLine(p[0, 1, 2, 3]); // => 3 } } うーん、何に使えるだろ?例えばこんなの? publi…

Java やってる人が C# を使うとはまること

ここでは、Java SE 5.0 以降を知っている人が C# 2.0 を使うことになった場合を考える*1 *2。 あと、ライブラリについては触れないことにする*3。 命名規約 まず、命名規約が全然違う。Java ではメソッド名にキャメル形式*4を使うけど、C# では Pascal 形式*…

CellValueChanged で無限再帰に陥らないようにする

C#

DataGridView の CellValueChanged イベントの処理コード内でその DataGridView を弄っていたりすると、無限再帰になりかねないので、 private void grd_hoge_CellValueChanged(object sender, DataGridViewCellEventArgs e) { try { grd_hoge.CellValueChan…

as soon as possible

C#

(注)元のエントリの本題とは全く関係ないです*1 *2。 Cartesian pos1AsCart = pos1 as object as Cartesian; C#と諸々 インスタンスが属するクラスをあとから変更する操作を C# で これを見て、as演算子って何個でもつなげること出来るんだなー、と思った直…

括弧過多

C#

括弧を付け過ぎても悪いことはない、って風潮が自分の周りにはあるみたい。 int r = ((int)(((byte)(255)))); 分かりにくいから括弧の対応が分かりやすいように書き直してみる。 int r = ( (int) ( ( // これと (byte) (255) ) // この括弧は何? ) ); え?…

特定の値しか許さないんだったらintじゃなくてenum

C#

今日発見したこんなコード。 /// <summary> /// ほげほげを設定する /// </summary> /// <param name="hoge">ほげほげ</param> /// <param name="location">0:左、1:中央、2:右</param> public void SetHoge(string hoge, int location) { switch (location) { case 0: leftHoge = hoge; break; case 1: centerHoge = hoge; break; case 2: …

そういえば

C# アルゴリズム データ構造 Visual Basic アルゴリズム データ構造 C#もVBも、こういう本がない*1のは意外だなぁ。 *1:これはないといってもいいよね

本の数(Amazon)

Amazon.co.jpで、和書で検索した結果、 Java 1,434件 C++ 425件 C# 133件 Javaの結果にJavaScriptも含まれているからそのままの数字をあてにしないように。 ただ、それにしたってJavaは多いな。 Amazon.comでも検索してみた。 Java 66,898Results C++ 21,476…

とりあえず読んで(もちろん理解して)おいて欲しいもの

C#

本買えとか言わないから、C#で開発するなら、クラス ライブラリ開発のデザイン ガイドラインは読んでおいて欲しい。 みんなJavaに毒されすぎ*1。C#はJavaじゃないんだよ*2! あと、C#に限った話じゃないけど、みんなシステムハンガリアン大好きなので、間違…

Rhino Mocks

C#

これはなかなかいいな。 NMock2.0からの移行は、以下の手順で行った。 NMock2.0で書いたテストをRhino Mocksでも作成(別ファイルに作成) どちらのテストもすべて成功することを確認 NMock2.0のテストを削除 NMock2.0よりも優れている点としては、 Rhino Mock…

C# Coding Guidelines

C#

C# Coding Guidelines and Best Practices C#はほとんど使ってないのですが、このコーディングガイドラインはどんな感じなんでしょか。 ときどきの雑記帖 てことでちょっと見てみた。 少なくとも、ここのやつよりも遥かにいい。 ただ、 String comparison in…

Equalsが拡張メソッドで実装されてたら

C#

public class Object { protected internal virtual bool Eq(Object o) { return this == o; } } public static class ObjectExtension { public static bool Equals(this Object self, Object other) { if (self == null && other == null) return true; if…

拡張メソッドでenumを拡張

C#

ってのも出来るのか。Javaのenumよりスマートじゃない気がするけど、これでJavaのenumっぽいこと + null安全が実現できる! public enum SampleEnum { Hoge, Piyo, Foo, Bar } public static class SampleEnumExtension { // enumのToStringは遅いので独自実…

拡張メソッドをどこに書くか

C#

拡張メソッドをクラスとかインターフェイスの拡張として使うなら別だけど、null安全なメソッド*1の提供を目的として使うなら、同じファイルに記述するのがいいんじゃなかろうか。 public sealed class Hoge { ... } public static class HogeExtension { ...…

インターフェイスへの(そこそこ)安全なメソッドの追加

C#

Effective Java第二版では、 一般的に言えば、publicのインタフェースに、そのインタフェースを使用しているすべてのプログラムを動かなくさせることなく、メソッドを追加することは不可能です。 とあるけど、C#では拡張メソッドを使用することでpublicのイ…

Rhino Mocks

C#

この休日はRhino Mocksを試してみたい。 NMock2.0と違って文字列で設定しないから、名前変更のリファクタリングと相性がいいはず。

null許容型をまねて、null不可能型とかを妄想してみた

null許容型は、値型なのにnullを格納できる型で、C#ではこう書く。 int? i = null; // nullが格納できる! これと同じ考え方で、参照型なのにnullを格納できない型とかあると便利じゃね?と言うことで、どんな感じになるのか以下妄想。 null許容型は値型の末…

GCにはまる

C#

ぬるり。: COM クライアント実装の道程 for TaskScheduler その番外編2 〜 COM オブジェクトと GC とファイナライザを参考に、Excelを操作するCOMオブジェクトのラッパーを書いたんだけど、見事にはまった。 using (IExcel excel = new Excel()) using (IWor…

コレクションイニシャライザとインスタンスイニシャライザ

C#3.0のコレクションイニシャライザを見て、Javaのインスタンスイニシャライザ*1に似ているな、と思った。 まず、C#3.0のコレクションイニシャライザはこんな感じ。 var list = new List<string> { "hoge", "piyo" }; で、Javaのインスタンスイニシャライザはこう。 </string>…

あとで

C#

なんか急に思いついて書いてみた。めもめも。 public abstract class BasicTypeSafeEnum<T> where T : BasicTypeSafeEnum<T> { string name; public string Name { get { FieldInfo[] fields = typeof(T).GetFields( BindingFlags.Public | BindingFlags.NonPublic</t></t>…

JavaのpackageはC#では?

C#

少なくとも、namespaceではない気がする。 名前空間という観点からはJavaのpackageとC#のnamespaceはほとんど同じものとして見ることが出来るけど、リリースの単位という観点から見るとJavaのpackageに相当するのはアセンブリなのか? とすると、Javaのpacka…

ちょっと笑ってしまったコード

C#

public void DoEnable(bool able) { txt_Hoge.Enabled = able; txt_Piyo.Enabled = able; // 以下略 } DoEnableにable・・・ なんというか、Enabledってプロパティを使ってるんだから、ここもEnabledプロパティにして欲しいところだけど・・・ まぁ、何をす…

スーパークラスのフィールドへのアクセス

読書会で、抽象クラスのフィールドはデフォルトで protectedにする privateにしてprotectedなgetter/setter*1を用意する のどちらがいいか、という話があった。 昔は後者を好んで使用していたけど、最近はとりあえず前者を使うことが多い。なんたって手軽だ…

ファイナライザ、デストラクタ

読書会で話題に上がったけど、この辺の用語は言語によってまちまちで、かなり紛らわしい。 その場ではファイナライザとデストラクタは別物だよ、と言っただけなんで、補足を。 まずは、言語ごとに何を持っているのかの表を。 言語 ファイナライザ デストラク…

値を保持することを目的としたクラス

一昨日の読書会で空のコンストラクタを強要することの是非から、イミュータブルについて、更に値を保持することを目的としたクラスで「使用不可能」や「まだどうなるか分からない」ことを表す方法について話が発展していった中で、自分がよく使う方法を紹介…

インデクサの名前

C#

C#でインデクサは、 public int this[string key] { get { ... } } のように記述するけど、ほかの言語のためにItemという名前が勝手に付けられてしまう。 だから、 public int this[string key] { get { ... } } public string Item(string str) { ... } の…

ADO.NET

そろそろADO.NETをちゃんと勉強するか、と思って買ってきた。プログラミングMicrosoft ADO.NET2.0 (マイクロソフト公式解説書)作者: デビッドセッパ,David Sceppa,日本ユニテック出版社/メーカー: 日経BPソフトプレス発売日: 2007/07メディア: 単行本購入: 2…

ワイルドカードが欲しい

C#

ICollectionはジェネリックなので、 delegate bool IsExpected<T>(T target); static bool AnyImpl<T>(IsExpected<T> isExpected, params T[] targets) { foreach (T target in targets) { if (isExpected(target)) return true; } return false; } public static boo</t></t></t>…

定数名

C#

自分の周りだけかもしれないけど、C#で定数にLIKE_THISというのはどうなんだろ。 C#では、定数はLikeThisなんじゃないのかな。 String.Emptyとかもろにそうだし。 なんか、Javaとかほかの言語の規約をほとんどそのまま持ってきた感じがなんとも。 追記: 元…

可変長引数なのに

C#

string hoge = string.Format("{0}", new object[] { piyo }); あれかな、何でもかんでも明示的にやるのはいいことだ、ってことかな。 なんかよく分からん。

意味的にまずいcatch

C#

try { } catch (Exception e) { throw e; } こっちは上と違って、throw eの部分がスタックトレースの開始点に変更されてしまい、例外の詳細情報が消えてしまうのでまずい。 この書き方も所々に見られるんだよな・・・

意味的に何もしないcatch

C#

try { ... } catch { throw; } こんなcatchが大量にあるんだけど、何か意図があるのかな。 例外の起こる範囲を明示してるとか?

Disposeしてない

C#

なんか所々IDisposableなのにDisposeメソッド呼んでない部分がある*1んですが・・・ *1:もちろんusingブロックも使ってない

SQLインジェクション対策

講習か何かに行ってきた成果を取り込んだ対策一覧 文字数を一律50文字に制限する SQL生成時にユーザが入力した文字列はサニタイジングする。ただし、メールアドレスとして使用されるような文字列はその限りではない SQL生成時に&、、"はそれぞれ、&、<、>、"…

それはカンマです

C#

なになに?コーディング規約?どれどれ・・・ literalはconstメンバ変数に代入して使用すること ・・・あのう、何これ? こんな規約があるから const string period = ","; // ピリオド なんてコードが量産されるのか。 お、規約違反のコードみっけ。 public…

C#でのテスト(3) NMock 2.0を使ったテスト

C#

C#でのテスト(2) nantによるビルドの自動化 - ぐるぐる〜に続いて、今回はNMock 2.0の使い方を紹介する。 NMock 2.0は、 The original NMock was a .NET port of the Java-based DynaMock, whereas NMock 2.0 is inspired by the newer jMock library. NMock…

可変引数の不思議(C#版)

C#

C#でも全く同じなんだな。 interface IHoge { void Hoge(params string[] args); void Piyo(string[] args); } class Hoge : IHoge { void Hoge(string[] args) {} void Piyo(params string[] args) {} } Hoge h1 = new Hoge(); // これはコンパイルエラー /…

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…