in the Common Type System 値型
[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 空白のトピックは、プレースホルダーとして挿入されています。]
ほとんどのプログラミング言語、整数やは引数として渡されたときにコピーされる浮動小数点数などの組み込みのデータ型を提供する (つまり、渡された値によって)。 .NET Framework でこれらには値の種類と呼ばれます。 ランタイムは、2 種類の値の種類をサポートしています。
組み込みの値型
.NET Framework では 組み込み値の種類、対応されはプログラミング言語によって使用されるプリミティブ データ型と同じ System.Int32 や System.Boolean などが定義されています。
ユーザー定義の値型
使用する言語がするため方法を提供 System.ValueType または System.Enum から派生する独自の値型を定義します。 小さな値を表す型を定義する場合を複素数 (2 つの浮動小数点数値を使用)、such as ができます値によって効率的値の種類を渡さできるため、値の種類として定義します。 定義する型は参照によって効率的渡さは場合、する必要がありますして定義クラスを代わりにします。
列挙体に関する情報を「共通型システムの列挙」を参照してください。
値の種類は、プリミティブ型、限り効率的として格納されますまだそれら自体の値の種類に定義されているすべてのメソッドと同様に、System.Object および System.ValueType クラスで定義された仮想メソッドを含むにメソッドを呼び出してできます。 値の型のインスタンスを作成パラメータとして渡すにローカル変数として保存したり、別の値の型またはオブジェクトのフィールドに格納します。 値の型をクラスのインスタンスを格納すると関連するオーバーヘッドしないコンストラクタを必要としません。
値の各種類のランタイムは対応するボックス化された型を同じ状態と、値の種類として動作を持つクラスであるを提供します。 一部の言語ボックス化変換された種類が必要なときに特別な構文を使用する必要があります。 他のユーザーに自動的にボックス化変換された種類を使用してが必要な場合、します。 値の種類を定義するとき、ボックス化されたおよび unboxed の種類の両方は定義します。
フィールド、プロパティ、およびイベントに値型ことができます。 静的と非静的メソッドにすることもできます。 これらはボックス化し System.ValueType 、 から仮想メソッドを継承し、0 個以上のインターフェイスを実装することができます。
値の型はシールを他のタイプから派生できるなしにことを意味します。 ただし、直接値タイプには、仮想メソッドを定義できますしかボックス化変換されたまたは unboxed の形式の種類でこれらのメソッドを呼び出せません。 値の種類から別の種類を派生することはできません、はで非仮想または静的メソッドよりも仮想メソッドを使用する方が便利な言語を使用している場合、値の種類に仮想メソッドを定義できます。
次の使用例では複素数の値の型を使って記述します。
[Visual Basic]
Option Strict
Option Explicit
Imports System
' Value type definition for a complex number representation.
Public Structure Complex
Public r, i As Double
' Constructor.
Public Sub New(r As Double, i As Double)
Me.r = r
Me.i = i
End Sub
' Returns one divided by the current value.
Public ReadOnly Property Reciprocal() As Complex
Get
If r = 0.0 And i = 0.0 Then
Throw New DivideByZeroException()
End If
Dim div As Double = r * r + i * i
Return New Complex(r / div, -i / div)
End Get
End Property
' Conversion methods.
Public Shared Function ToDouble(a As Complex) As Double
Return a.r
End Function
Public Shared Function ToComplex(r As Double) As Complex
Return New Complex(r, 0.0)
End Function
' Basic unary methods.
Public Shared Function ToPositive(a As Complex) As Complex
Return a
End Function
Public Shared Function ToNegative(a As Complex) As Complex
Return New Complex(-a.r, -a.i)
End Function
' Basic binary methods for addition, subtraction, multiplication, and division.
Public Shared Function Add(a As Complex, b As Complex) As Complex
Return New Complex(a.r + b.r, a.i + b.i)
End Function
Public Shared Function Subtract(a As Complex, b As Complex) As Complex
Return New Complex(a.r - b.r, a.i - b.i)
End Function
Public Shared Function Multiply(a As Complex, b As Complex) As Complex
Return New Complex(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r)
End Function
Public Shared Function Divide(a As Complex, b As Complex) As Complex
Return Multiply(a, b.Reciprocal)
End Function
' Override the ToString method so the value appears in write statements.
Public Overrides Function ToString As String
Return String.Format("({0}+{1}i)", r, i)
End Function
End Structure
' Entry point.
Public Class ValueTypeSample
Public Shared Sub Main()
Dim a As New Complex(0, 1)
Dim b As New Complex(0, - 2)
Console.WriteLine()
Console.WriteLine("a = " & a.ToString)
Console.WriteLine("b = " & b.ToString)
Console.WriteLine()
Console.WriteLine("a + b = " & Complex.Add(a, b).ToString)
Console.WriteLine("a - b = " & Complex.Subtract(a, b).ToString)
Console.WriteLine("a * b = " & Complex.Multiply(a, b).ToString)
Console.WriteLine("a / b = " & Complex.Divide(a, b).ToString)
Console.WriteLine()
Console.WriteLine("(double)a = " & Complex.ToDouble(a).ToString)
Console.WriteLine("(Complex)5 = " & Complex.ToComplex(5).ToString)
End Sub
End Class
[C#]
using System;
// Value type definition for a complex number representation.
public struct Complex
{
public double r, i;
// Constructor.
public Complex(double r, double i) { this.r = r; this.i = i; }
// Returns one divided by the current value.
public Complex Reciprocal
{
get
{
if (r == 0d && i == 0d)
throw new DivideByZeroException();
double div = r*r + i*i;
return new Complex(r/div, -i/div);
}
}
// Conversion operators.
public static explicit operator double(Complex a)
{
return a.r;
}
public static implicit operator Complex(double r)
{
return new Complex(r,0d);
}
// Basic unary operators.
public static Complex operator + (Complex a)
{
return a;
}
public static Complex operator - (Complex a)
{
return new Complex(-a.r, -a.i);
}
// Basic binary operators for addition, subtraction, multiplication, and division.
public static Complex operator + (Complex a, Complex b)
{
return new Complex(a.r + b.r, a.i + b.i);
}
public static Complex operator - (Complex a, Complex b)
{
return new Complex(a.r - b.r, a.i - b.i);
}
public static Complex operator * (Complex a, Complex b)
{
return new Complex(a.r*b.r - a.i*b.i, a.r*b.i + a.i*b.r);
}
public static Complex operator / (Complex a, Complex b)
{
return a * b.Reciprocal;
}
// Override the ToString method so the value appears in write statements.
public override string ToString() {
return String.Format("({0}+{1}i)", r, i);
}
}
// Entry point.
public class ValueTypeSample
{
public static void Main()
{
Complex a = new Complex(0, 1);
Complex b = new Complex(0, -2);
Console.WriteLine();
Console.WriteLine("a = " + a);
Console.WriteLine("b = " + b);
Console.WriteLine();
Console.WriteLine("a + b = " + (a+b));
Console.WriteLine("a - b = " + (a-b));
Console.WriteLine("a * b = " + (a*b));
Console.WriteLine("a / b = " + (a/b));
Console.WriteLine();
Console.WriteLine("(double)a = " + (double)a);
Console.WriteLine("(Complex)5 = " + (Complex)5);
}
}
このプログラムから、出力はようになります。
a = (0+1i)
b = (0+-2i)
a + b = (0+-1i)
a - b = (0+3i)
a * b = (2+0i)
a / b = (-0.5+0i)
(double)a = 0
(Complex)5 = (5+0i)