投稿数 - 437, コメント - 52888, トラックバック - 156

型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

http://blogs.wankuma.com/rti/archive/2007/12/26/114624.aspx

C# 3.0 の暗黙型付け「var」の使いどころが議論になっている。「この手の議論は後 5 年は終わらないかも?」と思うぐらい意見が分かれてる。

「var を使わなければしょうがない箇所(匿名型を使う箇所)は使えば良い」という意見は全員一致で合意だとして、「今まで var を使う必要がなかった箇所に var を使うかどうか」というのが激論の的だ。「今まで var を使う必要がなかった箇所に var を使うべきではない」が大勢のようだ。ぶっちゃけると、私はどっちでも良いんじゃない? と思っているが、それでは卑怯なので、「今まで var を使う必要がなかった箇所にも var を積極的に使うべき」という立ち位置になる。

var 反対派の「型を明示する事が大事だよ」という意見は理解しがたい。var は宣言と同時に初期化する必要があるのだから型は十分に明示している。

「var は型を明示している」。これが大事だ。

「型推論」という用語が混乱させるのかもしれないが、推論はコンパイラにとってそうであって、人間にとっては推論でも何でもない。コードを書いた時点で型ははっきり分かっている。

「型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事」

そういう意味では

http://www.ailight.jp/blog/kazuk/archive/2007/12/26/14345.aspx
varとは「仕様」でなく「真理」に基づいたコードを記述する為の手段であり、型という「仕様」の決定をコンパイル時まで遅延させるという目的に対して使われるべきものです。

は若干ズレているのではないかと思う。型の決定は「コードを書いた時点」で行われているべきだ。人間にはそれが分かっている。コンパイラはそれを推論するだけ。それが var だ。

for(var i = 0; i < 10; i++)

上記コードで、var 反対派は「var と書く必要がないから int と明示すれば良い」と言っているが、「どう見ても i は int 型なんだから、いちいち型名を書く必要がない」が型推論だ。

もう一度言おう。型を推論するのは人間ではなくコンパイラだ。var を積極的に使うのは、いちいち型名を明示しなくても人間には型が明らかだからだ。

しかし、人間にも型を推論させる箇所に var を使うのはバグの元とだけは言っておこう(ソレは何処なんじゃい!ってのが議論の中心だと思うけど)。

投稿日時 : 2007年12月27日 13:05

フィードバック

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>varとは...型という「仕様」の決定をコンパイル時まで遅延させるという目的に対して使われるべき

私もこれには「なんで?」と思いました

varは使いどころをよく考えれば(もしくは使う必要性があれば)使ってもいいと思います

でもこのコードで
for(var i = 0; i < 10; i++)

「わざわざintと書く必要があるの?」
と言われたら
「じゃあ今までわざわざintと書いてたの?」
と聞き返してしまいます

varでコーディング量が少なくなるとしても、C#には強力なインテリセンスがあるので
コードは組むというよりも「選ぶ」という印象が強いです

それを
・毎回varを選ぶか
・処理毎に型を選ぶか
と言われたら私は適切な型を選びます
2007/12/27 13:31 | アキラ

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>「わざわざintと書く必要があるの?」
>と言われたら
>「じゃあ今までわざわざintと書いてたの?」
>と聞き返してしまいます

「コンパイラが推論してくれなかったからわざわざ int と書いてました」が返答です。

とは言え、今まで何百~何千回も書いてるので
「for(」
まで書いたら、次は勝手に「i」に中指が乗るので、それだけの理由で私も var って書かないと思います。


>それを
>・毎回varを選ぶか
>・処理毎に型を選ぶか
>と言われたら私は適切な型を選びます

匿名型が絡む以外では、「いちいち型名書かなくても分かるよね?」って場所が、きっと適切な var の使用方法だと思います。
2007/12/27 13:52 | 囚人

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

私自身まだ var とか使ったことがないので、IDE でどうこう言える立場ではないのですが、むしろ私が懸念しているのが「掲示板などで var が使われること」

コンパイラくんがいないので人間が推論しなくてはいけないという暗黒時代にw
(わかっている人はきちんと明記するかもしれませんが、もちろん初心者と呼ばれる人たちはいつの時代にも存在するわけで)

# Kazuki さんのところより引用

var id = GetID();
var name = GetName();
var hoge = obj.Piyo; // こいつ何型だ!?
2007/12/27 14:02 | オノデラ

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>ソレは何処なんじゃい!ってのが議論の中心だと思うけど

ですね。

単純に new したインスタンスを受け取るところなら特に問題ないと思うんだけど、プロパティやメソッドの戻り値どー見るかが議論の分かれ目でしょう。

ToString() とか、あからさまに戻り値がどんな型かわかるようなやつも個人的にはOKですが、問題は残り。

菊池さんのエントリの言葉を借りるなら、「それが仕様なのか心理なのか」。

「ろくに考えてないからどっちとも言えず」なんてのもあり得るし (>o<)
2007/12/27 14:07 | 渋木宏明(ひどり)

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>私自身まだ var とか使ったことがないので、IDE でどうこう言える立場ではないのですが、むしろ私が懸念しているのが「掲示板などで var が使われること」

お~、それは確かにそうですね。考えた事ありませんでした。十分ありそう。


>単純に new したインスタンスを受け取るところなら特に問題ないと思うんだけど、プロパティやメソッドの戻り値どー見るかが議論の分かれ目でしょう。
>
>ToString() とか、あからさまに戻り値がどんな型かわかるようなやつも個人的にはOKですが、問題は残り。

そうですね。
個人的には、今のトコロ var は使える場所が限定されているので、まぁ var が使える場所なら大体型がハッキリ分かるんじゃない? って思ってます。
2007/12/27 14:38 | 囚人

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>C#には強力なインテリセンスがあるので

標準機能ではありませんが,ReSharper 4.0 の Quick Fix でもうすぐ一発相互変換ができるようになりそうですね.
RSRP-47519: Quick Fix to change ’var’ to explicit type
RSRP-47520: Quick Fix to change explicit type to ’var’

http://jetbrains.net/jira/browse/RSRP-47519
http://jetbrains.net/jira/browse/RSRP-47520
2007/12/27 14:38 | NyaRuRu

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

http://blogs.wankuma.com/nagise/archive/2007/12/26/114706.aspx

こっちにいっちばん簡単な例書いたんだけど、コードを書く時点ではほんとに型が解らん(ということにしたい)状況って無いわけじゃないよ。

>「ろくに考えてないからどっちとも言えず」なんてのもあり得るし

それは、自分もある。varは時と場合によっては「どーでもいいよ型」だったりするし。
あえて汎用狙ってvarを書くときと半々かなー
まあDBのエンティティに絡まるところではできるだけvarで書くかな、DBのサイジング変わってintがbigintとか逆になったときにあっちこっちソース直すの嫌やもん。

ORマッピングする仕組みが正しい型をひっぱってくる、だからそれについていきますって感じ。
2007/12/27 14:40 | 菊池

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>標準機能ではありませんが,ReSharper 4.0 の Quick Fix でもうすぐ一発相互変換ができるようになりそうですね.

スゲー微妙な機能ですね。使うかなー。どうだろ。


>こっちにいっちばん簡単な例書いたんだけど、コードを書く時点ではほんとに型が解らん(ということにしたい)状況って無いわけじゃないよ。

今環境がないので試せませんが、そのコードってコンパイルできるんでしょうか? TAmount と TCurrency をかけ算してますが…。
それだと、確かにコードを書く時点で確かに型が分かりませんが、コンパイル時にも分からないのでは? C++ ならありですが。


>>「ろくに考えてないからどっちとも言えず」なんてのもあり得るし
>
>それは、自分もある。varは時と場合によっては「どーでもいいよ型」だったりするし。
>あえて汎用狙ってvarを書くときと半々かなー
>まあDBのエンティティに絡まるところではできるだけvarで書くかな、DBのサイジング変わってintがbigintとか逆になったときにあっちこっちソース直すの嫌やもん。

「どーでもいいよ型」用途に var を使うのは妙だなーと思うわけです。object でも受けれますし。 型によってはボクシングされますが。

var ≒ object も議論の別れ道かな?
2007/12/27 15:08 | 囚人

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

> そのコードってコンパイルできるんでしょうか?

試したらできたよ。恐ろしいね。
2007/12/27 15:27 | シャノン

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

ガーン!なんでー!?

var price = item.UnitPrice * amount;

理解不能…。

失礼しました。
2007/12/27 15:50 | 囚人

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>> そのコードってコンパイルできるんでしょうか?

>試したらできたよ。恐ろしいね。

恐ろしい?

それを狙った上で書いているのだから、修正の手間が少なくて助かるのではなくて?
(別の見方をすれば、右辺で型を明示しなければこうなるってだけのことでしょう。)

ぼくのエントリにもリンク張らせてー!
http://blogs.wankuma.com/gshell/archive/2007/12/26/about_var.aspx
2007/12/27 16:19 | ghost_shell

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

「var は型を明示している」って意見には穴があって、
宣言型と実装型が同じ場合にのみ有効なのですよね。
これはエピさんのところにもあったのだけど、引用すると

------------------------------------------
var children = new List<Child>();
僕はおそらく、このテの(省略目的の)varは使わない気がします。
childrenはList<Child>でなくてはならないとは思っていない、
Childの集合でありさえすればえぇのや、
ICollection<Child> children = new List<Child>();
なのよね僕のキモチ的には。
------------------------------------------

という話。これは、宣言型と実装型が違う場合で、
これはvarでは型を明示できない。
かつのりさんが

Map<String,Map<String, Integer>> map = new HashMap<String,Map<String, Integer>>();
みたいなコードはもう書きたくない・・・。

なんて言っていたけど、こういう宣言型と実装型の違う場合はどのように宣言したいのかを明示せざるを得ないと思うのですよね。

そうなると、宣言と実装が乖離しないシチュエーションにのみvarはアリってことになるんだけど、
私は自分の頭でコンパイラがやる型推論をなぞりたくない。
0.0の場合はfloat?double?そんなルール暗記してないよ、と。
2007/12/27 16:45 | 凪瀬

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>ぼくのエントリにもリンク張らせてー!

ばっちこーい!


>「var は型を明示している」って意見には穴があって、
>宣言型と実装型が同じ場合にのみ有効なのですよね。

ICollection<Child> children = new List<Child>();
で children の型は List<Child> だと、コードを書いている時点ではっきりしています。

敢えて宣言型と実装型を別にしても意味ないです。
それって実行時まで型が分からないって場合はメリットありますが、var はコードを書いているとき、そしてコンパイル時には型が分かっていないと駄目です。
なので、インターフェースやスーパークラスで型を宣言する事と var で型を宣言する事を並べて比較できません。それぞれ別用途です。
2007/12/27 17:09 | 囚人

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

> children の型は List<Child> だと、コードを書いている時点ではっきりしています。

実行時にList<Child>なのは明確だけど、それは意識しないでしょう?
ICollection<Child>でさえあれば具象型が何かなんて考えない。
むしろ、具象型に依存してはいけない。
ICollection<Child>の継承クラスならなんでも動くようにという明示であって、
今はList<Child>なんだからその型で動けばいいって考え方ではないんですよね。

でも、varの議論を見ていると、「ある条件を満たしてさえいれば、具体的な型はなんでもいい何か」という考え方ではないように見受けられる。どうなんでしょ。
2007/12/27 17:21 | 凪瀬

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

つまるところ私の意見は、抽象型でいいじゃん、ということなんですよね。
コンパイル時に決まる具象型に依存したコードってすごく気色悪い。
2007/12/27 17:23 | 凪瀬

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

抽象型と var は全く別次元で扱われるべきです。
抽象型を使うべきところに var を持ち込むのは論外ですね。

>実行時にList<Child>なのは明確だけど、それは意識しないでしょう?
>ICollection<Child>でさえあれば具象型が何かなんて考えない。
>むしろ、具象型に依存してはいけない。

実行時にではなく、コード書いているとき(コンパイル時)に明確であれば var で良いし、実行時まで明確でなく意識しなくないなら抽象型です。


>でも、varの議論を見ていると、「ある条件を満たしてさえいれば、具体的な型はなんでもいい何か」という考え方ではないように見受けられる。どうなんでしょ。

>つまるところ私の意見は、抽象型でいいじゃん、ということなんですよね。
>コンパイル時に決まる具象型に依存したコードってすごく気色悪い。

var をまるで抽象型の代わりに使えるっていう方向が議論の混乱の原因になっていそうですね。
2007/12/27 17:34 | 囚人

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>私自身まだ var とか使ったことがないので、IDE でどうこう言える立場ではないのですが、むしろ私が懸念しているのが「掲示板などで var が使われること」

貴方は預言者ですか?www
2007/12/27 18:03 | アクア

# 型議論

型議論

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>試したらできたよ。恐ろしいね。

やっぱこのコードコンパイルできないよ。
どうやったの?
2007/12/27 19:38 | 囚人

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

適宜アクセス修飾子を補ってあげる必要があるかもしれない。
2007/12/27 19:59 | シャノン

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>やっぱこのコードコンパイルできないよ。
>どうやったの?

 コンパイルできないとしたらMSにバグれぽ汁。

部分クラス定義 (C# プログラミング ガイド)
http://msdn2.microsoft.com/ja-jp/library/wa80x488(VS.80).aspx
--
基本クラスを指定する部分はすべて一致する必要がありますが、基本クラスを省略する部分も基本型を継承します。
--

既定クラス指定を省略することで既定型依存をソースコードレベルではしないようにしつつ、partialの別部分を経由して既定型に依存させてるのが通らないのは言語仕様(ではないけど)プログラミングガイドの記述に反する。

2007/12/27 20:26 | 菊池

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

あぁ、アクセス指定子は書いてないから private だからダメだよとエラー上がるかもー
2007/12/27 20:27 | 菊池

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>シャノンさん
>菊池さん

お二人ともまだ見ていてくれてるとはありがとうございます。

やっと意味がわかりました。
partial class の可能性が広りました…。スゲぇ…。
2007/12/27 21:22 | 囚人

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

あー、ちょっと上見直してみたけど

>まあDBのエンティティに絡まるところではできるだけvarで書くかな、DBのサイジング変わってintがbigintとか逆になったときにあっちこっちソース直すの嫌やもん。
>ORマッピングする仕組みが正しい型をひっぱってくる、だからそれについていきますって感じ。

はセットで扱って欲しいかな。
でないとDBサイジングが変わる可能性があるという変化に対しての受け入れ姿勢のvarと、本気に「こまいこと気にすんなや」がごっちゃになるので。

>var ≒ object も議論の別れ道かな?

それは同意。
2007/12/27 22:38 | 菊池

# re: 型推論とは、人間には明らかに分かる型に対して、いちいち型名を明示しない事

>はセットで扱って欲しいかな。
>でないとDBサイジングが変わる可能性があるという変化に対しての受け入れ姿勢のvarと、本気に「こまいこと気にすんなや」がごっちゃになるので。

なるほど。御意。
2007/12/27 22:52 | 囚人

# ルイヴィトン 公式サイト

?婁笘?便伀?倞????傘?????亜?樹??с????

# GUqXhgDtaPPmbFlrx

bsrtPU Thanks again for the article.Thanks Again. Will read on...
2014/07/19 15:17 | http://crorkz.com/

# gold cartier love bracelet replica

Thanks! Can´t wait for part 2!
gold cartier love bracelet replica http://www.vogue-tour.net/tag/cartier-love-jewellery-usa
2015/08/01 16:14 | cfonpybrkwk@aol.com

# bracelet Cartier love replica

I have to thanks for the work you've made in writing this publish. It has been an inspiration in my opinion. I have passed this through to a friend of mine. thankyou
bracelet Cartier love replica http://www.womenslovejewelry.com/tag/cartier-love-bracelet-replica
2015/08/04 12:35 | wpxlqdqk@aol.com

# cartier leather love bracelet replica

One thing that can throw commercial investors for a loop are dramatic changes in interest rates over time Many of us that’s why incorporate, instead of most propositions that may happen to get good within topic that The Elevated Bowl provides handed quite a distance since an initial festivities during 1890To make sure that you are buying the best possible jerseys that are made in China, you have to make a careful scrutiny of the items before making the order Vast majority spend money on Replicat
cartier leather love bracelet replica http://www.shoppingcartier.com/processing-cartier-love-bracelet/
2015/08/04 21:57 | srwamfb@aol.com

# faux sac de luxe

I've experienced this bug as well on a Clevo W150HRM with a Sandy Bridge Core I7 (2820QM). The solution in #16 fixes it for me. I have yet to try #18, but I'm sure it'll work as well. Running 2.6.38-10-generic.
faux sac de luxe http://www.replicasbag.net/fr/-c87/
2015/08/30 18:45 | luxnjifbdpw@aol.com

# OkOjELOHnMHPwCoF

ZnPBkQ Thanks for the blog.Much thanks again. Awesome.
2018/12/17 10:10 | https://www.suba.me/

# hi!,I love your writing so so much! percentage we communicate extra about your article on AOL? I need an expert in this space to resolve my problem. Maybe that is you! Having a look ahead to look you.

hi!,I love your writing so so much! percentage we communicate extra
about your article on AOL? I need an expert in this space to resolve my problem.
Maybe that is you! Having a look ahead to look you.

# For most recent information you have to visit internet and on web I found this web page as a best web site for most recent updates.

For most recent information you have to visit internet and on web I found this web page as a best web
site for most recent updates.

# It's not my first time to visit this web page, i am visiting this web page dailly and obtain fastidious facts from here every day.

It's not my first time to visit this web page, i am visiting
this web page dailly and obtain fastidious facts from
here every day.

# It's not my first time to visit this web page, i am visiting this web page dailly and obtain fastidious facts from here every day.

It's not my first time to visit this web page, i am visiting
this web page dailly and obtain fastidious facts from
here every day.

# It's not my first time to visit this web page, i am visiting this web page dailly and obtain fastidious facts from here every day.

It's not my first time to visit this web page, i am visiting
this web page dailly and obtain fastidious facts from
here every day.

# It's not my first time to visit this web page, i am visiting this web page dailly and obtain fastidious facts from here every day.

It's not my first time to visit this web page, i am visiting
this web page dailly and obtain fastidious facts from
here every day.

# Illikebuisse mbauq

lupus wikipedia english https://pharmaceptica.com/
2021/07/04 21:19 | www.pharmaceptica.com

# Illikebuisse rvlrm

tadalafil price at walmart https://www.pharmaceptica.com/
2021/07/05 6:37 | pharmaceptica.com

# re: ????????????????????????????????????

hloroquine https://chloroquineorigin.com/# how long has hydroxychloroquine been around
2021/07/23 8:59 | hydrocholoroquine

# What's Going down i am new to this, I stumbled upon this I have discovered It absolutely useful and it has aided me out loads. I'm hoping to contribute & help other users like its helped me. Good job.

What's Going down i am new to this, I stumbled upon this I
have discovered It absolutely useful and it has aided me out loads.

I'm hoping to contribute & help other users like its helped me.
Good job.

# What's Going down i am new to this, I stumbled upon this I have discovered It absolutely useful and it has aided me out loads. I'm hoping to contribute & help other users like its helped me. Good job.

What's Going down i am new to this, I stumbled upon this I
have discovered It absolutely useful and it has aided me out loads.

I'm hoping to contribute & help other users like its helped me.
Good job.

# What's Going down i am new to this, I stumbled upon this I have discovered It absolutely useful and it has aided me out loads. I'm hoping to contribute & help other users like its helped me. Good job.

What's Going down i am new to this, I stumbled upon this I
have discovered It absolutely useful and it has aided me out loads.

I'm hoping to contribute & help other users like its helped me.
Good job.

# What's Going down i am new to this, I stumbled upon this I have discovered It absolutely useful and it has aided me out loads. I'm hoping to contribute & help other users like its helped me. Good job.

What's Going down i am new to this, I stumbled upon this I
have discovered It absolutely useful and it has aided me out loads.

I'm hoping to contribute & help other users like its helped me.
Good job.

# Thanks for some other informative blog. Where else could I am getting that type of information written in such a perfect way? I've a venture that I'm simply now working on, and I've been on the look out for such info.

Thanks for some other informative blog. Where else could I
am getting that type of information written in such a perfect way?

I've a venture that I'm simply now working on, and I've been on the
look out for such info.

# chloroquine uk buy

https://www.hydroxychloroquinex.com/# chloroquine tablets price
2022/12/25 8:10 | MorrisReaks

# ロレックスコピー

2023年の新素材-新作!高品質 腕時計高品質の追求 超N品を良心価格で提供詳しくは以下のようなブランドがあります。エルメス(バッグ、財布、時計) シャネル(バッグ、財布、時計)ルイヴィトン(バッグ、小物、財布、時計) ブルガリ(財布、時計)グッチ(バッグ、財布) ロレックス(時計)オメガ(時計) IWC(時計)FRANCK MULLER(時計) ウブロ(時計)クロエ CHLOE バッグなどです。ご不明点が ございましたらお気軽にお問い合わせください品質保証 満足保障。 }}}}}}
https://www.bagssjp.com/product/detail-5790.html
https://www.bagssjp.com/product/detail-975.html
https://www.bagssjp.com/product/detail-6129.html
https://www.bagssjp.com/product/detail-518.html
https://www.bagssjp.com/product/detail-2862.html
2023/05/21 23:13 | coxAcquic

コメントの投稿

タイトル
名前
URL
コメント