東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

参照型の例として最もふさわしくない参照型

かるばタンのセッション。

値型の代表格がint、参照型の代表格がstring
値をそのまま放り込めるのが値型、newして放り込むのが参照型…
おっとぉ!

string s;
s = "はらたいら";

new してないやんけ! これのドコが参照型なん!?
って突っ込まれたらどないしょー って、
かるぼタンのドキドキが伝わってくるのです ^^;

string への文字列の代入は極めて特殊で、
s = "はらたいら";
s = new string("はらたいら");略記なのよね。

あるいは:

s → ×  ? → "はらたいら"
ってなってるとき、?がsに代入されて
s → "はらたいら"
となるって解釈。

むしろコッチが正解でしょうね。
文字列リテラル:"はらたいら" がコード上に現れた時点
で(裏でコソーリ)newされてstring定数とでも言うべき参照ができてる、と。
s = "はらたいら" は単にstringからstringへの代入なんやね。

そしてまた if ( s == "篠沢教授" ) と書けることのナゾ。
Java屋さんには周知だけども、参照型はフツー==で比較できないのに、とか。

stringは参照型の中では非常に特別な存在。
しかしながら参照型の代表格としてstring以外に何がある?
ってジレンマがあるです。 教える側にはヒジョーに悩ましいわけで。

投稿日時 : 2007年6月3日 2:50

コメントを追加

# re: 参照型の例として最もふさわしくない参照型 2007/06/03 3:47 シャノン

new不要にしないとリテラルが書けないっすからね。

# re: 参照型の例として最もふさわしくない参照型 2007/06/03 11:54 じゃんぬねっと

"はらたいら". とかタイプしたことのある人は大丈夫でしょうね。

# re: 参照型の例として最もふさわしくない参照型 2007/06/04 4:07 稍丼

文字列リテラルをどう扱うか?というのもありますからね。
実は,C++と違って,
char型の配列として扱っていないんですよね。
だから実は渡せなかったりして。

# re: 参照型の例として最もふさわしくない参照型 2007/06/04 9:16 虚蝉

前から「何か変だよなぁ?」と思ってた箇所でした。
参考になりました><;

# re: 参照型の例として最もふさわしくない参照型 2007/06/04 10:01 シャノン

> if ( s == "篠沢教授" ) と書けることのナゾ。

それは object.Equals をオーバーライドしていれば何も問題はないような。
他の参照型でもできますよね。

# re: 参照型の例として最もふさわしくない参照型 2007/06/04 10:02 シャノン

あれ、== で比較するときは Equals 呼ばれないんだっけ。
まぁいいや、operator == をオーバーロードしてれば同じこと。

# re: 参照型の例として最もふさわしくない参照型 2007/06/04 17:59 通り*

> s = "はらたいら"; は
> s = new string("はらたいら"); の略記なのよね。

この表現を見るときはいつも、少し語弊があるように感じています。
「あるいは」の方の表現はちゃんと把握できてないですが;、「むしろコッチが正解」なのかも。
new だと他のクラスと同じように常に新しいものが生成されるように見えますが、実際は専用の MSIL 命令で処理されますし、"文字列インターン" が機能しますし...

それと昔、if (s == "") って書くとインスタンスが不要にたくさん作成されるので
if (s == string.Empty) って書いた方がいいよって話がありましたが、それも間違ってますよね。ね??
メニューの [デバッグ]-[ウィンドウ]-[逆アセンブル] で処理効率を確認すると、どちらも同じですよね~。ね??

> stringは参照型の中では非常に特別な存在。
私も System.String は参照型の(優れた)異端児だと思っています。
それとも System.String のコンストラクタって、全部 extern のものですが、それ故に実装が単に特殊なだけと考えるベキなのでしょうかねぇ?

> しかしながら参照型の代表格としてstring以外に何がある?
System.Object ではないでしょうか!!

#前回の GC の時は、大変失礼しました~。今回も間違っているかも..;

# re: 参照型の例として最もふさわしくない参照型 2007/06/04 19:33 επιστημη

>「あるいは」の方の表現はちゃんと把握できてないですが;、「むしろコッチが正解」なのかも。

きっとそぉです ^^;

>> しかしながら参照型の代表格としてstring以外に何がある?
> System.Object ではないでしょうか!!

そらまそーなんですけどね、相手はビギナなんだから、いつも使ってるもんでないとイメージ湧かんはずなのね。

# re: 参照型の例として最もふさわしくない参照型 2007/06/05 3:07 やまだ

> きっとそぉです ^^;

あ、じゃその辺は Java VM と同じなんですね。
Java もたしかバイトコードから違ってたので。

> if ( s == "篠沢教授" ) と書けることのナゾ。

「"はらたいら" が二つあったらどうなるの?」ってな話がありましたが、同じリテラルは複数個存在しない、ってなルールを設ける(反則?)ならナゾでも何でもなくなってしまいますね。

> stringは参照型の中では非常に特別な存在。

リテラルかオブジェクトが違うだけ、と考えると、インスタンスの状態を持っていない分、説明がいらないので楽、という気もします。
で、s += "3000点" を実行すると、 動的に参照先が変わって、そこには新たに結合された文字列 "6000点" が入っている、と。string がなぜ値型でなく参照型なのか、という理由も説明できるのでは。
ついでに、ループの中でstringの+演算をしちゃいかん理由まで教えらてしまい、一挙両得かも。

でも、説明している最中に、stringのリテラルの話なのかStringオブジェクトの話なのか、自分でもわからなくなってくる罠。

#勉強会では、お茶ごちそーさまでした。……と、いいつつ、まだ大事にとってあります。

# re: 参照型の例として最もふさわしくない参照型 2007/06/05 6:49 επιστημη

えと、ここで大事なのは教える相手がピヨピヨのトーシロで、極力その内部について語らずに"概念"で価型と参照型とを説明せにゃならん、てのがあるんす。
その立場では"但し書き"の多いstringでは説明し辛いものがあるです。

# 茶はナマモノだからとっとと飲んじまってくださいまし。
# 少量の場合劣化が激しいんですわ。

# re: 参照型の例として最もふさわしくない参照型 2007/06/06 12:28 刈歩 菜良

おぉ、気付けば言いたいことがぜ~んぶすんでる。

あと、一点忘れちゃいけないのが、string型はリードオンリーってとこでしょうか?
そこが値型とは大きく違うとこでございます。

string str = "Hello";
str = str + " World!";
とかね。

「string型は特殊」というのはある意味正しいのですが、それを初心者に言うと余計混乱するので私は言いません。それに、string型を教えている段階ではnewすら教えてませんしね。

で、しれっとnewでクラスをインスタンス化する話にその後移行します(その後といっても直後ぢゃないよ。ifとかforとか制御構文教えた後)。

そこで「おや?」とおもうのはC++とかJava経験者だけだから(てか、彼らはstringの話の時点で「おや?」と思うはず)、初心者を指導するに当たってはモーマンタイなわけですよ。

string型の不思議に自ら気付いた段階で教えてあげればよいだけの話で、気付くレベルに到達してない人に無理から難しい話を言う必要はないと私は思います。

# re: 参照型の例として最もふさわしくない参照型 2007/06/06 15:34 επιστημη

そーかそーかそーだよねー、
stringで"あれ?"って感じるのは"わかってる連中"だよねー。

「言わぬが花」なんだな。

もうね、教えてメシ食ってるかるぼタンのお話ってば僕らスレッカラシにはもすぬごく新鮮ちゅーか為になるですホント。

# re: 参照型の例として最もふさわしくない参照型 2007/06/07 19:03 刈歩 菜良

スレッカラシなんて、とんでもないっすよぉ。

神くまーなεπιさんにそこまで絶賛されちゃうと、ほんと、恐縮です。
(^^ゞ

# re: 参照型の例として最もふさわしくない参照型 2007/06/20 19:41 RUN

STRINGが特殊っていうなら、INT型だって最近のは特殊だい

0ではないNULLが入る値型なんてだいっきらいだ~~
(まぁ、もう慣れたけど)

タイトル
名前
URL
コメント