- - PR -
Console.WriteLineについて
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2002-09-18 12:32
川俣先生の連載を拝見していてふと疑問に思ったことがあります。
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_005/cs2_005_01.html の 5-2 整数型からメソッドを呼ぶ にて、 最後に >> 数値としての値は「123」だが、これを文字列に変換した結果も、123となっている。間違いなく整数型変数に対して、ToString()が機能していることがわかるだろう。 と書かれてありますが、そもそもConsole.WriteLineはint型の引数については内部的にToStringメソッドを呼び出して変換しているのではないかなと思いました。 とすると、List5-1の >> 12: Console.WriteLine( "i={0}, s={1}", i, s ); iは内部的にToStringメソッドで変換されるから、sと同じ値になるのは当たり前ではないかと考えました(連載の主旨とはずれている疑問ですが)。 それで調べたのですが、int型の引数一つの場合は、ToStringメソッドを呼び出しているようです。 複数の引数で呼び出された場合は Console.WriteLine(string, object[]) が、適合するようですが、object[]についてToStringメソッドを呼ぶのかどうかについての情報が見つかりませんでした。 多分ToStringメソッドを呼んでいるんだと思いますが、どこかに正確な情報がありましたらご教授ください。 | ||||||||||||||||
|
投稿日時: 2002-09-18 13:33
前半の、最終的に同じ変換機能が動作しているのだから同じ値になるのは当然ではないか?という意見はイエスです。
後半は、あまりクラスライブラリの深いところは良く分からないのですが。リファレンスのString.Formatメソッドに書いてあるこれではないでしょうか?
| ||||||||||||||||
|
投稿日時: 2002-09-18 14:19
ありがとうございます。
するとやはり Console.WriteLine( "i={0}, s={1}", i, s ); は Console.WriteLine(string, object[]); で呼ばれ、内部的にToStringメソッドが呼び出されるんですね。 しかし、そうなると、iは、内部的にToStringメソッドで変換される前に、object[]に格納する時点でボクシングされてしまうということでしょうか? そろそろ逆アセンブルしろと言われそうなので、試してみました。
の両者を逆アセンブルして比較してみました。 違いが出た箇所だけ載せてみます。
見てのとおり、ToStringしていない方はボクシングしているようですね。 これは…微妙に速度などに差が?(^_^; 明示的にToStringメソッドを呼んだ方が良かったり(あるいはその逆)するんでしょうか? | ||||||||||||||||
|
投稿日時: 2002-09-19 10:55
整数をToString()してstring型で渡す場合と、整数をobject型で渡して渡された先でToString()する場合の速度を比較するプログラムをちょこっと作ってみました。 この結果がどこまで意味があるかは保証できませんが、差はあるようです。
結果(デバッグビルド、Pentium4/1.5GHz): 00:00:57.8749513 00:01:05.7364908 |
1