3

Type Forwarding を使用してクラス参照を別のアセンブリに転送する場合、そのクラスは Type から継承する必要がありますか?

私が本当に求めているのは、タイプ転送のフレーズと概念の「タイプ」という言葉が何を意味するのか、または何を示しているのかということだと思います。

4

2 に答える 2

14

Type Forwarding を使用してクラス参照を別のアセンブリに転送する場合、そのクラスは Type から継承する必要がありますか?

いいえ。

私が本当に求めているのは、タイプ転送のフレーズと概念の「タイプ」という言葉が何を意味するのか、または何を示しているのかということだと思います。

アセンブリ Alpha に型 Foo があり、次のバージョンで、Foo がアセンブリ Bravo にあるべきだったことに気付いたとします。アルファ版の Foo に依存しているすべての顧客が壊れてしまうため、型を移動することはできません。

解決策は、タイプ Foo を Bravo に移動してから、Alpha のユーザーに「Foo を探している場合、Bravo にある」ことを伝えるタイプ フォワーダーを含む新しいバージョンの Alpha を出荷することです。そうすれば、以前のやり方に依存している人々を壊すことはありません。

ここで欠けているのは、タイプ転送の概念における「タイプ」の定義です。タイプとしての資格は何ですか?

以下は型定義です。

  • 非ジェネリックまたは非構築のジェネリック クラス、構造体、インターフェイス、およびデリゲート
  • 列挙

次のものは型参照です(それらはすべて別の型を参照します。これらはいずれも新しいものを定義しません)。

  • 構築されたジェネリック クラス、構造体、インターフェイス、およびデリゲート
  • 配列
  • ポインタ
  • nullable

(そして、どちらのカテゴリにも当てはまらない型が 1 つあります。これは、戻り値の型「void」です。)

これらすべてのタイプのうち、転送できるのはタイプ定義だけです。型フォワーダーの目的は、「このアセンブリによって定義されていた型が、そのアセンブリによって定義されるようになった」ということです。タイプを転送することはできませんMyStruct<int>[]。それは意味がありません。転送できますMyStruct<T>

「構築されていないジェネリック クラス」とはどういう意味ですか?これは、指定された型でインスタンス化されたジェネリックではなく、ジェネリックの定義のみを意味しますか?

正しい。

また、「型参照」と「型定義」に関する情報を見つけた場所を教えていただけますか?

これらは C# 言語仕様の概念ではありません。むしろ、これらは基礎となる共通言語インフラストラクチャ タイプ システムの概念です。定義された型と参照された型の間で CLI がどのように異なるかについての詳細な技術的考察については、ECMA 335 CLI 仕様を読み、特に TypeDef と TypeRef のメタデータ テーブルに関するセクションを探してください。

于 2011-01-08T20:14:29.930 に答える
10

少し紛らわしいトピックなので、ここに段階的な例を示します.Ericの回答の名前を使用して、一貫性を保つのに役立ちます. 1 つのライブラリ (Alpha.dll) から始めて、Alpha に依存するアプリケーション (Test.exe) を構築します。次に、Test.exe を再コンパイルせずに、Test.exe が依存する型 (Foo) を別のライブラリ (Bravo.dll) に移動します。

  1. 次のファイルを作成します。

    Foo.cs

    using System;
    
    public class Foo
    {
        public static void Report()
        {
            Console.WriteLine("Foo.Report");
        }
    }
    

    Test.cs

    class Test
    {
        static void Main()
        {
            Foo.Report();
        }
    }
    
  2. Alpha.dll をビルドします。

    csc /target:library /out:Alpha.dll Foo.cs
    
  3. Test.exe をビルドします。

    csc /r:Alpha.dll Test.cs
    
  4. Test.exe を実行します。明らかな出力が得られるはずです。

  5. Bravo.dll をビルドします。

    csc /target:library /out:Bravo.dll Foo.cs
    
  6. 新しいファイルForwarding.csを作成します。

    using System.Runtime.CompilerServices;
    [assembly:TypeForwardedTo(typeof(Foo))]
    
  7. Alpha.dll を再コンパイルします。

    csc /r:Bravo.dll /target:library /out:Alpha.dll Forwarding.cs
    

    Alpha で Foo のコードを含めていないことに注意してください。

  8. Test.exe を実行します - Test.exe が Alpha.dll 内の Foo への参照を要求するという事実にもかかわらず、それでも機能します... CLR は単にそれを Bravo.dll にリダイレクトします。

    Test.exe を見ると、まだ Alpha を参照しています。Alpha.dll を調べると、Foo 型のコードがなくなっていることがわかります。すべてがぶら下がっているのは型の転送のみです。

于 2011-01-08T20:27:04.843 に答える