C#

本の数(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(); // これはコンパイルエラー /…