Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net ManagementObject和ManagementBaseObject之间的区别是什么_.net_Wmi_Wql - Fatal编程技术网

.net ManagementObject和ManagementBaseObject之间的区别是什么

.net ManagementObject和ManagementBaseObject之间的区别是什么,.net,wmi,wql,.net,Wmi,Wql,当我编译以下两个代码时,它给出了相同的结果(我认为是这样) 这两种代码执行之间的区别是什么 您最好在此处使用ManagementBaseObject。Get()方法返回一个包含ManagementBaseObject派生类型的(非泛型),包括ManagementObject和ManagementClass 第一个版本可能适用于您的特定查询,但通常您可能会得到无效的强制转换异常 如果您只需要考虑类型管理对象< /代码>的对象,您可以考虑以下版本: var query = new SelectQue

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


这两种代码执行之间的区别是什么

您最好在此处使用
ManagementBaseObject
Get()
方法返回一个包含
ManagementBaseObject
派生类型的(非泛型),包括
ManagementObject
ManagementClass

第一个版本可能适用于您的特定查询,但通常您可能会得到无效的强制转换异常

如果您只需要考虑类型<代码>管理对象< /代码>的对象,您可以考虑以下版本:

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"]);
}
var query=new SelectQuery(“Win32_环境”);
var searcher=新的ManagementObjectSearcher(查询);
foreach(类型()的searcher.Get()中的var envVar)
{
WriteLine(“变量:{0},值={1}”,
envVar[“名称”]、envVar[“变量值”]);
}

您最好在此处使用
ManagementBaseObject
Get()
方法返回一个包含
ManagementBaseObject
派生类型的(非泛型),包括
ManagementObject
ManagementClass

第一个版本可能适用于您的特定查询,但通常您可能会得到无效的强制转换异常

如果您只需要考虑类型<代码>管理对象< /代码>的对象,您可以考虑以下版本:

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"]);
}
var query=new SelectQuery(“Win32_环境”);
var searcher=新的ManagementObjectSearcher(查询);
foreach(类型()的searcher.Get()中的var envVar)
{
WriteLine(“变量:{0},值={1}”,
envVar[“名称”]、envVar[“变量值”]);
}

在这种特殊情况下,没有区别

ManagementObjectSearcher.Get()
方法返回一个值,该值是的集合。这意味着集合可以包含类型为
ManagementBaseObject
或从
ManagementBaseObject
派生的任何类型的实例

但是,
ManagementBaseObject
被设计为基类,这意味着在现实中,它不会被实例化,而是它的子类将被实例化。请注意,这只是一个约定,并不是由语言或框架强制执行的

此外,由于框架中唯一(直接)继承
ManagementBaseObject
的类是,
Get()
有效地返回
ManagementObject
实例的集合。请注意,这只是当前的情况,没有任何东西阻止创建额外的
ManagementBaseObject
继承器

因此,有了所有提到的注意事项,这意味着,如果只使用基类中定义的属性(而不是重写的),则可以以任何一种方式进行迭代,代码的行为将完全相同。在代码中,您只使用了,它实际上是在
ManagementBaseObject
类中定义的,而不是重写的

如果您想要一个在一个循环中失败而在另一个循环中工作的代码示例,可以尝试在
ManagementObject
上定义的任何属性,例如:


在这种特殊情况下,没有区别

ManagementObjectSearcher.Get()
方法返回一个值,该值是的集合。这意味着集合可以包含类型为
ManagementBaseObject
或从
ManagementBaseObject
派生的任何类型的实例

但是,
ManagementBaseObject
被设计为基类,这意味着在现实中,它不会被实例化,而是它的子类将被实例化。请注意,这只是一个约定,并不是由语言或框架强制执行的

此外,由于框架中唯一(直接)继承
ManagementBaseObject
的类是,
Get()
有效地返回
ManagementObject
实例的集合。请注意,这只是当前的情况,没有任何东西阻止创建额外的
ManagementBaseObject
继承器

因此,有了所有提到的注意事项,这意味着,如果只使用基类中定义的属性(而不是重写的),则可以以任何一种方式进行迭代,代码的行为将完全相同。在代码中,您只使用了,它实际上是在
ManagementBaseObject
类中定义的,而不是重写的

如果您想要一个在一个循环中失败而在另一个循环中工作的代码示例,可以尝试在
ManagementObject
上定义的任何属性,例如:


但是请注意,使用
ManagementObject
的第一个版本之所以有效,是因为目前没有从
ManagementBaseObject
派生的其他类型。
Get()
方法的契约并不能保证这一点。添加了更有力的措辞来强调这一事实。虽然我怀疑这些类的设计是否会改变(它们已经存在),但使用这些代码意味着依赖于未经证实和不受支持的假设,使用
ManagementObject
的第一个版本之所以有效,是因为目前没有从
ManagementBaseObject
派生的其他类型。
Get()
方法的契约并不能保证这一点。添加了更有力的措辞来强调这一事实。虽然我怀疑这些类的设计是否会改变(它们已经存在),但使用这些代码意味着依赖于未经证实和不受支持的假设。
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