- PR -

インスタンスに対する変数型は、本当に、一意に決まるのか?

投稿者投稿内容
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2006-01-10 18:05
objectです。

一つだけ、皆さんに確認したい事があります。
#いずれ誰かが確認すると思い、静観していましたが、
#誰も確認しないので、私が確認する事にしました。

「PDC05レポート:動的プログラミング言語へと発展するC# 3.0とVB 9.0」
で、最初のページ
「コンパイラは全能か?」
の最後の箇所

引用:

 C#コンパイラがVB.NETよりも賢いというなら(上のコードはC#ではコンパイルできる)、なぜC#では以下のように記述しなければならないのか? どうして何度も型名を記述しなければならないのか?

// sがStringBuilderであるのは分かりきっているのに……
StringBuilder s = new StringBuilder();

// VBなら次のコードで書けるのに……
// Dim s As New StringBuilder()


本当に、
「sがStringBuilderであるのは分かり切った事」
なのでしょうか?

もし、そうであるなら、
この場合、これは、
コード:

object s = new StringBuilder();


と書く可能性は無いと言っているのでしょうか?

オブジェクト指向で重要な概念である
「ポリモーフィズム」
は何処へ行ってしまったのでしょうか?


[ メッセージ編集済み 編集者: object 編集日時 2006-01-10 18:07 ]
まいるどきゃっと
大ベテラン
会議室デビュー日: 2004/08/12
投稿数: 135
お住まい・勤務地: 群馬
投稿日時: 2006-01-10 18:41
元記事を書いた人の文章の書き方の問題だと思いますが、

引用:

C#コンパイラがVB.NETよりも賢いというなら(上のコードはC#ではコンパイルできる)、なぜC#では以下のように記述しなければならないのか? どうして何度も型名を記述しなければならないのか?

// sがStringBuilderであるのは分かりきっているのに……
StringBuilder s = new StringBuilder();

// VBなら次のコードで書けるのに……
// Dim s As New StringBuilder()



の部分は、「StringBuilder型の変数にStringBuilder型のインスタンスへの参照を代入する事が決まっているときに、何で2回もStringBuilderという文字列を書かなければいけないの?」って言いたいのだと思います。

つまり、
コード:
StringBuilder s = new StringBuilder();



とは別に、

コード:
StringBuilder new s();



のような省略形が欲しいという事かと思いました。

まあ、本当のところは元記事書いた人にしか分りませんが
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-10 18:48
こんにちは。

私も一瞬引っかかりましたが、
コード:
StringBuilder s = new StringBuilder();


↑じゃなくて、


コード:
var x = new StringBuilder();


↑でいいじゃん。と書かれてますね。


コード:
object s = new StringBuilder();


↑と似たようなものでしょう。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-10 18:48
私も「格納したいインスタンスが、宣言型と同一である場合は」だと思います。

確かに省略したくなる衝動に駆られますね。(^^)
特に VB をやった後にそう思うようになりました。

C# では、using が見難くなってしまうので、特にそう思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-01-10 21:42
型AがBインターフェイスとCインターフェイスを実装している場合に、
コード:
A a = new A();
B b = new A();
C c = new A();


と、どれでもOKですね。

さらにBインターフェイスを実装した型Xがあったとして、
コード:
B b;
if(xxx){
    //特定の条件の時は振る舞いを変える
    b = new X();
}else{
    b = new A();
}


こんな感じのコードもかけます。

静的に型が決定するオブジェクト指向言語の特徴でしょうね。
型情報の扱い方が柔軟になれば、賢いサポートも可能じゃないでしょうか。
まいるどきゃっと
大ベテラン
会議室デビュー日: 2004/08/12
投稿数: 135
お住まい・勤務地: 群馬
投稿日時: 2006-01-11 02:57
引用:

囚人さんの書き込み (2006-01-10 18:48) より:

コード:
var x = new StringBuilder();


↑でいいじゃん。と書かれてますね。




あー、確かに下のほうにそんなこと書いてありますね。気づきませんでした……orz
C# ver.3.0だと、JavaScriptっぽく変数が宣言できるんですね。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-01-11 03:05
というか例が悪い。匿名型と組みあわせて考えたほうがvarの必要性がみえる。
本質は、名前がない型の名前をどうやって指定したらいいか。しかもSQLかいてたら分かるけど、クエリの結果に名前なんて普通ない(だからこその匿名型だけど)。
class{ int Id; string Name;...}みたいに定義を書くという手もあるけど、これを何回も書くのはさすがにアホだし。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2006-01-11 17:45
objectです。

皆さん、レス有難う御座います。
纏めレスで済みません。
===============
>まいるどきゃっとさん
コード:

StringBuilder new s();


こう書かれている気持ちは、私にも分かります。
しかし、
C系の「()、アドレス、それらの関係の一貫性」
を考えると、そう簡単な話ではないと思います。

それに、確かVS2005では、
タイプの最初の「一字入力」だけで
「インテリセンス」
が働きますから、
「今迄の形式で負担になる事は殆ど無い」
筈です。

もし、
「省略形が欲しい」
のなら、
「省略形が無い事が問題」
であって、
「一般的な表記」がある事が問題では無い筈です。
元記事の表現は、知らない人に、ある意味で
「特殊」を「一般」
と誤解させる可能性があったと思います。
#勿論このスレの目的は、著者を非難する事ではなく、注意を喚起する事です。
#誰でも、表現等を含む間違いを、完全にゼロにするのは不可能ですから。
===============
>囚人さん
コード:

var x = new StringBuilder(); --- (1)


ええ、恐らく(1)の為に
「私が問題にした箇所」
も存在するんでしょうね。
そして、私も
「この事を、今後、皆さんと一緒に注目したい」
という主旨でこのスレを起こした訳です。

コード:

object s = new StringBuilder(); --- (2)


でも、(1)と(2)では、それが抱える問題が異なって来るのではないでしょうか?
「var」に関しては、未だ情報不足なので、今後を見守りたいと思います。
#ただ、C#は、厳密にタイプで付けされた言語です。
#実は、これによって「同値律」が満足され、
#比較的自由にコーディング出来るんだと思います。
#ハンガリアン記法は、ある意味で、その為の記法だったと思います。
#そして、継承は、この厳密さを保ちつつ、
#一部に多様性を持たせるアイデアだと思います。
===============
>じゃんぬねっとさん
>確かに省略したくなる衝動に駆られますね。(^^)
>特に VB をやった後にそう思うようになりました。
ええ、私も「VB」の問題もその背景として考えていました。
「VB」は、注意して見守る必要がある言語だと思います。
===============
>yaさん
勿論、
「varの必要性がそれなりにあった」
からこそ、
「C# ver.3.0 に採用されている」
と思います。

ただ、それには
「言語が担っているものと、その構造的な違い」
に目を向ける必要があるんだと思います。
「SQL」もそうですよね。
===============
>ALL
「マイクソロフトの動きを注視する」
切っ掛けになる事を祈っています。
「変だ・可笑しい」と思ったら、
間違いを恐れずに、皆さんと相談したいですね。

***************
#纏める段階で、レスが抜けてしまいました。
#かつのりさん、申し訳ありませんでした。<(_ _)>
>かつのりさん
内容的には、補足して頂いている様ですね。
有難う御座いました。
***************


[ メッセージ編集済み 編集者: object 編集日時 2006-01-11 21:17 ]

スキルアップ/キャリアアップ(JOB@IT)