質問

効率のためのコンパイラとの確認を行うための文字列は空白?

  1. かどうかの確認文字列の長さ==0
  2. かどうかの確認を文字列が空の(strVar=="")

また、その答えに依存しますか?

役に立ちましたか?

解決

りによって違いますので、それぞれの言語、文字列貯蔵によって異なります。

  • パスカル-タイプの文字列: Length = 0.
  • Cスタイルの文字列: [0] == 0.
  • .純益: .IsNullOrEmpty.

など。

他のヒント

言語を使用するC-スタイル(null終了文字列との比較を "" になります。ことになるO(1)操作は、長さのCスタイルの文字列は、O(n)

言語る店長さの文字列オブジェクト(C#、Java、...)の長さでもO(1)です。この場合、直接チェックの長さはがれることを回避することができ、架構築の新しい空の文字列が返されます。

ます。純益:

string.IsNullOrEmpty( nystr );

文字列はnullを取ることができますので、.長時捨てNullReferenceException

言語を使用するC-スタイル(null終了文字列を比較するには""がなくなります

合わせなければならないという、されておく方が良いかもしれないければ最初のcharの文字列'\0':

char *mystring;
/* do something with the string */
if ((mystring != NULL) && (mystring[0] == '\0')) {
    /* the string is empty */
}

Perlがオプションの文字列が定義されていません。このメセニー-グループのコンサートからのNULLポインタがCの場合のみでは得られないときには、いくつかの断層のセグメンテーションアクセスするために、未定義の文字列になります。

Java1.6の文字列のクラスの新しい方法 isEmpty

また、ジャカルタ-コモンズの図書館の isBlank 方法。空白として定義される文字列のみを含む白文字。

仮にあなたの質問です。純益:

したい場合は認証文字列に対しnullityとしても利用IsNullOrEmptyだいている文字列がnullでない場合、例えば時チェックテキストボックス.テキスト等 使用しないIsNullOrEmpty、そのご質問です。
なので私の意見を文字列になります。長さは丈夫より文字列と比較しました。

私はイベント試験でも試験を行スレッドセーフで、C#、同じ結果):

Module Module1
  Sub Main()
    Dim myString = ""


    Dim a, b, c, d As Long

    Console.WriteLine("Way 1...")

    a = Now.Ticks
    For index = 0 To 10000000
      Dim isEmpty = myString = ""
    Next
    b = Now.Ticks

    Console.WriteLine("Way 2...")

    c = Now.Ticks
    For index = 0 To 10000000
      Dim isEmpty = myString.Length = 0
    Next
    d = Now.Ticks

    Dim way1 = b - a, way2 = d - c

    Console.WriteLine("way 1 took {0} ticks", way1)
    Console.WriteLine("way 2 took {0} ticks", way2)
    Console.WriteLine("way 1 took {0} ticks more than way 2", way1 - way2)
    Console.Read()
  End Sub
End Module

結果:

Way 1...
Way 2...
way 1 took 624001 ticks
way 2 took 468001 ticks
way 1 took 156000 ticks more than way 2

この比較かにより文字列を返します。

String.IsNullOrEmpty() だけます。net framework2.0以上。純1/1.1、を使用する傾向がある:

if (inputString == null || inputString == String.Empty)
{
    // String is null or empty, do something clever here. Or just expload.
}

使ってい文字列になります。空に対して""が""をオブジェクトは文字列です。空ィ-さんそしてその小さながまだない作物があまりないと思いますが必要。()

実は、IMOの決定は、IsNullOrEmpty()メソッドは文字列のクラスです。

http://msdn.microsoft.com/en-us/library/system.string.isnullorempty.

更新:私は想定しています。Net、その他の言語の本がなければならないと思います。

この場合、直接チェックの長さはがれることを回避することができ、架構築の新しい空の文字列が返されます。

@DerekPark:それは常にtrueです。""は文字列リテラルでは、Javaので、ほぼ確実に見つけることのできる房.

C文字列

if (s[0] == 0)

より早く、よりいずれか

if (strlen(s) == 0)

または

if (strcmp(s, "") == 0)

できなオーバーヘッドの機能ます。

@Nathan

合わせなければならないという、されておく方が良いかもしれないければ最初のcharの文字列'\0':

私のほうが残って呼び出し strcmp() 空の文字列を直接チェックの最初の文字の文字列の両方をO(1)です。基本的にだけで支払うための余分な機能通話なのですが、ここでは安いです。の場合 本当に 必要最高速度も間違って直接最初の文字を0と比較しました。

正直、私がよく利用す strlen() == 0, っ ない 書プログラムがこのた実際に測定可能なパフォーマンスの問題ではないかと思うのでの最も読めの表現方法はチェックを外してください。

まにわからない言語で教えてくれます。

しかし、を選択することをお勧めの技術の意味でのプログラマのもと、を維持します。

されています。書きる機能を明示的には何をしたいなど

#define IS_EMPTY(s) ((s)[0]==0)

またはに匹敵します。今ことは疑う余地がありませんでがんチェックしている。

後で読むこのスレッドを行っており少し実験では、静寂の中で、特定の周波数の二つの異なる、興味深い知見を得た。

を考えます。

strInstallString    "1" string

上記のコピーから地元の人々の窓Visual Studioのアンインストールします。同じ値には次の三つの例です。

if(strInstallString=="")===if(strInstallString==文字列になります。空)

以下のコードで表示され、分解-ウィンドウVisual Studio2013/日本語版デバッガのためにこれらを根本的に同じである。

if ( strInstallString == "" )
003126FB  mov         edx,dword ptr ds:[31B2184h]
00312701  mov         ecx,dword ptr [ebp-50h]
00312704  call        59DEC0B0            ; On return, EAX = 0x00000000.
00312709  mov         dword ptr [ebp-9Ch],eax
0031270F  cmp         dword ptr [ebp-9Ch],0
00312716  sete        al
00312719  movzx       eax,al
0031271C  mov         dword ptr [ebp-64h],eax
0031271F  cmp         dword ptr [ebp-64h],0
00312723  jne         00312750

if ( strInstallString == string.Empty )
00452443  mov         edx,dword ptr ds:[3282184h]
00452449  mov         ecx,dword ptr [ebp-50h]
0045244C  call        59DEC0B0        ; On return, EAX = 0x00000000.
00452451  mov         dword ptr [ebp-9Ch],eax
00452457  cmp         dword ptr [ebp-9Ch],0
0045245E  sete        al
00452461  movzx       eax,al
00452464  mov         dword ptr [ebp-64h],eax
00452467  cmp         dword ptr [ebp-64h],0
0045246B  jne         00452498

if(strInstallString==文字列になります。空い大きく異なる

if ( strInstallString.Length == 0 )
003E284B  mov         ecx,dword ptr [ebp-50h]
003E284E  cmp         dword ptr [ecx],ecx
003E2850  call        5ACBC87E        ; On return, EAX = 0x00000001.
003E2855  mov         dword ptr [ebp-9Ch],eax
003E285B  cmp         dword ptr [ebp-9Ch],0
003E2862  setne       al
003E2865  movzx       eax,al
003E2868  mov         dword ptr [ebp-64h],eax
003E286B  cmp         dword ptr [ebp-64h],0
003E286F  jne         003E289C

上記のマシンコード一覧、発生するNGENモジュール。NET Frameworkバージョン4.5を描いてい、以下の結論を得た。

  1. 試験等に対する空の文字列リテラルの静的な文字列になります。空のプロパティのシステム。stringクラスは、すべての実践的な目的に同様である。の唯一の違いは二つのコードスニペットのソースである最初の移動の指導、両方ともオフセットからの相対ds示唆すると考えられることの両方を参照して焼き-中定数.

  2. 試験等に対する空の文字列としてのいずれかの文字または文字列です。空のプロパティから、二つの引数を取る関数呼び出しを示す 不平等 返ゼロになります。私はこの結論は他の試験を行っていましたカ月前に、私が自分のコードをサポ分割を行います。すべての場合は、電話を必要とした二以上の引数の第一引数に登録ECX、第二に登録EDX.思うその後の引数が渡されます。しかし、通話セットアップの見たように__fastcallよ__stdcall.同様に、予定の戻り値は常にきていた登録EAXである。

  3. 試験の長さの文字列を設定一引数で関数呼び出しは、1を返します(登録EAX)が含まれる文字列の長さが試されているわけです。

  4. そのすぐ見えるマシンコードとほぼ同じで、それを想像できますよう、より良い性能文字列の平等のスティング長さによる報告 光沢のある この引数に関数を実行するとの比較では大幅に改善の最適化の一引数に関数を読み込みの長さの文字列インスタンス.

結論

本ウェブサイトでは、原則として、避けるとの比較に対する空の文字列リテラルでは、空文字列リテラルでは曖昧にソースコード。そのためにmy.純ヘルパークラスの長さの定義は空文字列としての定数です。が使ってい 文字列になります。空 直接、インラインの比較定を得、その保を定義するための定数の値は空の文字列が一定の割り当てる事はできない 文字列になります。空 を値とする。

この運動が確定後、状況の改善へのさいについている場合、これとの比較のいずれかに対 文字列になります。空 の定義による自のヘルパース

しかし、でも上げるので、動作時間の最大値と最小値を導き問題置き換えること;なぜ比較対 文字列になります。空 より効率的に文字列の長さは?または、試験用光沢のある無効となるようになりループはデータエスクローエージェントいうことは考えにくいですが、それでも、私は興奮していることなどを考えると、ていらっしゃることだと思いますって!)

していると感じている システム。文字列 オブジェのカウントの文字列を、根本的に同様の基本的な文字列(BSTRとして知られている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top