web-dev-qa-db-ja.com

オブジェクトが実際に文字列である場合のオブジェクトのtoStringへのキャストと変換

これは実際には問題ではありませんが、興味があります。文字列を保存すると、たとえばDataRowがObjectにキャストされます。使用する場合は、ToStringをキャストする必要があります。私が知る限り、これを行うにはいくつかの方法がありますが、最初は

string name = (string)DataRowObject["name"]; //valid since I know it's a string

そしてもう一つは:

string name = DataRowObject["name"].ToString();

両者の違いは何ですか?最初の方が効率的ですか? (これは単なる推測であり、私の頭の中では、ToString()メソッドはループメカニズムによって実装されており、キャストするだけで「速く」できますが、これは単なる「直感」です)。

これを行うより高速でエレガントな方法はありますか?

誰も私のためにこれをクリアできますか?

70
David Božjak

この2つは異なる目的を対象としています。任意のオブジェクトのToStringメソッドは、そのオブジェクトの文字列表現を返すことになっています。キャストはまったく異なり、「as」キーWordは条件付きキャストを実行します。 「as」キーのWordは基本的に「オブジェクトがこのタイプの場合、そのオブジェクトへのこのタイプの参照を取得します」と言い、ToStringは「そのオブジェクトの文字列表現を取得します」と言います。結果は同じ場合もありますが、2つを交換可能と見なすべきではありません。なぜなら、私が言ったように、それらは異なる目的のために存在するからです。キャストが意図されている場合は、ToStringではなく、常にキャストを使用する必要があります。

from http://www.codeguru.com/forum/showthread.php?t=44387

http://bytes.com/groups/net-c/225365-tostring-string-cast も参照してください

50
Adriaan Stander

Stringであることがわかっている場合は、必ずStringにキャストしてください。オブジェクトのキャストは、仮想メソッドを呼び出すよりも高速になります。

Edit:ベンチマークの結果は次のとおりです。

_============ Casting vs. virtual method ============
cast 29.884 1.00
tos  33.734 1.13
_

ジョンスキートの BenchmarkHelper を次のように使用しました。

_using System;
using BenchmarkHelper;

class Program
{
    static void Main()
    {
        Object input = "Foo";
        String output = "Foo";

        var results 
           = TestSuite.Create("Casting vs. virtual method", input, output)
            .Add(cast)
            .Add(tos)
            .RunTests()
            .ScaleByBest(ScalingMode.VaryDuration);

        results.Display(ResultColumns.NameAndDuration | ResultColumns.Score,
                results.FindBest());
    }

    static String cast(Object o)
    {
        return (String)o;
    }

    static String tos(Object o)
    {
        return o.ToString();
    }
}
_

そのため、実際には、キャストはToString()を呼び出すよりもわずかに高速です。

30
Andrew Hare

基本的には、.ToString()がバグを隠す可能性があるため、型キャストはそのままにしておく方が良いでしょう。たとえば、データベーススキーマが変更され、名前が文字列型ではなくなりましたが、.ToString()を使用してもコードは機能します。したがって、この場合、型キャストを使用することをお勧めします。

ここにString.ToString()の実装があります-特別なものはありません=)

public override string ToString()
{
    return this;
}
16
Dzmitry Huba

CLRはさまざまなランタイムタイプチェックを実行する必要があるため、ダウンキャストは比較的低速の操作です。ただし、この特定のシナリオでは、一貫性のためにToString()を呼び出すよりもstringにキャストする方が適切です(objectToInt32を呼び出すことはできません。ただし、int)と保守性にキャストします。

5
Anton Gogolev

もう一つコメントしたい

キャストを使用する場合:string name =(string)DataRowObject ["name"]例外:タイプ 'System.DBNull'のオブジェクトをタイプ 'System.String'にキャストできない場合、レコードがデータベーステーブルにnull値があります。

このシナリオでは、string name = DataRowObject ["name"]。ToString()または

次のようなヌル値を確認する必要があります

if(!string.IsNullOrEmpty(DataRowObject["name"].ToString()))
{
string name = (string)DataRowObject["name"];
}
else
{
//i.e Write error to the log file
string error = "The database table has a null value";

}
4
SergoT

データオブジェクトの場合、次のコードのように「as」キーワードを使用することをお勧めします。

string name = DataRowObject["name"] as string;

値を使用する前に確認してください。

if(name != null)
{
    // statement for empty string or it has value
}
else
{
    // statement for no data in this object.    
}
3
Soul_Master

この場合:

_string name = DataRowObject["name"].ToString();
_

stringなので、文字列オブジェクトのToString()メソッドは次のように簡単だと思います。

_return this;
_

だから私見ではパフォーマンスのペナルティはありません。

PS私はJavaプログラマなので、このanwserは単なる推測にすぎません。

2
dfa

Objectは文字列であると述べましたが、返されたオブジェクトがnullであることが心配な場合は、「Convert.ToString(DataRowObject ["name"]);」を使用してキャストすることもできますこれには、オブジェクトがnullの場合に空の文字列(string.empty)を返すという追加の利点があり、null参照例外を回避します(もちろん、例外がスローされる場合を除きます)。

1
n00b

ToString()はデフォルトではキャストを実行しません。その目的は、タイプ(「System.Object」など)を表す文字列を返すことです。

キャストを回避したい場合は、強く型付けされた実装(たとえばジェネリックを使用)を考えて、DataRowObjectを完全に回避することができます。

1
martijn_himself