1

System.ValueType はクラスであり、そこから派生するものはすべて値型であるため、クラスにすることはできません。クラスは参照型であるためです。

System.Enum (System.ValueType を継承する) がクラスとして定義される可能性はありますか?

4

2 に答える 2

2

参照: http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

ValueType は値型の暗黙的な基本クラスですが、ValueType から直接継承するクラスを作成することはできません。代わりに、個々のコンパイラが言語キーワードまたは構成要素 (C# の struct や Visual Basic の Structure…End Structure など) を提供して、値型の作成をサポートします。

ご質問への回答:

すべてのクラスが参照型であると言うのは間違っていますか?

宣言するクラスはすべて参照型になります。したがって、すべてのクラスを参照型と考えることは間違っていないと思います。クラスとして宣言された値型を作成することはできません。struct キーワードを使用する必要があります。enum クラスで表示される内容をエミュレートしようとすると、次のようになります。

  public class Test: ValueType
  {
      public string Text { get; set; }
  }

...エラー「テスト」は特別なクラス「System.ValueType」から派生できません。「ValueType」クラスを特別なものにする魔法の種類はわかりませんが、私が知る限り、すべての .NET 言語ではstruct、独自の値の型を定義するなど、特別なキーワードを使用する必要があります。紛らわしいですが、ボックス化/ボックス化解除、リフレクション(.IsValueType?)、および同様のものを適切に処理するなど、おそらく重要な目的を果たします。

抽象クラスがある場合、それをインスタンス化できないため、ヒープに移動することはありません。参照型のように機能しませんか?

はい。ただし、これは ValueTypes とはまったく異なります。int のような ValueType を宣言し、それに値を代入して渡すことができます。これらはどれも、抽象クラスだけでは機能しません。

名前が示すように、これは他の具象クラスの抽象化です。SomeAbstractClass 型の変数を宣言すると、その抽象クラスを継承する具象クラスへの参照を初期化するまで、何もできません。したがって、その変数とのすべての操作/相互作用は、具象クラスに対して発生します (ただし、抽象クラスの実装の一部を利用する場合があります)。したがって、抽象クラス変数を操作しているときはいつでも、実際には具象クラスを操作しているため、それは依然として参照型であり、ヒープなどのすべてのものは他の参照型と同様に適用されます

于 2013-03-13T00:11:30.490 に答える
2

.NET のすべては System.Object から派生します。

参照型と値型はどちらも、究極の基本クラス Object から派生しています。値型がオブジェクトのように振る舞う必要がある場合、値型を参照オブジェクトのように見せるラッパーがヒープに割り当てられ、値型の値がそこにコピーされます。ラッパーがマークされているため、値の型が含まれていることがシステムに認識されます。このプロセスはボックス化と呼ばれ、逆のプロセスはボックス化解除と呼ばれます。ボックス化とボックス化解除により、任意の型をオブジェクトとして扱うことができます。

http://msdn.microsoft.com/en-us/library/system.valuetype(v=vs.110).aspx

于 2013-03-13T00:12:54.213 に答える