R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

暗に型を設ける

何と、C# 3.0 では、

暗黙的な型付け

が可能らしいです!(何を今さら・・・)

今までは、


int i = 5;
double d = 1.5;
string s = "Rさん";


と書いていた訳です。

しかし「5 で初期化しているんだから、i は int だと自動的に判断してもいいんじゃん」という声にお応えしたのかどうかはわかりませんが。


var i = 5;
var d = 1.5;
var s = "Rさん素敵";


これで上記と同じ結果になります。凄いことですね。
もちろん判断する元になるのは初期値なので、以下のように初期化をしない変数の場合には使えません。


var r;


これはエラーになります。
これは、便利と呼べるものなのでしょうか?

コンパイラが型を推定するという曖昧さを残すことによるデメリットに対して、var と書くだけで良いというメリット(メリットとさえ呼べないかも)くらいしか無いようにも思います。

結局 LINQ のための機能ってことなんでしょうかね。

投稿日時 : 2007年6月20日 15:28

Feedback

# re: 暗に型を設ける 2007/06/20 16:04 中博俊

使わない理由はないからおいらのソースはvarだけになるかな。
Dim a as new = SqlConnection()
がVBではできるのにC#ではできない、それに対する答えにもなっています。

# re: 暗に型を設ける 2007/06/20 16:16 シャノン

# 敢えて言ってみる。

> 結局 LINQ のための機能ってことなんでしょうかね。

そうです。
C# 3.0 の新機能は全て LINQ のためにあります。

# re: 暗に型を設ける 2007/06/20 16:26 ひろえむ

ま、結局のところはそういうことなんでしょうねぇ(^^;

# re: 暗に型を設ける 2007/06/20 18:24 ぷさいくろう

var a =5
var b =5
a = 123456789

ってやったら
bはlong型になるのかしら

# re: 暗に型を設ける 2007/06/20 19:09 じゃんぬねっと

a の間違い?

# re: 暗に型を設ける 2007/06/20 20:06 Kazuki

123456789程度じゃInt32の範囲内だからどちらにせよ変わらないです。


私もOrcasで書いてる時はvarだらけです。
思考的には「nameに"太郎"を入れるからstringってうたなきゃな」って考えるのから「nameに"太郎"を入れる」と考えるだけでOKになるのが素敵。

# re: 暗に型を設ける 2007/06/20 21:04 NyaRuRu

ちなみに型推論は,例えば generic method の型引数の省略として,C# 2.0 でも存在します.
メソッド呼出し時の Array.ForEach<T>( array, action ); の <T> は,引数から推測可能なときは省略することができます.
近年の C# で多用される暗黙の型 (コンパイル時生成の内部型) では,むしろここの T を具体的に書けないため,この型推論が可能なことは非常に重要な意味を持ちます.

http://blogs.wankuma.com/naka/archive/2007/06/03/79237.aspx
コメント欄参照のこと.

# re: 暗に型を設ける 2007/06/20 23:27 通り*

LINQを実現する過程でできたとは言え、とっても良い機能だと私は思いますよ!
以前から
StringBuilder sb = new StringBuilder();
ってすごく冗長に感じてたんですが、これが
var sb = new StringBuilder();
と書けるのはうれし~~です。
スーパークラスやインターフェイスで変数を宣言したい場合を除けば、私はすべてvar使いますよ!

>ぶさいくろうさん
varは初期値で型が決定されるので、コードの途中で型が変わることはないです。
例えば今のC#で
int i = 0;
i = long.MaxValue;
と書けばコンパイルエラーだけど、これをC#3.0で
var i = 0;
i = long.MaxValue;
と書いた場合も最初の行で型がintに決定されるので、これもコンパイルエラーになるんですよね。

それと、コードの入力時点で型をわかってくれるので、i.ってすると、適切なメンバーをインテリセンスに出してくれます。
そんなところも凄いですよね!

#Rさんに代わって、私が熱く語ってしまいましたw
#でもNyaRuRuさんの話には難しくてついてけない(^-^;

# re: 暗に型を設ける 2007/06/20 23:34 じゃんぬねっと

「ぶ」 じゃなくて 「ぷ」

# re: 暗に型を設ける 2007/06/21 0:33 通り*

わわわわわ。。。
大変失礼しました!!><

# re: 暗に型を設ける 2007/06/21 9:51 ぷさいくろう

なるほどね

var a = 5;
a = 123412341234;
は、コンパイラが全部ソースをなめて型を決めるとかしないのか

昔ながらの
var a = 5L;
とか
var a = 5U;
が復権しそううだね
もしくは
var a =(long)5;
とか

# re: 暗に型を設ける 2007/06/21 11:46 質問者

疑問があります。
初期値代入時に、動的に型が確定するのは理解できました。
この確定はコンパイル時に、確定するのでしょうか。実行時に確定するのでしょうか。
文脈からはコンパイル時の、ように受け止められますし。それだと、動的という言葉に反するような気もしますし。どうでしょうか。

# re: 暗に型を設ける 2007/06/21 13:04 通り*

コンパイル時です。
IDEはちょっとフライングしてプログラマを助けてくれます~
ちゃんとした資料ではたぶん「動的」という表現はでてこないのでは?って思いますよ? 「型推論」という言葉がよく使われてます。

#昨日はハズカしくて顔から火が出ました...なるほどと言ってもらえてよかったぁ。

# 暗に型を設ける(その2) 2007/06/21 13:19 R.Tanaka.Ichiro's Blog

暗に型を設ける(その2)

# re: 暗に型を設ける 2007/06/21 14:09 R・田中一郎

中博俊 さん

慣れの問題なんですかね。
違和感ありありだったのですが、いろいろな意見を聞くうちに実際に使ってみたくなってきました。

-------------------------------------------------------
シャノン さん

>そうです。
>C# 3.0 の新機能は全て LINQ のためにあります。

なるほど、やっぱり。

-------------------------------------------------------
ひろえむ さん

>ま、結局のところはそういうことなんでしょうねぇ(^^;

しかし、LINQ は面白いですね。
僕も Orcas 入れようかな。

-------------------------------------------------------
ぷさいくろう さん

>bはlong型になるのかしら

それは僕も一瞬思ったのですが、ならないでしょうね。

var a;

と書くだけではダメという1文が全てを物語っているように思います。

-------------------------------------------------------
じゃんぬねっと さん

>a の間違い?
>「ぶ」 じゃなくて 「ぷ」

どこからともなくやってきて、さくっと訂正して去っていく謎の人みたいになってますね。

-------------------------------------------------------
Kazuki さん

>123456789程度じゃInt32の範囲内だからどちらにせよ変わらないです。

それは僕も一瞬思ったのですが、脳内変換しました。

>私もOrcasで書いてる時はvarだらけです。

へーっ、そういうものなんですね。

>思考的には「nameに"太郎"を入れるからstringってうたなきゃな」って考えるのから「nameに"太郎"を入れる」と考えるだけでOKになるのが素敵。

これは僕とはちょっと違いますね。
まず、どんな型を定義しようという考えから始まります。

-------------------------------------------------------
NyaRuRu さん

>メソッド呼出し時の Array.ForEach<T>( array, action ); の <T> は,引数から推測可能なときは省略することができます.

これは、純粋に知りませんでした。
(というか、腰が抜けました)

>コメント欄参照のこと.

僕は、型推論される結果を意識しながら書くのが面倒だと思ったのです。
しかし、コメント欄を読んで考え方が逆であったことに気付きました。

もうこうなってくると、型推論された結果を頭の中に簡単明瞭にイメージできる人(NyaRuRu さんとか NyaRuRu さんとか NyaRuRu さん)クラスの人ばかりでもないですし、型推論された結果を「ある型」と言う抽象的な型と捉えて書くことができるという考え方でも良いように感じますね。

-------------------------------------------------------
通り* さん

>StringBuilder sb = new StringBuilder();

それはその通りですね。
今は、こう書けないことが気持ち悪いくらいに慣れてしまいましたが。

>#Rさんに代わって、私が熱く語ってしまいましたw

ありがとうございます。
おかげで僕が楽できました。

>#でもNyaRuRuさんの話には難しくてついてけない(^-^;

MD3 かと思いました^^;
しかし、リンク先の内容は面白かったです。

-------------------------------------------------------
ぷさいくろう さん

>var a = 5;
>a = 123412341234;
>は、コンパイラが全部ソースをなめて型を決めるとかしないのか

逆にこれができるなら、

var a;
a = 5;

と書けて良い訳ですよね。

>var a =(long)5;

そうですね。
それと、a が long でなければならない場合がどれだけあるかという点も重要ですね。

-------------------------------------------------------
質問者 さん

>初期値代入時に、動的に型が確定するのは理解できました。

動的ではないです、型を書かなくても初期化時に自動的に型を推論してくれるということなのです。

# 暗に型を設ける(その2) 2007/06/21 17:14 R.Tanaka.Ichiro's Blog

暗に型を設ける(その2)

# re: 暗に型を設ける 2007/06/22 0:02 Kazuki

> >思考的には「nameに"太郎"を入れるからstringってうたなきゃな」って考えるのから「nameに"太郎"を入れる」と考えるだけでOKになるのが素敵。
>
>これは僕とはちょっと違いますね。
>まず、どんな型を定義しようという考えから始まります。

Javaでの話しですけど、私はよくこんな順番で書いたりします…
# メソッド内にて
1. 値を取得するメソッドかく
foo.getHogeHogeValue();
2. Eclipseのリファクタリング機能で戻り値を受け取る変数を追加
String value = foo.getHogeHogeValue();


varがOKならとりあえず何も考えずにvarって書けるのでスイスイ書けちゃう。
var value = foo.getHogeHogeValue();

# re: 暗に型を設ける 2007/06/22 14:15 R・田中一郎

Kazuki さん

>varがOKならとりあえず何も考えずにvarって書けるのでスイスイ書けちゃう。
>var value = foo.getHogeHogeValue();

話は変わりますけれど。
value を別のメソッドの引数として使う場合は、ちょっと躊躇しますね。

# re: 暗に型を設ける 2007/06/23 8:43 Kazuki

そうですか?
私はぜんぜん気にならないです!!!

# re: 暗に型を設ける 2007/06/25 14:37 R・田中一郎

Kazuki さん

void Method1() {
  var value = foo.getHogeHogeValue();
  :
  :
  :
  this.Method2(value);
}

void Method2(MyClass value) {}

上記のような場合は、下記のように型を明示して書きたくなりませんか?

void Method1() {
  MyClass value = foo.getHogeHogeValue();
  :
  :
  :
  this.Method2(value);
}

# re: 暗に型を設ける 2007/06/26 7:03 Kazuki

そういう場合でも書きたくならないですね~。
value変数にカーソルあわせるとVisual Studioが何型ですよっての出してくれますし♪

# re: 暗に型を設ける 2007/06/26 14:57 R・田中一郎

Kazuki さん

>value変数にカーソルあわせるとVisual Studioが何型ですよっての出してくれますし♪

そうだったのか orz
やっぱり実際に使わないとダメだよなぁ。

タイトル
名前
Url
コメント