2011-01-18 16 views
3

私の学歴の大学に戻る。基本的な型から文字列への素早い変換としてx + ""を行うよう教えてくれました。
私はJavaとC++のコース(私は今のところどちらも使用していませんでした)で彼のクラスを覚えていませんが、C#/ Netで使用しています。最近主に発展しています。x.toString()とx + ""の相違点

利点がありますか?.toString()より、+""よりint、decimal、float ...のような基本型については? .toString()の場合はどうすればよいでしょうか?

注:それは短かったと私はちょうどそれを問うことなく、それ以来のことを行っているので、私も同様に.toString()を示したが、その教授はちょうど+""をお勧めします。

+13

教授が公共部門で実際のコードを書いていないことに、私は非常に感謝しています。 –

+1

C++タグは削除されました。これはC++とはまったく関係がないためです。 – Puppy

+0

I *ほとんどの場合、 '' '+ str'を使用します。これは、 'str'がnullの場合にも有効です。これはよくあるとは限りません.--)順序は' str + ""ではありません! C#とJavaは特殊な "オーバーロード"された演算子を持っているので、両方とも動作します。下のすべての回答が私の好みのフォームに関連しているかどうかはわかりません。 –

答えて

14

さて、メモとしては、xが何であるかによって異なります。 xは、Javaのプリミティブである場合、あなたは、私がのtoString()は、一般的に優れている使用して言う

Integer.toString(x)

よう.toString()、そのラッパーのいずれかを使用して呼び出す必要があるため、X +「」は、少なくともJavaで2つのストリングを一緒に追加したいと言っています。この例では

同様:

public static void main(String[] args) 
{ 
    int x = 3; 
    String s = x + ""; 
} 

として、バイトコードで、終わる:

public static void main(java.lang.String[]); 
    Code: 
    0: iconst_3 
    1: istore_1 
    2: new #2; //class java/lang/StringBuilder 
    5: dup 
    6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 
    9: iload_1 
    10: invokevirtual #4; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
    13: ldC#5; //String 
    15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    21: astore_2 
    22: return 

は、だから、一緒に追加するのStringBuilder「」とxの文字列値を作成する必要があります。失われた効率はそれほど多くはありませんが、単にtoString関数を使用するだけではありません。

public static void main(String[] args) 
{ 
    int x = 3; 
    String s = Integer.toString(x); 
} 

として終わる: - あなたがしたい

public static void main(java.lang.String[]); 
Code: 
0: iconst_3 
1: istore_1 
2: iload_1 
3: invokestatic #2; //Method java/lang/Integer.toString:(I)Ljava/lang/String; 
6: astore_2 
7: return 

そしてそれはちょうど私の意見であるかもしれませんが、.toStringを使用して、あなたが実際に何をしたい反映

はのtoStringを使用して比較しますxの文字列値は、x + ""を使用している間、ハックのようなもので、 " - "と連結されたxの文字列値が必要です。

サイドノート: 私は中間バイトコードについては話せませんが、C#ではemitを実行しますが、これに似たものが想像されます。さらに、C#では、参照型と同じくらい簡単に値型の.ToString()を呼び出すことができるので、私のアドバイスは同じように適用されると思います。

+0

あなたが '' "+ x'"と書くとどうなりますか? –

+0

かなり正確に同じバイトコードです。私はそれをどのように扱うのか話すことはできない。 –

+1

@Zach L、私は「+ x」形式の文字列作成ツールを使用すると驚いています。私は、このイディオムがnullチェックとtoStringに変換されているだろうと想像しました。しかたがない。いずれにしても、私は「パフォーマンス」のために、一方のアプローチを選択するための決定的な要因を作成しません。つまり、1つのフォームまたは別のものを選択する理由はありません:-) –

2

Javaでは、プリミティブ型(int,doubleなど)の場合は、型がオブジェクトではないため、を記述することはできません。これは、これはポインタ演算として扱われますので、あなたは、変換のこの種を行うにはx + ""を使用することはできません、あなたのオプションは

x + ""; 

またはC++で

Integer.toString(x); 

を使用するような何かを書くことのいずれかであることを意味しますあなたに悪い指摘を与えるでしょう。変換を行うには、boost::lexical_castのようなものを使用するのが好ましい方法です。

...私はC#について何も知らないので、私はそれについてコメントしません。 :-)

+0

ありがとう、私はJavaで何かを書いてから数年が経ちました。私はInteger.toString(x)を含めるべきだったと思います。一例として。私がC++を使用して以来、長いことがありました。 – 182764125216

0

x+""のメリットとデメリットはありません。 toStringは、オブジェクトを文字列に追加するたびに暗黙的に呼び出されるObjectタイプのメソッドです。

必要に応じて、このメソッドをクラス内でいつでもオーバーライドできます。

0

文字列が不変であるため、x+""は、x.toString()とStringBuffer.append()(Javaでは少なくとも)の2つの関数を呼び出します。私は、最も良いJITが単なる関数呼び出し、x.toString()に変換すると思っていますが、実際にテストすることなく確認することはできませんでした。

+0

それは一般的によく定義されたイディオムであるため、ヌルチェック(「参照型」)とToStringだけで置き換えることができます。 –

3

正直、私はそのような奇妙なアドバイスを考えています。

私は(xまたはstringのいずれかのタイプのために、オーバーロード+オペレータの存在に依存すべき)すべての特定のケースに話すことはできませんが、一般的にはC#で何x + ""を行いますstring.Concat(x, "")どのような呼び出しものですとにかくx.ToStringが呼び出されます。

典型的なケースでは、x + ""は、x.ToStringより1つ多くのメソッド呼び出しのオーバーヘッドを持っています。しかし、xが何らかの値の型の変数である場合、xの種類のために+のオーバーロードが特に存在しない限り、これはボックス化されます(xのようになります)。また、ToStringの型でそのメソッドがオーバーライドされていない場合は、にボックス化されます。これは私にはビットレアがありますが、確かに起こります。

もちろん、これはかなり些細な違いです。 realこれらの2つのアプローチの違いは読みやすさです。私の経験では、x + ""は.NETではそれほど慣用的ではないので、私はそれを避ける傾向があります。つまり、私が住んでいる.NETの世界では一般的ではないが、そこには.NET開発者がたくさんいる可能性があるということだ。

私は Javaで、おそらくあなたは、いわゆる「プリミティブ」を含むすべてのタイプ(C#でかつ一般的には.NETで、変数intのようなプリミティブ型のxため扱いにくいInteger.toString(x)を書かなければならなかった一方であることを指摘します1)はobjectから継承されており、方法ToStringGetTypeGetHashCode)が利用できます。

+0

おかげさまで、私は他の人がまったく使用していないことを実際に見たことがありませんでした。何らかの理由で、私がコーディングしている間、今日私に立っていました。 – 182764125216

+1

値型の変数 'x 'に対する' x.ToString() 'も、値型がメソッドをオーバーライドしない限り、' x'ボックスになります。 – Timwi

+0

@ティムウィー:そうです。面白いことに、私は正直言って、値型がToStringをオーバーライドしないケースについては考えていませんでした。これは比較的稀です...面白いです。 typeは '+'演算子をオーバーロードしません。とにかく、私は答えを更新します。 –

0

実際には関係ありません。これはパフォーマンス上の問題を引き起こす可能性は非常に低いです。だから、それは個人的なスタイルの問題です。 あなたまたはあなたのチームが快適であるものを使用してください。 Javaでは

0

、プリミティブ型での作業に加えて

x+""nullで動作します。 x.toString()NullPointerExceptionを投げた場合、x+"""null"を返します。それが良いかどうかはあなた次第ですが、それは違いです。

0

C#では、.ToStringを直接使用するなど、より宣言的なものを優先してこのアドバイスを完全に無視します。

xnullの場合、この構文では空の文字列が作成される可能性があります。これがあなたのコードの利点と考えられるならば、私は拡張メソッドを好むでしょう。

public static string NullSafeToString<T>(this T value) where T : class { 
    return value == null ? "" : value.ToString(); 
} 

これを回避する別の理由は、優先順位の混乱を招く可能性があるからです。たとえば、参考資料を使用しないで、zの値が次のような状況にあることを正確に知っていますか?以下

int x = 42; 
int y = 15; 
string z = x + y.ToString(); 

int x = 42; 
int y = 15; 
string z = x + y + ""; 

今同じ質問後者は、メモリC#の演算子の優先順位に時間がかかっていない平均的な開発者が一目で理解されやすくなります。それゆえ、私はそれが誤解される可能性がより低いので、それを好むでしょう。

+0

このメソッドは既に存在し、 'string.Concat(object)'と呼ばれています。 – Timwi

+0

ああ、また...'where T:class'制約は必要ありません。実際に 'value'と' null'を制約なしで比較することができます。 'T'がnull値ではない値の型の場合は、常にfalseになります。 – Timwi

+0

@ティムウィー、私はあなたが100%制約を必要としないことを知っていますが、このメソッドを値型とともに使用する必要もありません。後者を防ぐために制約を加えました。 – JaredPar

関連する問題