チェック文字列コンテンツ?文字列長Vs空文字列
-
08-06-2019 - |
質問
効率のためのコンパイラとの確認を行うための文字列は空白?
- かどうかの確認文字列の長さ==0
- かどうかの確認を文字列が空の(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の場合のみでは得られないときには、いくつかの断層のセグメンテーションアクセスするために、未定義の文字列になります。
仮にあなたの質問です。純益:
したい場合は認証文字列に対し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を描いてい、以下の結論を得た。
試験等に対する空の文字列リテラルの静的な文字列になります。空のプロパティのシステム。stringクラスは、すべての実践的な目的に同様である。の唯一の違いは二つのコードスニペットのソースである最初の移動の指導、両方ともオフセットからの相対ds示唆すると考えられることの両方を参照して焼き-中定数.
試験等に対する空の文字列としてのいずれかの文字または文字列です。空のプロパティから、二つの引数を取る関数呼び出しを示す 不平等 返ゼロになります。私はこの結論は他の試験を行っていましたカ月前に、私が自分のコードをサポ分割を行います。すべての場合は、電話を必要とした二以上の引数の第一引数に登録ECX、第二に登録EDX.思うその後の引数が渡されます。しかし、通話セットアップの見たように__fastcallよ__stdcall.同様に、予定の戻り値は常にきていた登録EAXである。
試験の長さの文字列を設定一引数で関数呼び出しは、1を返します(登録EAX)が含まれる文字列の長さが試されているわけです。
そのすぐ見えるマシンコードとほぼ同じで、それを想像できますよう、より良い性能文字列の平等のスティング長さによる報告 光沢のある この引数に関数を実行するとの比較では大幅に改善の最適化の一引数に関数を読み込みの長さの文字列インスタンス.
結論
本ウェブサイトでは、原則として、避けるとの比較に対する空の文字列リテラルでは、空文字列リテラルでは曖昧にソースコード。そのためにmy.純ヘルパークラスの長さの定義は空文字列としての定数です。が使ってい 文字列になります。空 直接、インラインの比較定を得、その保を定義するための定数の値は空の文字列が一定の割り当てる事はできない 文字列になります。空 を値とする。
この運動が確定後、状況の改善へのさいについている場合、これとの比較のいずれかに対 文字列になります。空 の定義による自のヘルパース
しかし、でも上げるので、動作時間の最大値と最小値を導き問題置き換えること;なぜ比較対 文字列になります。空 より効率的に文字列の長さは?または、試験用光沢のある無効となるようになりループはデータエスクローエージェントいうことは考えにくいですが、それでも、私は興奮していることなどを考えると、ていらっしゃることだと思いますって!)
していると感じている システム。文字列 オブジェのカウントの文字列を、根本的に同様の基本的な文字列(BSTRとして知られている。