DataRow
からたくさんのパッキングとアンパックを行います。はい、私たちはORMを使うべきですが、それまではこれが私たちのものです。この結果、次のようなコードがたくさんあります:
string username;
var temp = dr["Username"];
if (DbNull.Equals (temp))
{
username = "Anonymous";
} else {
username = dr["Username"].ToString();
}
最終的に、これはパターンになり、ヘルパーメソッドに変換されました。
string username = StringExtensions.SafeParse (dr["Username"], "Anonymous");
This is still cumbersome, and required extension methods for all kinds of primitives. It also clutters up the code. I created a generic extension method, on object
, called As
. Usage looks like:
string username = dr["Username"].As ("Anonymous");
この比較的単純な変更は、他の開発者との大きな寛大さを満たし、多くの場所で使用されています。私が不満を感じているのは、潜在的なパフォーマンスの影響です。 今は時期尚早の最適化がないことを認識しています。早すぎる最適化を行わずにコードを書いたことは間違いありません。後でそれを最適化することは大したことではありません。私は比較的控えめな2GHzワークステーションで毎秒250万回のコンバージョンを行う方法をベンチマークしました。これは他の開発者を保存する時間と読みやすさの向上に比べて驚異的なパフォーマンスです。しかし、以下のコードのサンプルを見ると、私は言語の機能を誤っているように感じ、もっとうまくいくかもしれません。このメソッドはxmldocされています。 "大声で叫ぶ"と大声で叫びます!私はダブルボクシングを避けるためのより良い方法を探しています。実際のバージョンは簡潔にするために省略してありますが、実際には多くの場合 TryParse
が使用されています。
public static TDestination As<tdestination> (this object source, TDestination defaultValue = default(TDestination))
{
if (source is TDestination)
return (TDestination) source;
if (source == null || DbNull.Equals(source))
return defaultValue;
if (TDestination is int)
return (TDestination) (object) Convert.ToInt32 (source.ToString ());
if (TDestination is long)
return (TDestination) (object) Convert.ToInt64 (source.ToString ());
if (TDestination is short)
return (TDestination) (object) Convert.ToInt16 (source.ToString ());
//and so on...
}