当我编译以下两个代码时,它给出相同的结果(我认为是这样)。
//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"]);
这两种代码执行之间有什么区别...?
最佳答案
在这种特殊情况下,没有区别。
ManagementObjectSearcher.Get()
方法返回 ManagementObjectCollection
这是 ManagementBaseObject
的集合。这意味着该集合可以包含 ManagementBaseObject
类型的实例或任何源自 ManagementBaseObject
的派生类型的实例。
但是,ManagementBaseObject
被设计为基类,这意味着实际上它不会被实例化,而是会实例化它的派生类。请注意,这只是一个约定,并不是由语言或框架强制执行的。
此外,由于框架中唯一(直接)继承 ManagementBaseObject
的类是 ManagementObject
,Get()
有效地返回 ManagementObject
实例的集合。请注意,这只是当前情况,没有什么可以阻止创建其他 ManagementBaseObject
继承者。
因此,考虑到所有提到的警告,这意味着,如果您仅使用基类中定义的属性(而不是重写),您可以以任何一种方式进行迭代,并且代码的行为将完全相同。在您的代码中,您仅使用 indexer ,它确实是在 ManagementBaseObject
类中定义的,而不是被重写。
如果您想要一个在一个循环中失败而在另一个循环中工作的代码示例,您可以尝试在 ManagementObject
上定义的任何属性,例如 Path :
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
关于.net - ManagementObject 和 ManagementBaseObject 之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582549/