名前付き引数と省略可能な引数 (C# プログラミング ガイド)Named and Optional Arguments (C# Programming Guide)

C# 4 では、名前付き引数と省略可能な引数が導入されています。 introduces named and optional arguments. 名前付き引数を使用すると、パラメーター リストのパラメーターの位置ではなく、パラメーター名に引数を関連付けることによって、特定のパラメーターの引数を指定できます。Named arguments enable you to specify an argument for a particular parameter by associating the argument with the parameter's name rather than with the parameter's position in the parameter list. 省略可能な引数を使用すると、一部のパラメーターの引数を省略できます。Optional arguments enable you to omit arguments for some parameters. 両方の手法をメソッド、インデクサー、コンストラクター、デリゲートで使用できます。Both techniques can be used with methods, indexers, constructors, and delegates.

名前付き引数と省略可能な引数を使用すると、引数は、パラメーター リストではなく、引数リストに記述されている順に評価されます。When you use named and optional arguments, the arguments are evaluated in the order in which they appear in the argument list, not the parameter list.

名前付きパラメーターと省略可能なパラメーターを併用する場合、省略可能なパラメーターのリストにあるパラメーターのうち、ごく一部のパラメーターに対してのみ引数を指定できます。Named and optional parameters, when used together, enable you to supply arguments for only a few parameters from a list of optional parameters. この機能により、Microsoft Office オートメーション API などの COM インターフェイスの呼び出しが大幅に円滑化します。This capability greatly facilitates calls to COM interfaces such as the Microsoft Office Automation APIs.

名前付き引数Named Arguments

名前付き引数を使用すると、呼び出されたメソッドのパラメーター リストに記述されているパラメーターの順序を記憶したり、検索したりする必要がなくなります。Named arguments free you from the need to remember or to look up the order of parameters in the parameter lists of called methods. 各引数のパラメーターはパラメーター名で指定できます。The parameter for each argument can be specified by parameter name. たとえば、注文の詳細を出力する関数 (など、販売者名、注文数と製品名) 関数によって定義された順序で、位置による引数を送信することによって、標準の方法で呼び出すことができます。For example, a function that prints order details (such as, seller name, order number & product name) can be called in the standard way by sending arguments by position, in the order defined by the function.

PrintOrderDetails("Gift Shop", 31, "Red Mug");

パラメーターの順序を覚えていないの名前を把握する場合は、任意の順序で引数を送信することができます。If you do not remember the order of the parameters but know their names, you can send the arguments in any order.

PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");

PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31);

また、名前付き引数を使用すると、各引数が表すものが識別しやすくなり、コードが読みやすくなります。Named arguments also improve the readability of your code by identifying what each argument represents. 次のメソッドの例で、 sellerName null または空白にすることはできません。In the example method below, the sellerName cannot be null or whitespace. 両方とsellerNameproductName文字列型の場合は、位置による引数を送信する、代わりにすると良い名前付き引数を使用して、2 つのあいまいさを解消し、コードを読むすべてのユーザーの混乱を削減します。As both sellerName and productName are string types, instead of sending arguments by position, it makes sense to use named arguments to disambiguate the two and reduce confusion for anyone reading the code.

有効な名前付き引数の位置指定引数を使用すると、限りNamed arguments, when used with positional arguments, are valid as long as

  • 位置指定引数を受け取らず、している従わないまたはthey're not followed by any positional arguments, or

PrintOrderDetails("Gift Shop", 31, productName: "Red Mug");

  • 以降で c# 7.2、正しい位置で使用されています。starting with C# 7.2, they're used in the correct position. 次の例で、パラメーターでorderNum正しい位置にあるが、明示的に指定されていません。In the example below, the parameter orderNum is in the correct position but isn't explicitly named.

PrintOrderDetails(sellerName: "Gift Shop", 31, productName: "Red Mug");

ただし、順序不定な名前付き引数は、位置指定引数が続いている場合に有効ではありません。However, out-of-order named arguments are invalid if they're followed by positional arguments.

// This generates CS1738: Named argument specifications must appear after all fixed arguments have been specified.
PrintOrderDetails(productName: "Red Mug", 31, "Gift Shop");

Example

次のコードでは、いくつかの追加機能と共に、このセクションの例を実装します。The following code implements the examples from this section along with some additional ones.

class NamedExample
{
    static void Main(string[] args)
    {
        // The method can be called in the normal way, by using positional arguments.
        PrintOrderDetails("Gift Shop", 31, "Red Mug");

        // Named arguments can be supplied for the parameters in any order.
        PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");
        PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31);

        // Named arguments mixed with positional arguments are valid
        // as long as they are used in their correct position.
        PrintOrderDetails("Gift Shop", 31, productName: "Red Mug");
        PrintOrderDetails(sellerName: "Gift Shop", 31, productName: "Red Mug");    // C# 7.2 onwards
        PrintOrderDetails("Gift Shop", orderNum: 31, "Red Mug");                   // C# 7.2 onwards

        // However, mixed arguments are invalid if used out-of-order.
        // The following statements will cause a compiler error.
        // PrintOrderDetails(productName: "Red Mug", 31, "Gift Shop");
        // PrintOrderDetails(31, sellerName: "Gift Shop", "Red Mug");
        // PrintOrderDetails(31, "Red Mug", sellerName: "Gift Shop");
    }

    static void PrintOrderDetails(string sellerName, int orderNum, string productName)
    {
        if (string.IsNullOrWhiteSpace(sellerName))
        {
            throw new ArgumentException(message: "Seller name cannot be null or empty.", paramName: nameof(sellerName));
        }

        Console.WriteLine($"Seller: {sellerName}, Order #: {orderNum}, Product: {productName}");
    }
}

省略可能な引数Optional Arguments

メソッド、コンストラクター、インデクサー、デリゲートの定義では、そのパラメーターが必須であるか、省略可能であるかを指定できます。The definition of a method, constructor, indexer, or delegate can specify that its parameters are required or that they are optional. どの呼び出しでも、すべての必須パラメーターに対して引数を指定する必要があります。ただし、省略可能なパラメーターの引数は省略できます。Any call must provide arguments for all required parameters, but can omit arguments for optional parameters.

省略可能な各パラメーターには、パラメーターの定義に既定値が含まれています。Each optional parameter has a default value as part of its definition. そのパラメーターの引数を渡さない場合、既定値が使用されます。If no argument is sent for that parameter, the default value is used. 既定値には、次のいずれかの種類の式を指定できます。A default value must be one of the following types of expressions:

  • 定数式a constant expression;

  • new ValType() 形式の式です。ValType は、enumstruct のような値型になります。an expression of the form new ValType(), where ValType is a value type, such as an enum or a struct;

  • default(ValType) 形式の式です。ValType は値型です。an expression of the form default(ValType), where ValType is a value type.

省略可能なパラメーターは、パラメーター リストの末尾で必須パラメーターの後に定義されます。Optional parameters are defined at the end of the parameter list, after any required parameters. 呼び出し元は、連続する省略可能なパラメーターのいずれか 1 つに対して引数を指定する場合、先行するすべての省略可能なパラメーターに引数を指定する必要があります。If the caller provides an argument for any one of a succession of optional parameters, it must provide arguments for all preceding optional parameters. 引数リストでは、スペースをコンマで区切ることはできません。Comma-separated gaps in the argument list are not supported. たとえば、次のコードでは、1 つの必須パラメーターと 2 つの省略可能パラメーターでインスタンス メソッド ExampleMethod が定義されます。For example, in the following code, instance method ExampleMethod is defined with one required and two optional parameters.

public void ExampleMethod(int required, string optionalstr = "default string",
    int optionalint = 10)

次に示す ExampleMethod の呼び出しでは、3 つ目のパラメーターに引数が指定されていますが、2 つ目のパラメーターには指定されていないため、コンパイル エラーが発生します。The following call to ExampleMethod causes a compiler error, because an argument is provided for the third parameter but not for the second.

//anExample.ExampleMethod(3, ,4);

ただし、3 つ目のパラメーターの名前がわかっている場合、名前付き引数を使用してタスクを実行できます。However, if you know the name of the third parameter, you can use a named argument to accomplish the task.

anExample.ExampleMethod(3, optionalint: 4);

次の例に示すように、IntelliSense では、省略可能なパラメーターを角かっこで示します。IntelliSense uses brackets to indicate optional parameters, as shown in the following illustration.

ExampleMethod メソッドの IntelliSense によるクイック ヒントIntelliSense Quick Info for method ExampleMethod.
ExampleMethod の省略可能なパラメーターOptional parameters in ExampleMethod

注意

また、.NET OptionalAttribute クラスを使用して省略可能なパラメーターを宣言することもできます。You can also declare optional parameters by using the .NET OptionalAttribute class. OptionalAttribute パラメーターに既定値は必要ありません。OptionalAttribute parameters do not require a default value.

Example

次の例では、ExampleClass のコンストラクターに省略可能なパラメーターが 1 つあります。In the following example, the constructor for ExampleClass has one parameter, which is optional. ExampleMethod インスタンス メソッドには、required という 1 つの必須パラメーターと、optionalstroptionalint という 2 つの省略可能なパラメーターがあります。Instance method ExampleMethod has one required parameter, required, and two optional parameters, optionalstr and optionalint. Main のコードに示すように、いくつかの異なる方法でコンストラクターとメソッドを呼び出すことができます。The code in Main shows the different ways in which the constructor and method can be invoked.

namespace OptionalNamespace
{
    class OptionalExample
    {
        static void Main(string[] args)
        {
            // Instance anExample does not send an argument for the constructor's
            // optional parameter.
            ExampleClass anExample = new ExampleClass();
            anExample.ExampleMethod(1, "One", 1);
            anExample.ExampleMethod(2, "Two");
            anExample.ExampleMethod(3);

            // Instance anotherExample sends an argument for the constructor's
            // optional parameter.
            ExampleClass anotherExample = new ExampleClass("Provided name");
            anotherExample.ExampleMethod(1, "One", 1);
            anotherExample.ExampleMethod(2, "Two");
            anotherExample.ExampleMethod(3);

            // The following statements produce compiler errors.

            // An argument must be supplied for the first parameter, and it
            // must be an integer.
            //anExample.ExampleMethod("One", 1);
            //anExample.ExampleMethod();

            // You cannot leave a gap in the provided arguments. 
            //anExample.ExampleMethod(3, ,4);
            //anExample.ExampleMethod(3, 4);

            // You can use a named parameter to make the previous 
            // statement work.
            anExample.ExampleMethod(3, optionalint: 4);
        }
    }

    class ExampleClass
    {
        private string _name;

        // Because the parameter for the constructor, name, has a default
        // value assigned to it, it is optional.
        public ExampleClass(string name = "Default name")
        {
            _name = name;
        }

        // The first parameter, required, has no default value assigned
        // to it. Therefore, it is not optional. Both optionalstr and 
        // optionalint have default values assigned to them. They are optional.
        public void ExampleMethod(int required, string optionalstr = "default string",
            int optionalint = 10)
        {
            Console.WriteLine("{0}: {1}, {2}, and {3}.", _name, required, optionalstr,
                optionalint);
        }
    }

    // The output from this example is the following:
    // Default name: 1, One, and 1.
    // Default name: 2, Two, and 10.
    // Default name: 3, default string, and 10.
    // Provided name: 1, One, and 1.
    // Provided name: 2, Two, and 10.
    // Provided name: 3, default string, and 10.
    // Default name: 3, default string, and 4.

}

COM インターフェイスCOM Interfaces

名前付き引数と省略可能な引数を動的オブジェクトやその他の拡張機能のサポートと併用すると、Office オートメーション API などの COM API との相互運用性が大幅に向上します。Named and optional arguments, along with support for dynamic objects and other enhancements, greatly improve interoperability with COM APIs, such as Office Automation APIs.

たとえば、Microsoft Office Excel Range インターフェイスの AutoFormat メソッドには 7 つのパラメーターがあります。それらはすべて省略可能です。For example, the AutoFormat method in the Microsoft Office Excel Range interface has seven parameters, all of which are optional. これらのパラメーターを次の例に示します。These parameters are shown in the following illustration.

AutoFormat メソッドについての IntelliSense によるクイック ヒントIntelliSense Quick Info for the AutoFormat method.
AutoFormat パラメーターAutoFormat parameters

C# 3.0 以前のバージョンの C# では、次の例に示すように、各パラメーターの引数が必要です。In C# 3.0 and earlier versions, an argument is required for each parameter, as shown in the following example.

// In C# 3.0 and earlier versions, you need to supply an argument for
// every parameter. The following call specifies a value for the first
// parameter, and sends a placeholder value for the other six. The
// default values are used for those parameters.
var excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Workbooks.Add();
excelApp.Visible = true;

var myFormat = 
    Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1;

excelApp.get_Range("A1", "B4").AutoFormat(myFormat, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

ただし、C# 4.0 の導入により、名前付き引数と省略可能な引数を使用すると、AutoFormat の呼び出しを大幅に簡略化できます。However, you can greatly simplify the call to AutoFormat by using named and optional arguments, introduced in C# 4.0. 名前付き引数と省略可能な引数を使用すると、パラメーターの既定値の変更を望まない場合に、省略可能なパラメーターの引数を省略できます。Named and optional arguments enable you to omit the argument for an optional parameter if you do not want to change the parameter's default value. 次の呼び出しでは、7 つのパラメーターのうちの 1 つのパラメーターのみに値を指定しています。In the following call, a value is specified for only one of the seven parameters.

// The following code shows the same call to AutoFormat in C# 4.0. Only
// the argument for which you want to provide a specific value is listed.
excelApp.Range["A1", "B4"].AutoFormat( Format: myFormat );

使用例を含む詳細については、「方法: Office プログラミングで名前付き引数と省略可能な引数を使用する」と「方法: Visual C# の機能を使用して Office 相互運用オブジェクトにアクセスする」を参照してください。For more information and examples, see How to: Use Named and Optional Arguments in Office Programming and How to: Access Office Interop Objects by Using Visual C# Features.

Overload ResolutionOverload Resolution

名前付き引数と省略可能な引数を使用すると、オーバーロードの解決に次のように影響します。Use of named and optional arguments affects overload resolution in the following ways:

  • メソッド、インデクサー、コンストラクターのパラメーターのそれぞれが任意であるか、名前か位置により、呼び出しステートメントの 1 つの引数に対応するとき、その引数がパラメーターの型に変換できる場合、メソッド、インデクサー、コンストラクターが実行の候補になります。A method, indexer, or constructor is a candidate for execution if each of its parameters either is optional or corresponds, by name or by position, to a single argument in the calling statement, and that argument can be converted to the type of the parameter.

  • 複数の候補が見つかった場合、明示的に指定される引数には、優先変換に関するオーバーロード解決の規則が適用されます。If more than one candidate is found, overload resolution rules for preferred conversions are applied to the arguments that are explicitly specified. 任意のパラメーターの省略された引数は無視されます。Omitted arguments for optional parameters are ignored.

  • 2 つの候補が等しく良好であると判断された場合、呼び出しで引数が省略された任意のパラメーターのない候補が優先されます。If two candidates are judged to be equally good, preference goes to a candidate that does not have optional parameters for which arguments were omitted in the call. これはパラメーターの少ない候補に関するオーバーロード解決の一般優先設定の結果です。This is a consequence of a general preference in overload resolution for candidates that have fewer parameters.

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目See Also

方法: Office プログラミングで名前付き引数と省略可能な引数を使用するHow to: Use Named and Optional Arguments in Office Programming
dynamic 型の使用Using Type dynamic
コンストラクターの使用Using Constructors
インデクサーの使用Using Indexers