0

こんなことしたい

IsItAStringLiteral("yes")
var v = "no";
IsItAStringLiteral(v)

明らかな戻り値を持ちます。出来ますか?

4

2 に答える 2

4

いいえ。文字列がリテラルであるかどうかはわかりません。

単純な理由:リテラル、文字列変数、あらゆる種類のインターン文字列....それぞれがSystem.Stringへの参照です。そして、すべての文字列は、値によって渡されると、それらを使用する関数呼び出しの前にスタックにロードされます(したがって、それらを参照する変数の名前とは無関係です)。関数が呼び出されるまでに、リテラルと変数はまったく同じように見え、値が渡されたときにまったく同じように扱われます。

可能な唯一の方法unsafeは、オブジェクトのアドレスをチェックする可能性のあるものです。アドレスがアセンブリのアドレス空間内にある場合、それはほぼ確実にある種の定数から来ています。しかし、それは信頼性が低く(リテラルに設定された文字列はリテラルと同じように見えるため)、非常にハック的で醜く、そして何よりも私が考えることができる目的には不要です。

文字列がリテラルであるかどうかを気にする必要がある場合は、何をしているのかを再考する必要があります。

于 2010-10-16T06:36:58.427 に答える
2

string.IsInternedメソッドを使用して、特定の文字列が.NETインターンプールにあるかどうかを判断できます。アプリケーションの実行が開始される前に、すべての文字列リテラルがインターンプールに自動的に追加されます。

もちろん、それはあなたの正確な質問には役立ちません。変数'v'は文字列リテラルを参照するため、インターンプールにも表示されます。なぜそのような機能が必要なのですか?

于 2010-10-16T05:42:34.863 に答える