2

次の両方のコードをコンパイルすると、同じ結果が得られます(そう思います)。

//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"]);

両方のコード実行の違いは何ですか...?

4

2 に答える 2

3

この特定のケースでは、違いはありません。

このManagementObjectSearcher.Get()メソッドManagementObjectCollectionは、 のコレクションである を 返しますManagementBaseObject。つまり、コレクションには、タイプのインスタンス、ManagementBaseObjectまたは から派生した任意のタイプのインスタンスを含めることができますManagementBaseObject

ただし、ManagementBaseObjectは基底クラスとして設計されているため、実際にはインスタンス化されず、その下位クラスがインスタンス化されます。これは単なる規則であり、言語やフレームワークによって強制されるものではないことに注意してください。

さらに、 を (直接) 継承するフレームワーク内の唯一のクラスは であるためManagementBaseObjectManagementObjectGet()実質的にインスタンスのコレクションを返しManagementObjectます。これは現在の状況であり、追加のManagementBaseObject継承者の作成を妨げるものは何もないことに注意してください。

したがって、前述のすべての注意事項を踏まえると、基本クラスで定義された (オーバーライドされていない) プロパティのみを使用する場合は、どちらの方法でも反復でき、コードはまったく同じように動作します。コードでは、クラスで実際に定義されており、オーバーライドされていないindexerManagementBaseObjectのみを使用します。

1 つのループで失敗し、別のループで機能するコードの例が必要な場合は、たとえばPathManagementObjectのように、 で定義されている任意のプロパティを試すことができます。

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
于 2013-01-29T12:28:39.687 に答える
1

できればManagementBaseObjectここを使ってください。このメソッドは、およびを含む派生型を含むGet()(非ジェネリック) を返します。ManagementObjectCollectionManagementBaseObjectManagementObjectManagementClass

最初のバージョンは特定のクエリで機能する場合がありますが、一般に、無効なキャスト例外が発生する可能性があります。

タイプのオブジェクトのみを考慮する必要がある場合は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"]);
}
于 2013-01-29T12:28:08.987 に答える