.NET框架低级API如何工作?

Ami*_*a H 1 .net c# pinvoke fcl

我一直面临的一个问题是.NET Framework类库的实现.

我知道一些原始实现的方法:

例如 :

MessageBox.Show("...");
Run Code Online (Sandbox Code Playgroud)

据我所知,这个方法必须使用P/Invoke来调用Win32 API.

但是像这样:

System.Convert.ToInt32(mystr);
Run Code Online (Sandbox Code Playgroud)

我实际上不知道它是如何工作的,因为在纯C#中不可能在int和string之间进行转换.(你可以在不使用该方法的情况下做同样的事情吗?实际上我不知道).

最后,如果您知道答案,请在第二个例子中为我澄清这些概念.

Jon*_*eet 6

你可以不使用那种方法做同样的事情吗?其实没有.

你绝对可以.这是一种非常低效的方法 - 它不考虑溢出,无效输入或负数,但演示了一般原则.

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

从根本上说,解析字符串的过程并不神秘Int32.这只是一个查看每个字符的情况,考虑它的数值,并做一些算术.

实际上,有时候值得手动操作 - 在Noda Time中我们有自己的数字解析代码,允许解析有限数量的字符,而不必采用子字符串.


Ani*_*Ani 5

Microsoft已在线提供BCL:http://referencesource.microsoft.com

呼叫Convert.ToInt32(string)最终将调用int.Parse,这反过来将最终调用的实际日常使用内部Number在这里:

列出的基本例程之一如下:

    [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;
    }
Run Code Online (Sandbox Code Playgroud)