# 構造体Structures

## 構文Syntax

[ attributes ]
type [accessibility-modifier] type-name =
struct
type-definition-elements-and-members
end
// or
[ attributes ]
[<StructAttribute>]
type [accessibility-modifier] type-name =
type-definition-elements-and-members


## 解説Remarks

の構文の型定義要素とメンバーは、メンバーの宣言と定義を表します。The type-definition-elements-and-members in the previous syntax represents member declarations and definitions. 構造体にはコンス トラクター、可変フィールド、および不変フィールドを含めることができ、メンバーとインターフェイス実装を宣言できます。Structures can have constructors and mutable and immutable fields, and they can declare members and interface implementations. 詳細については、「メンバー」を参照してください。For more information, see Members.

// In Point3D, three immutable values are defined.
// x, y, and z will be initialized to 0.0.
type Point3D =
struct
val x: float
val y: float
val z: float
end

// In Point2D, two immutable values are defined.
// It also has a member which computes a distance between itself and another Point2D.
// Point2D has an explicit constructor.
// You can create zero-initialized instances of Point2D, or you can
// pass in arguments to initialize the values.
type Point2D =
struct
val X: float
val Y: float
new(x: float, y: float) = { X = x; Y = y }

member this.GetDistanceFrom(p: Point2D) =
let dX = (p.X - this.X) ** 2.0
let dY = (p.Y - this.Y) ** 2.0

dX + dY
|> sqrt
end


## 構造体ByRefLike structs

like セマンティクスにbyref準拠できる独自の構造体を定義できます。 ByrefsYou can define your own structs that can adhere to byref-like semantics: see Byrefs for more information. これはIsByRefLikeAttribute属性で行われます。This is done with the IsByRefLikeAttribute attribute:

open System
open System.Runtime.CompilerServices

[<IsByRefLike; Struct>]
type S(count1: Span<int>, count2: Span<int>) =
member x.Count1 = count1
member x.Count2 = count2


IsByRefLikeは をStruct意味しません。IsByRefLike does not imply Struct. 両方とも型に存在する必要があります。Both must be present on the type.

F#byrefの "-like" 構造体は、スタックにバインドされた値型です。A "byref-like" struct in F# is a stack-bound value type. マネージ ヒープには割り当てが行きまとい。It is never allocated on the managed heap. byref-like 構造体は、有効期間と非キャプチャに関する強力なチェックのセットで実施される、高性能プログラミングに役立ちます。A byref-like struct is useful for high-performance programming, as it is enforced with set of strong checks about lifetime and non-capture. ルールは次のとおりです。The rules are:

• 関数パラメーター、メソッドパラメーター、ローカル変数、メソッドの戻り値として使用できます。They can be used as function parameters, method parameters, local variables, method returns.
• クラスの静的メンバーまたはインスタンス メンバー、または通常の構造体にはできません。They cannot be static or instance members of a class or normal struct.
• これらの関数は、どのクロージャ構造async(メソッドまたはラムダ式) でもキャプチャできません。They cannot be captured by any closure construct (async methods or lambda expressions).
• ジェネリック パラメーターとして使用することはできません。They cannot be used as a generic parameter.

これらのルールは、使用を非常に強く制限しますが、安全な方法で高性能コンピューティングの約束を果たすために行います。Although these rules very strongly restrict usage, they do so to fulfill the promise of high-performance computing in a safe manner.

[<IsReadOnly; Struct>]
type S(count1: int, count2: int) =
member x.Count1 = count1
member x.Count2 = count2


IsReadOnlyは をStruct意味しません。IsReadOnly does not imply Struct. 構造体を持つには、両方IsReadOnlyを追加する必要があります。You must add both to have an IsReadOnly struct.

この属性を使用すると、F# と C# がそれぞれとinref<'T>を扱うようにin ref知らせるメタデータが生成されます。Use of this attribute emits metadata letting F# and C# know to treat it as inref<'T> and in ref, respectively.

## 構造体レコードと判別共用体Struct Records and Discriminated Unions

この[<Struct>]属性を使用して、レコードおよび判別共用体を構造体として表すことができます。You can represent Records and Discriminated Unions as structs with the [<Struct>] attribute. 詳細については、各記事をご覧ください。See each article to learn more.