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

时间:2014-12-30 20:23:45

标签: c# .net pinvoke fcl

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

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

例如:

MessageBox.Show("...");

我知道这个方法必须使用P / Invoke来调用Win32 API。

但是这样的事情:

System.Convert.ToInt32(mystr);

我实际上并不知道它是如何工作的,因为在纯C#中,int和string之间的转换是不可能的。(你可以不使用那种方法做同样的事情吗?实际上我不知道)。< / p>

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

4 个答案:

答案 0 :(得分:6)

  

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

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

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

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

事实上,有时值得手动操作 - 在Noda Time中我们有our own numeric parsing code允许解析有限​​数量的字符而不必使用子字符串。

答案 1 :(得分: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; } here上的实际例程:

其中列出的基本惯例之一如下:

{{1}}

答案 2 :(得分:1)

试试这个: 它不是微软的实现,因为它不是开源的。 但它应该给你一个想法

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

答案 3 :(得分:1)