C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Tostring()メソッドとPars()メソッド


(過去ログ 127 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■75563 / inTopicNo.1)  Tostring()メソッドとParse()メソッド
  
□投稿者/ tonki (1回)-(2015/04/08(Wed) 13:13:24)

分類:[C#] 

2015/04/08(Wed) 14:53:42 編集(投稿者)

C#の勉強をはじめたばかりの者です。
入門書を読んでいて、何となくしっくりこなかったので、どなたかご教示いただけると幸いです。

Tostring()メソッドとPars()メソッドの使い方なのですが、それぞれデータを文字列型や整数型に変換するのに
下記のように記述すると思うのですが

変換後 = 変換前.Tostring();
変換後 = int.Parse(変換前);


以下のように記述するのは間違いなのは、そういうメソッドだからというものなのでしょうか?
何か、こちらの表記の方が引数の位置的にはすっきりするのですが…(^^ゞ
----
変換後 = Tostring(変換前);

初歩的なことで恐縮ですが、どうぞよろしくお願いします。
引用返信 編集キー/
■75564 / inTopicNo.2)  Re[1]: Tostring()メソッドとPars()メソッド
□投稿者/ 魔界の仮面弁士 (280回)-(2015/04/08(Wed) 13:45:46)
No75563 (tonki さん) に返信
> Tostring()メソッドと
 ToString()メソッド
   *

> Pars()メソッドの
 Parse()メソッド
     *

という細かい突っ込みはさておき。


ToString は、すべてのオブジェクトが持つメソッドで、
そのオブジェクトの情報を文字列で返すためのものです。
オブジェクトによっては、ToString の引数で
出力書式を調整できるものもあります。


Parse メソッドの方は、一部のオブジェクトにしか実装されていません。
パース(語句解析)の意味どおり、指定された文字列を解析して、
特定のデータ型に変換するためのものです。追加の引数指定で
解析パターンを変更したりできるものもあります。


> 以下のように記述するのは間違いなのは、そういうメソッドだからというものなのでしょうか?
> 何か、こちらの表記の方が引数の位置的にはすっきりするのですが…(^^ゞ
> ----
> 変換後 = Tostring(変換前);

その実装の場合、"Tostring" メソッドをどのクラスに実装するべきかが問題になってきます。

たとえば、新たに Tonki クラスを作成したとしましょう。
この場合、標準の ToString 実装パターンを用いて、
 var tonki = new Tonki(75563);
 string 変換後 = tonki.ToString();
とするのであれば、それをどのように文字列化するべきかは、
Tonki クラスの実装者が責を負えば済むわけです。


ところが、
 var tonki = new Tonki(75563);
 string 変換後 = Tostring(tonki);
とした場合、この Tostring メソッドの実装は、
Tonki クラスではなく、呼出元のクラスに実装せねばなりません。
「呼出元」のクラスを作成するのは、Tonki クラスの実装者とは別ですし、
別の場所から呼び出す場合にも都合が悪くなってしまうでしょう。

引用返信 編集キー/
■75565 / inTopicNo.3)  Re[1]: Tostring()メソッドとPars()メソッド
□投稿者/ 魔界の仮面弁士 (281回)-(2015/04/08(Wed) 13:53:08)
No75563 (tonki さん) に返信
> 何か、こちらの表記の方が引数の位置的にはすっきりするのですが…(^^ゞ
> 変換後 = Tostring(変換前);

上記に近いのは、
 string 変換後 = String.Format("{0}", 変換前);
とか、
 string 変換後 = BitConverter.ToString(変換前);
とかだと思います。

しかし今回は、『何某.変換メソッド(引数)』ではなく、
『変換メソッド(引数)』で記述したいということなのでしょうか?

もしそれがどうしても必要なのであれば、C# ではなく VB を選択してみては如何でしょう。
VB であれば、Module にメソッドを実装することで、そういう記法にも対応できます。
引用返信 編集キー/
■75566 / inTopicNo.4)  Re[1]: Tostring()メソッドとPars()メソッド
□投稿者/ 774RR (254回)-(2015/04/08(Wed) 14:23:12)
> 変換後 = Tostring(変換前);
と書くことができるためには ToString はグローバル関数である必然がある。

グローバル関数な ToString があるとしたら、そのグローバルな ToString の意図しているところは
「今のところ既知なクラスを取り扱うことができる」すなわち
「新しいクラスを ToString したかったら、グローバルな ToString のオーバーロードを提供しなければならない」
i.e; 変更がシステム全体におよび、影響度が大きい。

メンバ関数な ToString があるってことは
「新たなクラスを作ったら、そのクラスは自分自身を ToString する実装を提供しなければならない」
「このクラスにおいて ToString をオーバーライドする必要がある」
i.e; 変更がクラスに閉じていて影響が小さい。

俺が思うに、オブジェクト指向というのは「自分ができることは自分自身が知っている」ということ。
自分自身が知っている=自分自身のメンバ関数がある、ってこと。
もう少しオブジェクト指向に慣れ親しんでくると「ToString がメンバであること」が自然に思えるようになるよ。

引用返信 編集キー/
■75567 / inTopicNo.5)  Re[2]: Tostring()メソッドとPars()メソッド
□投稿者/ tonki (2回)-(2015/04/08(Wed) 14:34:11)
魔界の仮面弁士さま

さっそくのご回答、ありがとうございました <(_ _)>


最初からおはずかしいです(^^; ご指摘ありがとうございます。

>> Pars()メソッドの
> Parse()メソッド
>  *
>
>という細かい突っ込みはさておき。


なるほど、下記いただいた丁寧なご回答でだいぶ理解が進みました!
ありがとうございました。

オブジェクト指向言語も全くはじめてですが、何とかC#を習得していければと思います。
今後とも、よろしくお願いいたします。
本当にありがとうございました。


> その実装の場合、"Tostring" メソッドをどのクラスに実装するべきかが問題になってきます。
>
> たとえば、新たに Tonki クラスを作成したとしましょう。
> この場合、標準の ToString 実装パターンを用いて、
>  var tonki = new Tonki(75563);
>  string 変換後 = tonki.ToString();
> とするのであれば、それをどのように文字列化するべきかは、
> Tonki クラスの実装者が責を負えば済むわけです。
>
>
> ところが、
>  var tonki = new Tonki(75563);
>  string 変換後 = Tostring(tonki);
> とした場合、この Tostring メソッドの実装は、
> Tonki クラスではなく、呼出元のクラスに実装せねばなりません。
> 「呼出元」のクラスを作成するのは、Tonki クラスの実装者とは別ですし、
> 別の場所から呼び出す場合にも都合が悪くなってしまうでしょう。

解決済み
引用返信 編集キー/
■75568 / inTopicNo.6)  Re[2]: Tostring()メソッドとPars()メソッド
□投稿者/ tonki (3回)-(2015/04/08(Wed) 14:41:41)
> しかし今回は、『何某.変換メソッド(引数)』ではなく、
> 『変換メソッド(引数)』で記述したいということなのでしょうか?
>
> もしそれがどうしても必要なのであれば、C# ではなく VB を選択してみては如何でしょう。
> VB であれば、Module にメソッドを実装することで、そういう記法にも対応できます。

いえ、決してそういうこだわりはないです、、、(^^ゞ
でも、VBだとそういう記法にも対応できるのですね、勉強になりました。
いろいろありがとうございました。


解決済み
引用返信 編集キー/
■75569 / inTopicNo.7)  Re[2]: Tostring()メソッドとPars()メソッド
□投稿者/ tonki (4回)-(2015/04/08(Wed) 14:47:14)
774RRさま

さっそくありがとうございます!
なるほど、そういうことなんですね。納得です。

>>変換後 = Tostring(変換前);
> と書くことができるためには ToString はグローバル関数である必然がある。
>
> グローバル関数な ToString があるとしたら、そのグローバルな ToString の意図しているところは
> 「今のところ既知なクラスを取り扱うことができる」すなわち
> 「新しいクラスを ToString したかったら、グローバルな ToString のオーバーロードを提供しなければならない」
> i.e; 変更がシステム全体におよび、影響度が大きい。
>
> メンバ関数な ToString があるってことは
> 「新たなクラスを作ったら、そのクラスは自分自身を ToString する実装を提供しなければならない」
> 「このクラスにおいて ToString をオーバーライドする必要がある」
> i.e; 変更がクラスに閉じていて影響が小さい。

如何せん、いままでPerlをほんの少しかじったことがある程度なので、
頑張って、オブジェクト指向に慣れ親しんでいけるようにしたいと思います。
本当に、ありがとうございました!

> 俺が思うに、オブジェクト指向というのは「自分ができることは自分自身が知っている」ということ。
> 自分自身が知っている=自分自身のメンバ関数がある、ってこと。
> もう少しオブジェクト指向に慣れ親しんでくると「ToString がメンバであること」が自然に思えるようになるよ。
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -