Rさんの所で炎上しかかってる?var論争。
VS2008の日本語版が正式に出たこともあってほっとな話題であることに違いはない!
ということで、最近Javaネタだらけ(仕事がJavaなので…)だったけど.NETの世界に少し戻ってみようと思う。
varはどうよ?
個人的には、ガンガン使っていいんじゃないだろうかって感じです。
でも、使っちゃ駄目よってプロジェクトで指定されたら、無理に反発する程でもないと思います。
郷に入れば郷に従えかな。
個人的には、1メソッド5行~50行程度以内じゃないと気持ち悪いので、その範囲ならvarを連打しても可読性が落ちるとは感じないかな。
IDEもあるし…
var id = GetID();
var name = GetName();
var hoge = obj.Piyo; // こいつ何型だ!?
適当にvarを使うわかりにくくなりそうなパターンを書いてみたけど、最後みたいに変数名とプロパティ名(メソッド名)が何をするかあらわして無いと、ちょびっと困惑しそうなくらいかな??
変数名と、メソッド名とかが適切につけられていれば困惑することは少ないと思います。
(スクリプト言語とかだ、そもそも型が何かわからないけどたいした問題になってないし)
匿名型
Rさんところのコメントを見てると匿名型の意見も割れてそう。
個人的には、匿名型は普段使いはあまりしなさそうな感じがする。
new { Name = GetName(), Age = GetAge() };
みたいなことをするならおとなしく
var name = GetName();
var age = GetAge();
かなぁ。
匿名型は、メソッドの戻り値とかにも使えないし、引数で渡すならobject型の引数にしか渡せないから、メソッド内でローカルで使うやっつけの型が必要になるケースなんてなかなか思いつかない。
しいて言うなら、リフレクションでプロパティの情報を舐めて何か処理をするようなメソッドに渡すのに使う。
たとえば下のような感じ。
class Converter
{
private IDictionary<string, Func<object, string>> convRules =
new Dictionary<string, Func<object, string>>();
private static readonly Func<object, string> DEFAULT_RULE = (x) => x.ToString();
public string Sep { get; set; }
public void AddConvertRules(string propertyName, Func<object, string> convertRule)
{
convRules[propertyName] = convertRule;
}
public string ToString(object obj)
{
// プロパティ舐めまわし
var props = obj.GetType().GetProperties();
var ret = new string[props.Length];
for (int i = 0; i < props.Length; i++)
{
var prop = props[i];
var rule = GetRule(prop.Name);
ret[i] = rule(prop.GetValue(obj, null));
}
return string.Join(Sep, ret);
}
private Func<object, string> GetRule(string propertyName)
{
if (convRules.ContainsKey(propertyName))
{
return convRules[propertyName];
}
return DEFAULT_RULE;
}
}
ToStringメソッドが、リフレクションでプロパティを走査して処理をやってる。(forの中のintがvarじゃないのは手がintと勝手にうってしまったから…慣れってこわいわ)
このToStringに対して、↓のように匿名型を渡す。
class Program
{
static void Main(string[] args)
{
var c = new Converter();
c.Sep = ", ";
c.AddConvertRules("Name", (x) => x + "さん");
c.AddConvertRules("Age", (x) => x + "才");
Console.WriteLine(c.ToString(new { Name = "Taro", Age = 12 }));
}
}
実際は、GridViewにデータを渡したりとかかな?
ASP.NET MVCの画面まわりでは多用することになってたような気がする。