如果我能通过图像显示我的意思会更简单,但我还无法加载图像。
我有一个属于公共静态类的私有静态方法。在该方法的开头,我声明了一个字符串和一个int。这是代码:
private static string getSerialNumber(string drive)
{
string sn = string.Empty;
int snLen = 0;
try
{
drive = drive.TrimEnd(':') + ":";
string sqlLDTP = String.Format("associators of {{Win32_LogicalDisk.DeviceID='{0}'}} where AssocClass= Win32_LogicalDiskToPartition", drive);
ManagementObjectCollection mocLDTP = new ManagementObjectSearcher(sqlLDTP).Get();
foreach (ManagementObject moLDTP in mocLDTP)
{
string sqlDDTDP = String.Format("associators of {{Win32_DiskPartition.DeviceID='{0}'}} " + "where AssocClass= Win32_DiskDriveToDiskPartition", moLDTP["DeviceID"]);
ManagementObjectCollection mocDDTDP = new ManagementObjectSearcher(sqlDDTDP).Get();
foreach (ManagementObject moDDTDP in mocDDTDP)
{
string sqlDD = String.Format("Select MediaType, PNPDeviceID, SerialNumber From Win32_DiskDrive Where DeviceID='{0}'", moDDTDP["DeviceID"]).Replace("\\", "\\\\");
ManagementObjectCollection mocDD = new ManagementObjectSearcher(sqlDD).Get();
foreach (ManagementObject moDD in mocDD)
{
sn = moDD["SerialNumber"].ToString();
snLen = sn.Length;
((Action)(() => { }))(); // Do nothing - NoOp
//System.Windows.MessageBox.Show("\"" + sn + "\", snLen: " + snLen);
// if (snLen == 0)
if (sn.Length == 0)
{
string mt = moDD["MediaType"].ToString();
}
}
}
}
}
catch { }
return sn;
}
我在((Action)...
有一个断点,当我运行调试器并在该断点处停止并将鼠标放在snLen
上时,它无法识别。但是,如果我发表评论if (sn.Length) == 0)
并取消评论if (snLen == 0)
并运行调试程序,并且当它在断点处停止并且我将鼠标放在snLen
上时,现在可以识别该变量。然后我在调试器中固定该变量,然后注释并取消注释回原始状态。当我再次运行调试器并在断点处停止并将鼠标放在固定的snLen
上时,我得到一个工具提示,上面写着“此表达式的值可能不正确。无法评估它,因为: '当前上下文中不存在名称'snLen''点击此按钮立即尝试重新评估。单击所述按钮会产生相同的结果。 sn
变量始终可用,并且在调试期间鼠标可以看到其内容。 sn
和snLen
都在同一范围内一个接一个地声明。为什么一个总是可用而另一个不可用?
另一个问题是,如果我将评论和取消评论反转,以便snLen
在调试器中可用,当sn
包含值时,snLen
包含正确的值,长度sn
。但是,当sn
为空时,snLen
包含1且它应包含0.导致这些事情发生的原因是什么?我知道foreach
语句创建了一个内部作用域,但这并不妨碍对父作用域中声明的变量的访问,至少直到现在还没有。我不知道ManagementObjectSearcher
,ManagementObjectCollection
和ManagementObject
可能会与范围混淆。
非常感谢对此事的任何见解。
顺便说一句,如果存在正确的序列号,此方法会返回正确的序列号。下面的代码((Action)...
最终将测试是否检索到序列号,如果没有,则测试驱动器是否为可移动驱动器,如果是,则获取PNPDeviceID
字符串末尾的序列号。但是,此时,当没有序列号时,长度为1,它应为0,所以有些问题需要修复。