次の2つの文字列メソッドの違いは何ですか?xxx.tostring()と(string)xxxの違いは何ですか?
string str1 = dr["RAGStatusCID"].ToString();
string str2 = (string)dr["Description"];
次の2つの文字列メソッドの違いは何ですか?xxx.tostring()と(string)xxxの違いは何ですか?
string str1 = dr["RAGStatusCID"].ToString();
string str2 = (string)dr["Description"];
簡潔に言えば、.toString()
は他のどのような方法と同じように、1つのデータ型を別の互換性のある型として扱うために使用されるキャストであるキャストです。いくつかの詳細は今
:
.toString()
はちょうどあなたが発生する可能性があり、他の方法と同様に、方法です。それはしばしば何らかの方法で「特別な」方法であると考えられましたが、実際にはそれは文字列を返します。ベースのメンバーであるため、すべてのオブジェクトで利用できるようにすることができます。このため、一般に、それがメンバーであるオブジェクトのテキスト表現を提供するために使用されます。デフォルトでは、これはオブジェクトのタイプの名前です。より意味のある名前を提供するために、このメソッドをオーバーライドすることが望ましいことがよくありますが、ストリングを返すだけです。これは好きな文字列にすることができます。
前述したように、ToInt()、ToDouble()、およびToChar()というメソッドをそれぞれの型に対して同じ機能を提供するように簡単に追加できます。
キャスティングは言語構造であり、これは言語に組み込まれており、その言語専用に実装されていることを意味します。互換性はありますが、異なるタイプを異なる場所で使用するために使用され、明示的な変換を必要としません。
ので、それはC#のために正しいかどうかはわからないが、それはおそらくですこれは正しくありません - 他の回答を見てください。 C#は、ユーザー定義の[暗黙的および明示的な変換](http://msdn.microsoft.com/en-us/library/ms173105.aspx)の両方をサポートしています。変換される型(ここでは 'object')は考慮に入れる必要があります - この場合、実際には"普通の古いキャスト "です。文字列や文字列のサブクラスである* *のみの変換を禁止することに注意してください。 '(string)(object)42'は、それがどれほどうまくいかなくても失敗します: - / –
これはdr
が何であるかに依存します。最初は、dr["RAGStatusCID"]
のindexerで各オブジェクトが上書きできるToStringメソッドを呼び出します。 2番目の文字はcastsdr["Description"]
です。
我々はテレパシーのスキルを使用してdr
がSqlDataReaderであると仮定した場合、2つの発現はかなりDescription
列が文字列でない場合、キャストは、実行時に例外をスローする可能性がありますことを除いて同じことを行います。
xxx.ToString()
は、そのオブジェクトのメソッドを呼び出して文字列オブジェクトに変換します。 (string)xxx
は、オブジェクトの型が既に文字列であり、単に既存のオブジェクトに対してキャストを実行すると仮定します。したがって、最初のケースでは変換が行われ、2番目のケースではタイプが明示的に識別されます。
例ではRagStatusCID
が整数で、dr( "RagStatusCID")を呼び出そうとしましたが、型が文字列ではないため例外が発生します。これはint型です。 .ToString()
を呼び出すと変換が実行され、出力は文字列です。
(文字列)はキャスト演算です。 .ToString()は、Objectクラスから継承されるメソッドです。すべてが.ToString()を持ちますが、すべてが(文字列)を持っているわけではありません。さらに、特定のオブジェクトは、1つの.ToString()出力とは異なる文字列にキャストします。
タイプがdr
であること、またはインデクサーの操作が返すものについては言及していませんが、表面上は2つの操作が異なります。
dr
のget indexerを呼び出し、参照先のオブジェクトがメソッドを呼び出し、参照先のオブジェクトがデータの文字列表現を提供できるようにします。 これの一般目的は、オブジェクト自身が文字列として意味のある表現を返すことを可能にすることです。。
2番目の呼び出しは、インデクサから返された参照をSystem.String
にキャストしようとします。返されるオブジェクトは、System.String
のインスタンスであるか、コンパイラーがカスタム変換演算子を呼び出すことができる型でなければなりません。 ここでは、返されたオブジェクトがSystem.String
のインスタンスとして扱われることを保証することを目的としています。 MSDNでread more about conversions(ユーザー定義のものを含む)を行うことができます。
良い答え。しかし、C#の変換へのリンクを持っていいですね。 –
@pst:良い点、私はそれを追加しました。 – LBushkin
string str1 = dr["RAGStatusCID"].ToString();
これはdr["RAGStatusCID"]
呼び出しから返されたオブジェクトの.ToString()
メソッドを呼び出します。文字列またはnullを返すことが保証されています。
string str2 = (string)dr["Description"];
これは、dr["Description"]
によって返されたオブジェクトを文字列にキャストしようとします。返されるオブジェクトが文字列でない場合、例外がスローされます。
最初に文字列を返すメソッドを呼び出します。誰かがToStringメソッドを実装する必要があります。 2番目のものは箱を開けるだけです。
:暗黙的に
(String)myinstance
通話MYINSTANCEのクラス
の.toString()
実装を使用すると、このようなクラスがある場合:
(String)instance
キャストがどうなるかを定義している
toString
方法と
class User
{
private integer userId;
private integer userName;
... some code here...
public toString()
{
return "Username: " + this.userName + " (" + this.userId + ")";
}
}
User myuser = new User("Alex", 22);
String myuserdump = (String)myuser;
print(myuserdump);
は「ユーザー名:Alex(22)」と表示されます
MSILとは何ですか? –
の可能な複製[文字列へのint型のキャストとC#のToString()メソッドの違いは何ですか?(http://stackoverflow.com/questions/709263/whats-the-difference-between-casting-an-int -to-a-string-and-tostring-metho) – BoltClock
(strings)はToString()の暗黙の呼び出しであるため、結果は同じです – skyline26