当我编译以下两个代码时,它给出相同的结果(我想是这样)。
//ManagementObject :
SelectQuery query = new SelectQuery("Win32_Environment");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject envVar in searcher.Get())
Console.WriteLine("Variable : {0}, Value = {1}",envVar["Name"], envVar["VariableValue"]);
//ManagementBaseObject :
SelectQuery query = new SelectQuery("Win32_Environment");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementBaseObject envVar in searcher.Get())
Console.WriteLine("Variable : {0}, Value = {1}",envVar["Name"], envVar["VariableValue"]);
两个代码执行有什么区别......?
答案 0 :(得分:2)
在这种特殊情况下,没有区别。
ManagementObjectSearcher.Get()
方法返回ManagementObjectCollection
,它是ManagementBaseObject
的集合。这意味着该集合可以包含ManagementBaseObject
类型的实例,或者来自ManagementBaseObject
的任何类型的实例。
但是,ManagementBaseObject
被设计为基类,这意味着实际上它不会被实例化,相反,它的下行类将被实例化。请注意,这只是一种约定,并不是由语言或框架强制执行的。
此外,由于框架中(直接)继承ManagementBaseObject
的唯一类是ManagementObject
,因此Get()
有效地返回ManagementObject
个实例的集合。请注意,这只是当前的情况,没有什么能阻止创建其他ManagementBaseObject
个继承者。
因此,所有提到的警告,这意味着,如果您只使用基类中定义的属性(而不是覆盖),您可以以任一方式迭代,并且代码将表现完全相同。在您的代码中,您只使用ManagementBaseObject
类中确实定义但未覆盖的indexer。
如果您想要一个代码的示例,该代码将在一个循环中失败并在另一个循环中工作,您可以尝试在ManagementObject
上定义的任何属性,例如Path:< / p>
foreach (ManagementObject envVar in searcher.Get())
Console.WriteLine("Path : {0}, Value = {1}",envVar.Path.Path); //works
foreach (ManagementBaseObject envVar in searcher.Get())
Console.WriteLine("Path : {0}, Value = {1}",envVar.Path.Path); //compile error
答案 1 :(得分:1)
您最好在此使用ManagementBaseObject
。 Get()
方法返回一个(非泛型)ManagementObjectCollection
,其中包含ManagementBaseObject
个派生类型,包括ManagementObject
和ManagementClass
。
第一个版本可能适用于您的特定查询,但通常您可能会收到无效的强制转换异常。
如果您只需要考虑ManagementObject
类型的对象,您可以考虑以下版本:
var query = new SelectQuery("Win32_Environment");
var searcher = new ManagementObjectSearcher(query);
foreach (var envVar in searcher.Get().OfType<ManagementObject>())
{
Console.WriteLine("Variable: {0}, Value = {1}",
envVar["Name"], envVar["VariableValue"]);
}