gpt4 book ai didi

.net - ManagementObject 和 ManagementBaseObject 有什么区别

转载 作者:行者123 更新时间:2023-12-02 05:16:17 26 4
gpt4 key购买 nike

当我编译以下两个代码时,它给出了相同的结果(我认为是这样)。

//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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com