ホームページ >バックエンド開発 >C++ >C# の `ref` および `out` パラメーターでポリモーフィズムが機能しないのはなぜですか?

C# の `ref` および `out` パラメーターでポリモーフィズムが機能しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-27 21:15:09255ブラウズ

Why Doesn't Polymorphism Work with `ref` and `out` Parameters in C#?

'ref' および 'out' パラメータにおけるポリモーフィズムの制限

オブジェクト指向プログラミングの基本概念であるポリモーフィズムにより、さまざまなオブジェクトが許可されます。型は共通のスーパータイプのオブジェクトとして扱われます。ただし、「ref」パラメータと「out」パラメータに関しては、ポリモーフィズムはサポートされていません。

理由を理解するには、次のコードを検討してください。

class A {}
class B : A {}
class C
{
    C()
    {
        var b = new B();
        Foo(b);
        Foo2(ref b); // Compile-time error: "The 'ref' argument doesn't match the parameter type"
    }

    void Foo(A a) {}
    void Foo2(ref A a) {}  
}

このコードはコンパイルできません。 「ref」および「out」パラメータはサポートできないため、「B」への参照を使用して「Foo2」が呼び出されたとき

この制限の背後にある理由を調べてみましょう:

  • カプセル化: 'ref' パラメーターと 'out' パラメーターは基になる変数の参照を公開し、それを可能にします。変更される。ポリモーフィズムがサポートされていれば、基本型を期待するメソッドに派生型のオブジェクトを渡すことが可能になります。ただし、メソッドが変数に書き込む場合、派生型に固有のデータが含まれる可能性があるため、予期しない動作が発生する可能性があります。
  • タイプ セーフティ: 'ref' または ' を渡すときout' パラメータを使用すると、コンパイラは変数の型がパラメータの型と一致することを確認します。これにより型の安全性が確保され、無効な代入が防止されます。ポリモーフィズムを許可すると、変数の実際の型が実行時に変わる可能性があるため、不確実性が生じます。
  • パフォーマンスに関する考慮事項: 'ref' または 'out' パラメーターを使用したポリモーフィズムでは、追加の実行時チェックが必要になります。変数の型がパラメータの型と一致するため、パフォーマンスが低下する可能性があります。

結論として、ポリモーフィズムはオブジェクト指向プログラミングの強力な機能ですが、カプセル化、型安全性、およびパフォーマンスを考慮すると、'ref' および 'out' パラメーターではサポートされていません。 .

以上がC# の `ref` および `out` パラメーターでポリモーフィズムが機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。