1

私が常に直面していた問題の 1 つは、.NET Framework クラス ライブラリの実装でした。

メソッドの元の実装のいくつかを知っています:

例えば ​​:

MessageBox.Show("...");

私が知っているように、このメソッドは P/Invoke を使用して Win32 API を呼び出す必要があります。

しかし、このようなもの:

System.Convert.ToInt32(mystr);

純粋な C# では int と string の間の変換ができないため、実際にはどのように機能するのかわかりません (その方法を使用せずにまったく同じことができますか? 実際にはわかりません)。

最後に、答えがわかっている場合は、特に2番目の例でこれらの概念を明確にしてください。

4

4 に答える 4

6

その方法を使わずにまったく同じことができますか?いやいや。

あなたは絶対にできます。これは、オーバーフロー、無効な入力、または負の数を考慮していませんが、一般的な原則を示しています。

int ParseStringToInt32(string text)
{
    int result = 0;
    foreach (char c in text)
    {
        result = result * 10 + (c - '0');
    }
    return result;
}

基本的に、文字列をInt32. これは、各文字を見て、その数値を考慮し、計算を行う場合にすぎません。

実際、手動で行う価値がある場合もあります。Noda Time では、部分文字列を取得することなく限られた数の文字を解析できるようにする独自の数値解析コードがあります。

于 2014-12-30T20:26:24.890 に答える
5

Microsoft は、オンラインで BCL を利用できるようにしました: http://referencesource.microsoft.com

を呼び出すConvert.ToInt32(string)int.Parse、最終的に が呼び出され、最終的に内部Numberクラスの実際のルーチンが呼び出されます

そこにリストされている基本的なルーチンの1つは次のとおりです。

    [System.Security.SecuritySafeCritical]  // auto-generated
    private unsafe static Boolean NumberToInt32(ref NumberBuffer number, ref Int32 value) {

        Int32 i = number.scale;
        if (i > Int32Precision || i < number.precision) {
            return false;
        }
        char * p = number.digits;
        Contract.Assert(p != null, "");
        Int32 n = 0;
        while (--i >= 0) {
            if ((UInt32)n > (0x7FFFFFFF / 10)) {
                return false;
            }
            n *= 10;
            if (*p != '\0') {
                n += (Int32)(*p++ - '0');
            }
        }
        if (number.sign) {
            n = -n;
            if (n > 0) {
                return false;
            }
        }
        else {
            if (n < 0) {
                return false;
            }
        }
        value = n;
        return true;
    }
于 2014-12-30T20:35:10.420 に答える
1

これを試してみてください: オープン ソースではないため、Microsoft の実装ではありません。しかし、それはあなたにアイデアを与えるはずです

https://github.com/mono/mono/blob/master/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MessageBox.cs

于 2014-12-30T20:26:12.093 に答える