27

テキストボックスの内容をクリアする以下の 3 つの方法の間で少し混乱しています。私は WPF を使用しており、すべてが機能していることがわかりましたが、違いを見つけることができません。

誰かがいくつかの例でそれについて説明してもらえますか?

  • txtUserName.Clear();
  • txtUserName.Text = string.Empty;
  • txtUserName.Text = "";
4

10 に答える 10

19

このClear()メソッドは、 からテキストを削除するだけではありませんTextBox。@synedの回答がうまく示しているように、すべてのコンテンツを削除し、テキスト選択とキャレットをリセットします。

たとえば、フレームワークは、文字列プールに空のオブジェクトが存在しない場合txtUserName.Text = "";に空のオブジェクトを作成し、それをプロパティに設定します。ただし、文字列がアプリケーションで既に使用されている場合、フレームワークはプールからこの値を使用します。stringText""

このtxtUserName.Text = string.Empty;例では、フレームワークは空のstringオブジェクトを作成せず、代わりに空の文字列定数を参照し、これをTextプロパティに設定します。

パフォーマンス テストでは、( C# では、string.Empty または String.Empty または ""?ポストを使用する必要があります)、後者の 2 つの例の間に有用な違いがないことが示されています。メソッドの呼び出しClear()は間違いなく最も遅いですが、それは明らかに、テキストのクリアだけでなく、他に行う作業があるためです。それでも、3 つのオプションのパフォーマンスの違いは、ほとんど目立ちません。

于 2013-09-02T10:41:30.810 に答える
4

パフォーマンスの違いやメモリ リークの背後にある場合は、それほど多くはありません ( .Clear() を使用する代わりにテキストを設定するときに、イベントへの呼び出しがいくつか追加されるだけです)。

ただし、MVVM を使用している場合はコントロール自体にアクセスできないため、テキストをクリアする唯一の方法は、 TextBox でバインドされたプロパティにテキストを設定することです。

標準アプリケーションでは、好きなことを行うことができます (この目的のために設計された .Clear() メソッドを使用することをお勧めします)。

于 2013-09-02T15:01:34.960 に答える
1

まあ..最初の警告、この答えは、ここにいるほとんどの開発者の現在のコンセンサスの外にある可能性がありますが、ここに行きます:)最後まで読んでみてください。

これら2つ(および私が含めた追加のものも)はまったく同じです:

txtUserName.Text = "";
txtUserName.Text = string.Empty;
txtUserName.Text = null;

デバッグ構成のアセンブリが少し異なる場合でも、 より最適化されたリリース モードでは、まったく同じアセンブリにコンパイルされると確信しています。

それらが同じにならない場合 - これは、この場合のコード アジェンダを最適な翻訳に変換するコンパイラの能力が低下していることを意味します。つまり、他の言語では、これは同じアセンブリとして、から来る可能性があります。それの学術的なビジョン - それは同じアセンブリとして出てくるはずです. しかし、すべてのコンパイラが物事の学術的見解の多くを気にしているわけではありません:)

3番目の男に関しては、これは別のケースです。私はあなたと同じように、このメソッドの内部実装が実際にこれら3つの割り当ての1つを実行するかtxtUserName.Clear()、単に使用すると仮定します.. ただし、オブジェクト指向を考えている場合 - たとえば、クリアするものをさらに含む特別なテキストボックスを作成したい人がいると仮定すると、その 'Clear' メソッドをオーバーライドすることは非常に便利です
..
clear メソッドを使用しました - 基本的なテキストボックスからその新しいカスタム/特別なテキストボックスに変更するときにコードを変更しません。

要約すると、コントロールを使用する場合は、そのメソッドを使用する必要があります。つまり、「Clear()」メソッドを使用することは、特に将来のある日、それをクリアしたい場合に適しています。そのテキストボックスを独自のカスタムテキストボックスに置き換えます。したがって、少なくとも文法的にはそれがより良い選択です..
しかし、はい、単にテキストプロパティから文字を削除することだけが必要な場合は、パフォーマンスが低下します..

これは、WPF の下でそれぞれの効率をテストするための小さなプログラムです。

<Window x:Class="WpfApplication4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBox Name="txtbx1" Grid.Row="0"/>
    <TextBox Name="txtbx2" Grid.Row="1"/>
    <TextBox Name="txtbx3" Grid.Row="2"/>
    <TextBox Name="txtbx4" Grid.Row="3"/>
</Grid>

using System;
using System.Windows;

namespace WpfApplication4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DateTime oldTime, newTime;
            TimeSpan delta;

            var iterations = 100000;

            #region Test performance 1

            oldTime = DateTime.Now;
            for (var i = 0; i < iterations; i++)
                txtbx1.Text = "";
            newTime = DateTime.Now;
            delta = newTime - oldTime;
            txtbx1.Text = delta.Milliseconds.ToString();

            #endregion

            #region Test performance 2

            oldTime = DateTime.Now;
            for (var i = 0; i < iterations; i++)
                txtbx2.Text = string.Empty;
            newTime = DateTime.Now;
            delta = newTime - oldTime;
            txtbx2.Text = delta.Milliseconds.ToString();

            #endregion

            #region Test performance 3

            oldTime = DateTime.Now;
            for (var i = 0; i < iterations; i++)
                txtbx3.Text = null;
            newTime = DateTime.Now;
            delta = newTime - oldTime;
            txtbx3.Text = delta.Milliseconds.ToString();

            #endregion

            #region Test performance 4

            oldTime = DateTime.Now;
            for (var i = 0; i < iterations; i++)
                txtbx4.Clear();
            newTime = DateTime.Now;
            delta = newTime - oldTime;
            txtbx4.Text = delta.Milliseconds.ToString();

            #endregion
        }
    }
}

これらは私が得た結果でした: 43、40、73、443

最初の 2 つはほぼ同じ +/- 1 秒または 2 秒で、3 番目は常にわずかに長く、最後の 1 つは他のすべてよりも確実に長くなっています。

私はそれが得るのと同じくらい深いと思います:)

于 2013-09-07T19:18:36.373 に答える
1
txtUserName.Clear();

このコードは、テキスト ボックスをクリアします。テキストボックスの値を "" に設定します

txtUserName.Text = string.Empty;

オブジェクトを作成しません。txtUserName.Text = ""これは;よりも速く実行されます。

txtUserName.Text = "";

オブジェクトを作成し、パフォーマンスに影響を与えます。

于 2013-09-04T05:58:22.717 に答える
1

コマンドを 1 つずつ見ていきましょう。

txtUserName.Clear();

このClear()コマンドは、次の例のように texbox に空の文字列を割り当てます。 出典(この点について syned が最良の説明を提供します)

txtUserName.Text = string.Empty;

実際string.Emptyのコードは次のとおりです

static String()
{
    Empty = "";
}

コンパイル時に文字列 "" を割り当てることを意味します。

txtUserName.Text = "";

ここで、コンパイル時に "" 文字列をオブジェクトに直接割り当てるだけです。

小さな補足事項はソースtxtUserName.Text = "";よりも高速ですtxtUserName.Text = string.Empty;

于 2013-09-04T06:29:42.530 に答える
1

string.Emptyフィールドは空の文字列リテラルです空の文字列リテラル定数" "とは少し異なります。微妙な違いがありますが、一部のシナリオでは重要になる可能性があります。プログラムの意味を変える

C# プログラムでstring.Empty と ""を使用します。string.Empty フィールドは、実行時に .NET Framework によって "" に初期化されます。

string.Empty をスイッチ ケースとして使用することはできません。it cannot be determined at compile-time by the C# compiler.

string.empty と "" の違いを説明するもの

このClear()メソッドは、 からテキストを削除するだけではありませんTextBox。すべてのコンテンツを削除し、テキスト選択をリセットします

于 2013-09-06T12:01:41.990 に答える
0

String.Emptyは""よりも高速であると言う人もいますが、 String.EMptyは""に初期化される静的メンバーです。

make を呼び出すとString.EmptyIL

mscorlib.dll 

IL_0007:  ldsfld     string [mscorlib]System.String::Empty

一方、""の場合はそうではありません

IL_001a:  ldstr      ""

SO 論理的には、""がString.Emptyよりも効率的であることがより理にかなっています。

于 2013-09-06T11:25:59.880 に答える