web-dev-qa-db-ja.com

Len()関数とString.Lengthプロパティ。どちらを選ぶ?

私はVB6からVB.Net(VS 2010)に移行しており、後者については広範ではなく基本的な理解を持っています。私は明らかにかなりのコードを持っています...過去のバージョンのVSのアップグレードウィザードがコードをコメントアウトして言ったかもしれないことを考えると、「ポート」がより適切であるときに「アップグレード」という言葉を使用することを躊躇します「ねえ、最初からやり直してみませんか?」

私が持ってきた1つのプロシージャでは、Len()関数を使用して文字列変数の長さを決定しました。これはVB.Netでも機能しますが(実際にはStrings.Lenメソッドの呼び出しだと思いますが)、他の方法は、変数の.Lengthプロパティをクエリすることです。

問題は、どちらを使用するのか、そしてその理由です。関連するMSDNページを調べましたが、メソッド/プロパティが存在することがわかりました。特に多数の呼び出しのループが含まれる可能性がある場合、パフォーマンスの問題については何も言われていません。

それで、私の質問は、あるアプローチを他のアプローチよりも使用することのテストされ確認された利点を誰かが知っているかどうか、またはそれが単に個人的な好みの問題であるかどうかです。スタックオーバーフローのガイドラインを考えると、特定の答えがあるかどうかを確認することに興味があるのはこの1つの問題だけですが、進行中に遭遇する可能性のある同様の状況に関するポインタもありがたいです。

14
Alan K

VB.NETを使用しているため、StringsNothingにすることができ、明示的にチェックしない限り、ほとんどのVBメソッド(Lenを含む)はString.Emptyと同じように扱います)。 ""

Reflectorを使用すると、Lenがnullチェックとして実装され、Nothingに対して0を返し、それ以外の場合は.Lengthを返すことがわかります。そうすると、JITterは呼び出しをインライン化する可能性があります。

したがって、他のVBメソッドを使用している場合は、LenStringでないことがわかっているか、どこでもNothingを確認しない限り、Nothingも使用することをお勧めします。

18
Mark Hurd

だから this によると:

もう1つの古典的なBASIC関数であるLenは、文字列の長さを返します。 System.Stringには、同じ情報を提供するLengthプロパティがあります。一方はもう一方よりも優れていますか?

パフォーマンス面では、これら2つの関数は、1000回の反復でほとんど違いがありません。この場合、どちらか一方を優先する理由はないようです。さらに、機能的な違いはありません。 .NET文字列をオブジェクトとして考えることを奨励するため、VB関数ではなく、プロパティ値を使用することに少し偏っています。ただし、基本的に、これは個人的な好みにすぎません。

あなたが彼らの言葉を信頼するなら、あなたの答えがあります。それ以外の場合は、テストをコーディングして反復することで、最終的な答えが得られるはずです。

6
Andy Merrick

Lenメソッドは、古いVB6(およびそれ以前)の非.NETコードとの下位互換性のために提供されています。それを使用することに技術的に問題はありません。それはうまくいくでしょう、そしてそれでも同様です。ただし、可能な限り、新しい.NETの方法を使用することをお勧めします。ただし、「。NETの考え方」をさらに理解する以外に、String.Lengthを使用することの唯一の具体的な利点は、将来、コードを他の.NET言語に簡単に移植できることです。

2
Steven Doggart

@Andrewの投稿に加えて、Len()は Visual Basicランタイムライブラリ の文字列関数です。ここで、Lengthは.netフレームワークのSystem.Stringクラスのプロパティです。 API。

2
adatapost

最近、Len()関数を使用していた古いVB.Netコードで問題が発生しました。プロジェクトを、古いVB.net dllファイルを参照していてLen()関数を使用していたCoreにアップグレードしました。実行時の互換性エラーが発生しました-メソッドが見つかりません: 'Int32 Microsoft.VisualBasic.Strings.Len(System.String)'

Coreが非推奨にした古い関数をすべて変更する必要があります。したがって、Steven Doggartが提案したように、Len()ではなくString.Lengthを使用します。

0
Phantom