メソッドMethods

Aメソッド型に関連付けられている関数です。A method is a function that is associated with a type. オブジェクト指向のプログラミングで公開し、オブジェクトと型の動作と機能を実装するメソッドを使用します。In object-oriented programming, methods are used to expose and implement the functionality and behavior of objects and types.

構文Syntax

// Instance method definition.
[ attributes ]
member [inline] self-identifier.method-name parameter-list [ : return-type ] =
    method-body

// Static method definition.
[ attributes ]
static member [inline] method-name parameter-list [ : return-type ] =
    method-body

// Abstract method declaration or virtual dispatch slot.
[ attributes ]
abstract member method-name : type-signature

// Virtual method declaration and default implementation.
[ attributes ]
abstract member method-name : type-signature
[ attributes ]
default self-identifier.method-name parameter-list [ : return-type ] =
    method-body

// Override of inherited virtual method.
[ attributes ]
override self-identifier.method-name parameter-list [ : return-type ] =
    method-body

// Optional and DefaultParameterValue attributes on input parameters
[ attributes ]
[ modifier ] member [inline] self-identifier.method-name ([<Optional; DefaultParameterValue( default-value )>] input) [ : return-type ]

RemarksRemarks

前の構文では、メソッドの宣言と定義のさまざまなフォームを表示できます。In the previous syntax, you can see the various forms of method declarations and definitions. 長いメソッド本体では、改行されるように等号 (=) と、メソッド本体の全体がインデントされます。In longer method bodies, a line break follows the equal sign (=), and the whole method body is indented.

属性は、任意のメソッド宣言に適用できます。Attributes can be applied to any method declaration. メソッド定義の構文の前に、個別の行に、通常は一覧表示されます。They precede the syntax for a method definition and are usually listed on a separate line. 詳細については、「属性」を参照してください。For more information, see Attributes.

メソッドをマークするinlineします。Methods can be marked inline. inline の詳細については、「Inline Functions」(インライン関数) を参照してください。For information about inline, see Inline Functions.

非インライン メソッドは、型内で再帰的に使用できます。明示的に使用する必要はありません、recキーワード。Non-inline methods can be used recursively within the type; there is no need to explicitly use the rec keyword.

インスタンス メソッドInstance Methods

インスタンス メソッドを宣言すると、memberキーワードと自己識別子、その後にピリオド (.) とメソッド名とパラメーター。Instance methods are declared with the member keyword and a self-identifier, followed by a period (.) and the method name and parameters. 場合と同様let、バインド、パラメーター リストパターンを指定できます。As is the case for let bindings, the parameter-list can be a pattern. 通常、他の .NET Framework 言語で作成されるときに、F# の方法は、組の形式でのかっこ内のパラメーターの表示方法を囲みます。Typically, you enclose method parameters in parentheses in a tuple form, which is the way methods appear in F# when they are created in other .NET Framework languages. ただし、カリー化された形式 (パラメーターをスペースで区切られた) は一般的でも、その他のパターンもサポートされます。However, the curried form (parameters separated by spaces) is also common, and other patterns are supported also.

次の例では、定義とインスタンスの非抽象メソッドの使用方法を示します。The following example illustrates the definition and use of a non-abstract instance method.

type SomeType(factor0: int) =
   let factor = factor0
   member this.SomeMethod(a, b, c) =
      (a + b + c) * factor

   member this.SomeOtherMethod(a, b, c) =
      this.SomeMethod(a, b, c) * factor

インスタンスのメソッド内では、let バインドを使用して定義されているフィールドにアクセスする、自己識別子を使用しないでください。Within instance methods, do not use the self identifier to access fields defined by using let bindings. その他のメンバーとプロパティにアクセスする場合は、自己識別子を使用します。Use the self identifier when accessing other members and properties.

静的メソッドStatic Methods

キーワードstaticインスタンスがないメソッドを呼び出すことができますを指定するために使用して、オブジェクトのインスタンスに関連付けられていません。The keyword static is used to specify that a method can be called without an instance and is not associated with an object instance. それ以外の場合、メソッドは、インスタンス メソッドです。Otherwise, methods are instance methods.

次のセクションの例で宣言されたフィールドを示しています、letキーワード、プロパティのメンバーを使って宣言する場合、memberキーワード、および静的メソッドで宣言された、staticキーワード。The example in the next section shows fields declared with the let keyword, property members declared with the member keyword, and a static method declared with the static keyword.

次の例は、定義と静的メソッドの使用を示しています。The following example illustrates the definition and use of static methods. これらのメソッド定義であると仮定、SomeTypeクラスは、前のセクションでします。Assume that these method definitions are in the SomeType class in the previous section.

static member SomeStaticMethod(a, b, c) =
   (a + b + c)

static member SomeOtherStaticMethod(a, b, c) =
   SomeType.SomeStaticMethod(a, b, c) * 100

抽象メソッドと仮想メソッドAbstract and Virtual Methods

キーワードabstractメソッドが仮想ディスパッチ スロットを持つクラスの定義がないことを示します。The keyword abstract indicates that a method has a virtual dispatch slot and might not have a definition in the class. A仮想ディスパッチ スロットはオブジェクト指向型の仮想関数を検索する実行時に使用される関数の内部で維持されるテーブル内のエントリを呼び出します。A virtual dispatch slot is an entry in an internally maintained table of functions that is used at run time to look up virtual function calls in an object-oriented type. 仮想ディスパッチ メカニズムを実装するメカニズムは、ポリモーフィズム、オブジェクト指向プログラミングの重要な機能です。The virtual dispatch mechanism is the mechanism that implements polymorphism, an important feature of object-oriented programming. 定義のない 1 つ以上の抽象メソッドを持つクラスは、抽象クラス、つまり、そのクラスのインスタンスを作成できないことができます。A class that has at least one abstract method without a definition is an abstract class, which means that no instances can be created of that class. 抽象クラスの詳細については、次を参照してください。抽象クラスします。For more information about abstract classes, see Abstract Classes.

抽象メソッドの宣言では、メソッド本体は含まれません。Abstract method declarations do not include a method body. 代わりに、メソッドの名前は後にコロン (:) と、メソッドの型シグネチャ。Instead, the name of the method is followed by a colon (:) and a type signature for the method. メソッドの型のシグネチャは、一時停止すると、マウス ポインター経由での Visual Studio コード エディターでメソッドの名前を除くパラメーターの名前のない、IntelliSense によって表示されるのと同じ。The type signature of a method is the same as that shown by IntelliSense when you pause the mouse pointer over a method name in the Visual Studio Code Editor, except without parameter names. 型のシグネチャは、対話形式で作業している場合にも、インタープリター fsi.exe をで表示されます。Type signatures are also displayed by the interpreter, fsi.exe, when you are working interactively. 戻り値の型の適切な区切り記号の後に、パラメーターの型を一覧することにより、メソッドの型シグネチャが形成されます。The type signature of a method is formed by listing out the types of the parameters, followed by the return type, with appropriate separator symbols. カリー化されたパラメーターを指定する->タプルのパラメーターを指定して*します。Curried parameters are separated by -> and tuple parameters are separated by *. 戻り値がによって引数から常に区切られた、->シンボル。The return value is always separated from the arguments by a -> symbol. かっこは、パラメーター、関数型の場合など、複雑なパラメーターをグループ化するかを示すタプルが扱われると、2 つのパラメーターとしてではなく、1 つのパラメーターとして使用できます。Parentheses can be used to group complex parameters, such as when a function type is a parameter, or to indicate when a tuple is treated as a single parameter rather than as two parameters.

与えることができますも抽象メソッド default 定義、クラスを定義を追加しを使用して、defaultキーワードは、このトピックの「構文のブロックに示されました。You can also give abstract methods default definitions by adding the definition to the class and using the default keyword, as shown in the syntax block in this topic. 同じクラスの定義を持つ抽象メソッドは、他の .NET Framework 言語での仮想メソッドと同じです。An abstract method that has a definition in the same class is equivalent to a virtual method in other .NET Framework languages. 定義が存在するかどうか、abstractキーワードは、クラスの仮想関数テーブルに新しいディスパッチ スロットを作成します。Whether or not a definition exists, the abstract keyword creates a new dispatch slot in the virtual function table for the class.

派生クラスは基底クラスが抽象メソッドを実装するかどうかに関係なく、抽象メソッドの実装を提供できます。Regardless of whether a base class implements its abstract methods, derived classes can provide implementations of abstract methods. 使用してを除く、派生クラスで、同じ名前とシグネチャを持つメソッドを定義する派生クラスで抽象メソッドを実装するために、overrideまたはdefaultキーワード、メソッド本体を提供します。To implement an abstract method in a derived class, define a method that has the same name and signature in the derived class, except use the override or default keyword, and provide the method body. キーワードoverridedefaultまったく同じことを意味します。The keywords override and default mean exactly the same thing. 使用して、override新しいメソッドは、基本クラス実装をオーバーライドする場合を使用して、defaultは元の抽象宣言と同じクラスで実装を作成するとします。Use override if the new method overrides a base class implementation; use default when you create an implementation in the same class as the original abstract declaration. 使用しないでください、abstract抽象基本クラスで宣言されたメソッドを実装するメソッドのキーワード。Do not use the abstract keyword on the method that implements the method that was declared abstract in the base class.

次の例は、抽象メソッドを示しています。Rotateを持つ既定の実装では、.NET Framework の仮想メソッドに相当します。The following example illustrates an abstract method Rotate that has a default implementation, the equivalent of a .NET Framework virtual method.

type Ellipse(a0 : float, b0 : float, theta0 : float) =
    let mutable axis1 = a0
    let mutable axis2 = b0
    let mutable rotAngle = theta0
    abstract member Rotate: float -> unit
    default this.Rotate(delta : float) = rotAngle <- rotAngle + delta

次の例は、基底クラス メソッドをオーバーライドする派生クラスを示しています。The following example illustrates a derived class that overrides a base class method. この場合、オーバーライドでは、何も実行するために、動作が変わります。In this case, the override changes the behavior so that the method does nothing.

type Circle(radius : float) =
    inherit Ellipse(radius, radius, 0.0)
     // Circles are invariant to rotation, so do nothing.
    override this.Rotate(_) = ()

オーバーロードされたメソッドOverloaded Methods

オーバー ロードされたメソッドは、特定の型で同じ名前があるが、異なる引数を指定する方法です。Overloaded methods are methods that have identical names in a given type but that have different arguments. F#、省略可能な引数は、通常、オーバー ロードされたメソッドの代わりに使用します。In F#, optional arguments are usually used instead of overloaded methods. ただし、オーバー ロードされたメソッドは、されるとき、引数が、組形式いないカリー化された形式では、言語では、許可されます。However, overloaded methods are permitted in the language, provided that the arguments are in tuple form, not curried form.

省略可能な引数Optional Arguments

以降でF#4.1、メソッドで、既定パラメーター値は省略可能な引数を用意することもできます。Starting with F# 4.1, you can also have optional arguments with a default parameter value in methods. これは、c# コードとの相互運用の促進を支援します。This is to help facilitate interoperation with C# code. 次の例では、構文を示しています。The following example demonstrates the syntax:

// A class with a method M, which takes in an optional integer argument.
type C() =
    __.M([<Optional; DefaultParameterValue(12)>] i) = i + 1

値が渡されたメモDefaultParameterValue入力の型に一致する必要があります。Note that the value passed in for DefaultParameterValue must match the input type. 上記のサンプルでは、intします。In the above sample, it is an int. 整数以外の値を渡そうとしたDefaultParameterValueコンパイル エラーになります。Attempting to pass a non-integer value into DefaultParameterValue would result in a compile error.

例:プロパティとメソッドExample: Properties and Methods

次の例には、フィールド、プライベート関数、プロパティ、および静的メソッドの例を紹介する型が含まれています。The following example contains a type that has examples of fields, private functions, properties, and a static method.

type RectangleXY(x1 : float, y1: float, x2: float, y2: float) =
    // Field definitions.
    let height = y2 - y1
    let width = x2 - x1
    let area = height * width
    // Private functions.
    static let maxFloat (x: float) (y: float) =
      if x >= y then x else y
    static let minFloat (x: float) (y: float) =
      if x <= y then x else y
    // Properties.
    // Here, "this" is used as the self identifier,
    // but it can be any identifier.
    member this.X1 = x1
    member this.Y1 = y1
    member this.X2 = x2
    member this.Y2 = y2
    // A static method.
    static member intersection(rect1 : RectangleXY, rect2 : RectangleXY) =
       let x1 = maxFloat rect1.X1 rect2.X1
       let y1 = maxFloat rect1.Y1 rect2.Y1
       let x2 = minFloat rect1.X2 rect2.X2
       let y2 = minFloat rect1.Y2 rect2.Y2
       let result : RectangleXY option =
         if ( x2 > x1 && y2 > y1) then
           Some (RectangleXY(x1, y1, x2, y2))
         else
           None
       result

// Test code.
let testIntersection =
    let r1 = RectangleXY(10.0, 10.0, 20.0, 20.0)
    let r2 = RectangleXY(15.0, 15.0, 25.0, 25.0)
    let r3 : RectangleXY option = RectangleXY.intersection(r1, r2)
    match r3 with
    | Some(r3) -> printfn "Intersection rectangle: %f %f %f %f" r3.X1 r3.Y1 r3.X2 r3.Y2
    | None -> printfn "No intersection found."

testIntersection

関連項目See also