DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#でMicrosoft.VisualBasic.StringsのReplaceメソッドを使おうと・・

分類:[.NET]

お世話になっております。JEEPです。

C#でVBのReplaceメソッドは使用できないのでしょうか?

string hoge = Microsoft.VisualBasic.Strings.Replace(a1,a2,a3);
とコードを書いてコンパイルすると
「引数を3個指定できる、メソッド’Replace’のオーバーロードはありません」
と叱られます。

.NET FrameworkのStringクラスのReplaceメソッドとカブっているが故のエラー
で、何らかの方法で回避できるのか、そもそも、C#でVBのReplaceメソッドを使お
うと考える自分が間違っているのか識者の方、アドバイス頂けないでしょうか?

よろしくお願い致します。
基本的には言語固有のものは使うべきでない。String構造体のメソッドを使うのが無難だ。いや、.NETのプログラミングだ。
■No6546に返信(ぽぽさんの記事)
> 基本的には言語固有のものは使うべきでない。String構造体のメソッドを使うのが無難だ。いや、.NETのプログラミングだ。

レスありがとうございます。よくよく調べましたら引数が3個のReplaceはVB
ランタイムの関数だったんですね・・。

無知ですいません。
解決済み!
■No6550に返信(JEEPさんの記事)
> レスありがとうございます。よくよく調べましたら引数が3個のReplaceはVB
> ランタイムの関数だったんですね・・。
>
> 無知ですいません。

既に解決されていらっしゃるようですが、
一応C#でVB.NETのReplace関数を利用する方法はあります。
私のサイトで申し訳ありませんが・・・
http://zoosir.hp.infoseek.co.jp/tips/string/string03.htm

第6引数まで省略しないで記述すれば、利用できるようです。
とはいえ、第4引数以降は省略できるはずなのですが。
VB.NETランタイムの関数をC#で使おうとしているからなのでしょうか。
VB.NETユーザの私には分かりませんでした。
> 既に解決されていらっしゃるようですが、
> 一応C#でVB.NETのReplace関数を利用する方法はあります。
> 私のサイトで申し訳ありませんが・・・
> http://zoosir.hp.infoseek.co.jp/tips/string/string03.htm

ありがたく参考にさせて頂きます(^^)
■No6551に返信(rakiさんの記事)
> 一応C#でVB.NETのReplace関数を利用する方法はあります。
> 私のサイトで申し訳ありませんが・・・
> http://zoosir.hp.infoseek.co.jp/tips/string/string03.htm
>
> 第6引数まで省略しないで記述すれば、利用できるようです。
> とはいえ、第4引数以降は省略できるはずなのですが。
> VB.NETランタイムの関数をC#で使おうとしているからなのでしょうか。
> VB.NETユーザの私には分かりませんでした。

VB.netにはOptionalキーワードがありますが、
C#には省略可能引数の考えがないためです。

Optionalキーワードを使った記述は1つのメソッドの記述のみで
Overloadと同等のことができるのでコンパクトにソースコードを書けて便利ですが、
C#ではサポートされていないので、各種言語で利用するメソッドであれば、
OptionalキーワードでなくOverloadで実装するとよいですね。
Microsoft.VisualBasic.Strings.ReplaceはVBで使うことを前提に
VB6との互換を取った実装になっているので、省略可能引数で実装されています。
そのため、C#から使う場合は、省略できません。

ぽぽさんwrote:
> 基本的には言語固有のものは使うべきでない。

私も基本的にはそうした方が好ましいと思っていますが、
ただ、.NET FrameworkのString.ReplaceもRegEx.Replaceも低機能なので、
これだけだと結構不便で、これらの足りない部分をVBのReplace関数が補完しています。
(これはこれであまり好ましくない仕様の部分がありますけど・・・)

> String構造体のメソッドを使うのが無難だ。

Stringクラスですね。これのReplaceメソッドでは、
事前にいろいろ細工をしないとVBのReplace関数の代わりとしては使えないので、
綺麗な実装にしたいなら、String.IndexOfメソッド等を利用して、
独自のReplaceメソッドを作るしかないでしょう。
■No6604に返信(よねKENさんの記事)
> VB.netにはOptionalキーワードがありますが、
> C#には省略可能引数の考えがないためです。
>
> Optionalキーワードを使った記述は1つのメソッドの記述のみで
> Overloadと同等のことができるのでコンパクトにソースコードを書けて便利ですが、
> C#ではサポートされていないので、各種言語で利用するメソッドであれば、
> OptionalキーワードでなくOverloadで実装するとよいですね。
> Microsoft.VisualBasic.Strings.ReplaceはVBで使うことを前提に
> VB6との互換を取った実装になっているので、省略可能引数で実装されています。
> そのため、C#から使う場合は、省略できません。

よねKENさんありがとうございます。
OptionalキーワードはC#ではサポートされないのですね。
疑問が解けました。
どうもありがとうございました。

> ただ、.NET FrameworkのString.ReplaceもRegEx.Replaceも低機能なので、
> これだけだと結構不便で、これらの足りない部分をVBのReplace関数が補完しています。
> (これはこれであまり好ましくない仕様の部分がありますけど・・・)

System.Text.StringBuilderクラスのReplaceを使ってはいかがでしょう?
ただ、開始位置を2文字目以降に指定したときは
VBのReplace関数と動作が違ってきますが。
Rakiさんwrote:
>>ただ、.NET FrameworkのString.ReplaceもRegEx.Replaceも低機能なので、
>>これだけだと結構不便で、これらの足りない部分をVBのReplace関数が補完しています。
>>(これはこれであまり好ましくない仕様の部分がありますけど・・・)
>
> System.Text.StringBuilderクラスのReplaceを使ってはいかがでしょう?

おぉ、こんなところにもReplaceメソッドがあったんですね。
StringBuilderを使うほどの文字列操作をするプログラムは
あまり書かないのでこれは見落としてました。ヘルプで確認しました。
情報提供ありがとうございます。

> ただ、開始位置を2文字目以降に指定したときは
> VBのReplace関数と動作が違ってきますが。

VBのReplace関数の開始位置指定した場合の動作の仕様が個人的に不便だなと思っていたので、
StringBuilder.Replaceがほぼその代わりになるかな?と一瞬思ったんですが、

ヘルプより引用:
> Overloads Public Function Replace(String, String, Integer, Integer) As StringBuilder

の仕様って微妙ですね。第四引数のcountの意味もまたVBのReplace関数とは違う意味なので、
VBのReplace関数の代用とはいかないようです。とほほ・・・
#ヘルプを読んだだけで試していません。

--
以下、余談。文字/文字列を処理するのReplaceメソッドですが、

System.String.Replace
System.Text.RegularExpressions.RegEx.Replace
System.Text.StringBuilder.Replace
Microsoft.VisualBasic.Strings.Replace

と4つもあります。性能や機能が違うのでしょうが、
どれも仕様が中途半端だし、なんとも節操のない感じがしますね。
■No6626に返信(よねKENさんの記事)
> 第四引数のcountの意味もまたVBのReplace関数とは違う意味なので、
> VBのReplace関数の代用とはいかないようです。とほほ・・・
> #ヘルプを読んだだけで試していません。

お察しの通り、StringBuilder.ReplaceとVBのReplace関数では第四引数の意味が違います。
StringBuilder.Replaceでは、第三引数で指定された位置の文字から
第四引数で指定された文字数分を対象として置換するのに対し、
VBのReplace関数ではご存知の通り、第三引数で指定された位置以降の
すべての文字列を対象にし、第四引数で指定された個数分置換するため、
以下の場合で動作が違います。
    ' StringBuilder クラスの Replace メソッドを使用する場合
    Dim strB1 As New System.Text.StringBuilder("abababab")
    ' 『*b*babab』が表示される
    Console.WriteLine(strB1.Replace("a", "*", 0, 4).ToString)

    ' Strings クラスの Replace メソッドを使用する場合
    ' 『*b*b*b*b』が表示される
    Console.WriteLine(Replace("abababab", "a", "*", 1, 4))


> 以下、余談。文字/文字列を処理するのReplaceメソッドですが、
> 
> System.String.Replace
> System.Text.RegularExpressions.RegEx.Replace
> System.Text.StringBuilder.Replace
> Microsoft.VisualBasic.Strings.Replace
> 
> と4つもあります。性能や機能が違うのでしょうが、
> どれも仕様が中途半端だし、なんとも節操のない感じがしますね。

RegEx.Replaceは正規表現を使った置換などでよく使われますね。
仕様が中途半端というのには私も賛成ですね。
結局は使い分けたり組み合わせたりしないといけないのか、
と少々残念に思います。

DOBON.NET | プログラミング道 | プログラミング掲示板