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

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

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

Re[1]: string.Formatなどのパラメータに関して


(過去ログ 118 を表示中)

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

■69276 / inTopicNo.1)  string.Formatなどのパラメータに関して
  
□投稿者/ fullhappy (1回)-(2013/12/13(Fri) 17:58:36)

分類:[C#] 

vs2010 c#4.0です。

string.FormatやStringBuilder.AppendFormatのようなメソッドを
作成しようと思っているのですが
(string format, params object[] args)を作成し、
(string format, object arg0)や
(string format, object arg0, object arg1)や
(string format, object arg0, object arg1, object arg2)は
いらないかなと思っています。

これらは何の為にあるか、わかる方教えてください。

1.わかりやすくする為
2.速度の為
3.アッパーコンパチの為
4.その他

よろしくお願いします。
引用返信 編集キー/
■69280 / inTopicNo.2)  Re[1]: string.Formatなどのパラメータに関して
□投稿者/ WebSurfer (124回)-(2013/12/13(Fri) 22:26:19)
No69276 (fullhappy さん) に返信
> これらは何の為にあるか、わかる方教えてください。

いらなければ使わなければすむことではないのですか? 

何故そのような質問をするのでしょう?
引用返信 編集キー/
■69281 / inTopicNo.3)  Re[2]: string.Formatなどのパラメータ
□投稿者/ Azulean (250回)-(2013/12/13(Fri) 23:57:09)
2013/12/15(Sun) 08:31:10 編集(投稿者)

不要ならば作らなければよいというのは私も同感です。


string.Format の現状はおそらく、歴史的な理由でしょう。

(ここから削除)
params キーワードが登場したのが C# 2.0 らしいので、それ以前は object の配列を渡すということになりますが、不便なので 3 個までは引数で渡せる形を用意したのでしょう。
params キーワード導入以降は不要になったはずですが、
(ここまで削除。魔界の仮面弁士さんの指摘を参照のこと)

今も過去の名残として残っていると予想されます。

さて、これが正しいのか、間違っているのかわかりませんが、そんなことは割とどうでもよくて、自分たちが使いやすいメソッドを作ればよいと思いますよ。


※後のコメントの指摘を受けて、部分削除を表明しています。
引用返信 編集キー/
■69283 / inTopicNo.4)  Re[2]: string.Formatなどのパラメータに関して
□投稿者/ yukihiro (1回)-(2013/12/14(Sat) 10:17:28)
No69280 (WebSurfer さん) に返信
> ■No69276 (fullhappy さん) に返信
>>これらは何の為にあるか、わかる方教えてください。
>
> いらなければ使わなければすむことではないのですか? 
>
> 何故そのような質問をするのでしょう?

いらないかどうかわからないから質問しているのだと思われますが。

何か必要な理由があって存在しているのであれば、
自分が作るライブラリも同じようにしたほうがいいのかな、と
思うのはまともな開発者なら当然ではないでしょうか。

第3者から見てもこういった歴史的な経緯を知ることは
参考になると思うし、興味のある話題です。

質問に対する回答としては、私のさほど根拠の無い推測では
パフォーマンスへの配慮じゃないかなぁと思ってます。

引用返信 編集キー/
■69284 / inTopicNo.5)  Re[3]: string.Formatなどのパラメータに関して
□投稿者/ yukihiro (2回)-(2013/12/14(Sat) 11:28:45)
Stack Overflowにも同じ質問がありました。

http://stackoverflow.com/questions/1252432/why-does-string-format-come-in-several-flavors

回答者のRuben氏によれば
Format(string, object)やFormat(string, object, object)などは
内部でFormat(IFormatProvider, string, object[])を呼び出しており、
パフォーマンスの向上はなさそうです。
params引数のような機能をサポートしない言語に対する利便性じゃないか
というのが彼の意見のようで、なるほどなと思いました。

引用返信 編集キー/
■69285 / inTopicNo.6)  Re[3]: string.Formatなどのパラメータに関して
□投稿者/ WebSurfer (125回)-(2013/12/14(Sat) 12:33:45)
No69283 (yukihiro さん) に返信
> ■No69280 (WebSurfer さん) に返信
>>■No69276 (fullhappy さん) に返信
> >>これらは何の為にあるか、わかる方教えてください。
>>
>>いらなければ使わなければすむことではないのですか? 
>>
>>何故そのような質問をするのでしょう?
>
> いらないかどうかわからないから質問しているのだと思われますが。
>
> 何か必要な理由があって存在しているのであれば、
> 自分が作るライブラリも同じようにしたほうがいいのかな、と
> 思うのはまともな開発者なら当然ではないでしょうか。

そうでしょうか? 

質問者さんは「いらないかなと思っています」と言っています。であれば、自分の意見
は「まともな開発者ならいらないものは作らない」です。

使う予定のないオーバーライドを作るのは時間の無駄・・・だけならまだしも、ひょっ
としたらバグの種を撒いているようなもののかもしれません。以下のようなこともあり
ます。

Object 型と列挙型引数のオーバーロード
http://surferonwww.info/BlogEngine/post/2013/08/10/methods-overloaded-using-object-type-and-enumeration-type-arguments.aspx

> 第3者から見てもこういった歴史的な経緯を知ることは
> 参考になると思うし、興味のある話題です。

であれば、質問者さんはそのように書くべきです。回答者が質問者さんの意図を推測し
て答えを書くのはできれば避けるべきと自分は思います(推測が違っていて、自分の回
答が混乱の元になっただけということもありましたので)。

なので、自分は「何故そのような質問をするのでしょう?」と聞きました。

引用返信 編集キー/
■69288 / inTopicNo.7)  Re[4]: string.Formatなどのパラメータに関して
□投稿者/ yukihiro (3回)-(2013/12/14(Sat) 13:36:37)
No69285 (WebSurfer さん) に返信
そうですね。
いらないものを作らないのは当然だと私も思います。

質問を読めば「いらないかどうか判断しかねている」
という意図は明らかだと私は思ったので
あのように書きました。

あえて反論させていただくとすれば、
御回答の裏にそういった意図があるのであれば
「であれば、回答者さんはそのように書くべきです。」
でしょうか。

引用返信 編集キー/
■69290 / inTopicNo.8)  Re[2]: string.Formatなどのパラメータに関して
□投稿者/ fullhappy (4回)-(2013/12/14(Sat) 13:59:53)
No69280 (WebSurfer さん) に返信
> ■No69276 (fullhappy さん) に返信
>>これらは何の為にあるか、わかる方教えてください。
>
> いらなければ使わなければすむことではないのですか? 
>
> 何故そのような質問をするのでしょう?


yukihiroさんの書かれているとおりです。

いらないかどうかわからないので質問させていただきました。

コンパイラの推論かなにかの理由で必要な呼び出し定義であれば
作成するメソッドにも同様な定義を作成しようと思っていました。

また、必要がなくても、かなりの速度向上が見込めるのであれば
追加しようと思っていましたが、速度向上はなさそうですね。

引用返信 編集キー/
■69292 / inTopicNo.9)  Re[5]: string.Formatなどのパラメータに関して
□投稿者/ WebSurfer (129回)-(2013/12/14(Sat) 14:28:25)
No69288 (yukihiro さん) に返信
> あえて反論させていただくとすれば、
> 御回答の裏にそういった意図があるのであれば
> 「であれば、回答者さんはそのように書くべきです。」
> でしょうか。

誤解を与えてしまったようですが、自分が「質問者さんはそのように書くべき」と書いた
意味は、回答者に質問の行間まで正しく推察してもらうことを期待しないで、最初の質問
に行間の意味も明記してほしいということです。

69290 に後出しで、いろいろ書かれていますが、そういうことは最初の質問に書けたはず
です。

さらに、もっと方針に影響があることとして、汎用的なライブラリを作っているのか、あ
る特定のソース内だけで使うヘルパメソッドを作っているのか、も書いてないです。

引用返信 編集キー/
■69293 / inTopicNo.10)  Re[6]: string.Formatなどのパラメータに関して
□投稿者/ fullhappy (5回)-(2013/12/14(Sat) 15:19:24)
No69292 (WebSurfer さん) に返信
>
> 誤解を与えてしまったようですが、自分が「質問者さんはそのように書くべき」と書いた
> 意味は、回答者に質問の行間まで正しく推察してもらうことを期待しないで、最初の質問
> に行間の意味も明記してほしいということです。
>
> 69290 に後出しで、いろいろ書かれていますが、そういうことは最初の質問に書けたはず
> です。
>
> さらに、もっと方針に影響があることとして、汎用的なライブラリを作っているのか、あ
> る特定のソース内だけで使うヘルパメソッドを作っているのか、も書いてないです。
>
ご指摘ごもっともだと思います。
質問って難しいですね。
質問の理由を聞かれたので背景をかいただけで
質問としては、string.Formatは基本的なメソッドなので
誰か知ってるんじゃないかなと安易に考え、
ただ単に「わかる方教えてください。」になりました。

改めまして、
わかる方教えてください。

引用返信 編集キー/
■69295 / inTopicNo.11)  Re[7]: string.Formatなどのパラメータに関して
□投稿者/ WebSurfer (130回)-(2013/12/14(Sat) 16:22:17)
No69293 (fullhappy さん) に返信
> 改めまして、
> わかる方教えてください。
>

(string format, params object[] args) 以外は使わないというところから議論を
スタートするという前提でいいのですよね?

では、その前提で、改めてご自分が知りたいことを整理して、掲示板に書いてある
こと以外何も知りえない回答者に、質問者さんの知りたいことが質問文だけ読めば
理解できるように書いていただくようお願いします。

もし、(string format, params object[] args) が本当に適切かどうか、他に、本
質的に質問者さんのやりたいことを実現するために、より良い実装があるのではな
いかというところまで議論が遡るのであれば、そのあたり(本質的に質問者さんの
やりたいこと)も詳しく書いてください。
引用返信 編集キー/
■69299 / inTopicNo.12)  Re[3]: string.Formatなどのパラメータに関して
□投稿者/ 魔界の仮面弁士 (464回)-(2013/12/14(Sat) 18:00:03)
2013/12/14(Sat) 18:03:09 編集(投稿者)

マルチレス。 Azulean さんの No69281 に繋ぎます。


No69276 (fullhappy さん) に返信
> vs2010 c#4.0です。
> (string format, params object[] args)を作成し、

自分も、(string, params object[]) で十分だと思います。


No69281 (Azulean さん) に返信
> string.Format の現状はおそらく、歴史的な理由でしょう。
私も、歴史的な理由という認識でいます。
Console.WriteLine や StringBuilder.AppendFormat もそうですね。



> それ以前は object の配列を渡すということになりますが、不便なので 3 個まで
そうですね。ParamArrayAttribute はもともと「属性」に過ぎないため、
それを認識しないコンパイラであったとしても、(string, params object[]) を
(string, object[]) とみなして呼び出すことが可能であるはずです。

しかし、いちいち配列として渡すのは不便なので、容易に呼び出せるように
用意されていた……という説。ここまでは私も同じ意見です。


> params キーワードが登場したのが C# 2.0 らしいので、
これについては、私と認識が違っています。

まず、params は .NET 1.1 時代にはすでにあったように記憶しているためです。
.NET 1.0 については、当時の環境が手元にないため、とりあえず『C# 言語仕様』の
*.doc/*.docx をあたってみたのですが、パラメータ配列(params)について検索すると、
 v1.0 → 1.3「Variables and parameter」
 v1.2 → 1.6.5.1「Parameters(パラメータ)」
 v2.0 → 1.6.5.1「Parameters(パラメータ)」
 v3.0 → 1.6.6.1「Parameters(パラメータ)」
 v4.0 → 1.6.6.1「Parameters(パラメーター)」
 v5.0 → 1.6.6.1「Parameters(パラメーター)」
の項およびそれ以降に、params に関する記載を見ることができました。

肝心の 日本語版 1.0 は手元に無かったのですが、少なくとも英語版1.0 では
既に params に関して言及されていますので、元々あったものと思います。

もちろん、後発となる JIS X 3015:2008 にも掲載されています(8.3「変数および仮引数」)。
JIS 規格においては、(パラメーター配列ではなく)仮引数配列と呼ばれるようですけれどね。



> params キーワード導入以降は不要になったはずですが、
原因は、今は亡き J# では無いでしょうか。(J# は専門外なのでうろ覚えですが)

Java 陣営では、J2SE5.0 で可変引数(Varargs) がサポートされたようですが、
J# は、J# 2.0 Second Edition にさえ、params 相当の機能は無かった気がします。

…といっても、私は Java も J# も専門外なため未確認。

どこかに J# に詳しい人居ませんかね。


> 今も過去の名残として残っていると予想されます。
ちなみに Console.WriteLine あたりはさらにややこしく、
パラメーター配列(VB では ParamArray、C# では params )だけでなく、
可変長パラメーター(いわゆる vararg、C# では __arglist )を用いた
CLS 非準拠のオーバーロードがあったりします。

で、VB は vararg 付きのメソッドを認識できないため、C# と VB の入力ヒントを
見比べてみると、Console.WriteLine のオーバーロード数が違って見えてしまうという…。
(C# では第19個目のオーバーロードが見えますが、VB では 18 個しか見えません)

こちらは、C++ 向けのオーバーロードだと思いますが、
私は Managed C++ も C++/CLI も専門外なため、本当にそうなのかは不明。

どこかに C++ に詳しい人居ませんかね。
引用返信 編集キー/
■69300 / inTopicNo.13)  Re[4]: string.Formatなどのパラメータ
□投稿者/ Azulean (251回)-(2013/12/14(Sat) 18:56:24)
2013/12/14(Sat) 18:56:54 編集(投稿者)

No69299 (魔界の仮面弁士 さん) に返信
> 肝心の 日本語版 1.0 は手元に無かったのですが、少なくとも英語版1.0 では
> 既に params に関して言及されていますので、元々あったものと思います。

すみません。調査が足りなかったようです。
結果として大嘘だったようで、ご指摘・フォローありがとうございます。


> こちらは、C++ 向けのオーバーロードだと思いますが、
> 私は Managed C++ も C++/CLI も専門外なため、本当にそうなのかは不明。

C++/CLI は ... を書けば params 相当に解釈されるので、少なくとも C++/CLI 世代(.NET 2.0/VS2005)からは params 路線に乗れるんじゃないかなと思います。
Managed C++ 世代は経験がないので何ともです。
(該当のオーバーロードについての MSDN のページを見ると、VC 向けとは書いていますね)
引用返信 編集キー/
■69306 / inTopicNo.14)  Re[1]: string.Formatなどのパラメータに関して
□投稿者/ fullhappy (6回)-(2013/12/16(Mon) 09:32:05)
みなさん、ありがとうございました。

特に(string format, params object[] args)だけでは駄目だとか後で困るとかの意見が無かったので、これだけでいきます。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -