.NET 框架低级 API 如何工作
本文关键字:工作 何工作 框架 API NET | 更新日期: 2023-09-27 18:35:39
我一直面临的一个问题是.NET Framework类库的实现。
我知道一些原始实现的方法:
例如:
MessageBox.Show("...");
据我所知,这种方法必须使用P/Invoke来调用Win32 API。
但像这样:
System.Convert.ToInt32(mystr);
我实际上不知道它是如何工作的,因为在纯 C# 中无法在 int 和字符串之间进行转换。(您可以在不使用该方法的情况下做完全相同的事情吗?其实我不知道)。
最后,如果您知道答案,请为我澄清这些概念,特别是第二个示例。
您可以在不使用该方法的情况下做完全相同的事情吗?其实没有。
你绝对可以。这是一种非常低效的方法 - 它不考虑溢出、无效输入或负数,但演示了一般原则。
int ParseStringToInt32(string text)
{
int result = 0;
foreach (char c in text)
{
result = result * 10 + (c - '0');
}
return result;
}
从根本上说,将字符串解析为Int32
的过程并没有什么神秘之处。这只是查看每个字符,考虑其数值并做一些算术的情况。
事实上,有时值得手动执行此操作 - 在 Noda Time 中,我们有自己的数字解析代码,允许解析有限数量的字符,而无需使用子字符串。
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;
}
试试这个:这不是Microsoft实现,因为它不是开源的。但它应该给你一个想法
https://github.com/mono/mono/blob/master/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MessageBox.cs
MessageBox.Show 的实现在这里。
Convert.ToString 的实现在这里。