기본 인수 값 액세스

업데이트: 2007년 11월

Visual C++ 및 Microsoft Visual Basic 2005 등의 일부 언어에서는 인수에 기본값을 할당할 수 있습니다. 예를 들어, 다음은 두 개의 인수에 대한 기본값이 있는 올바른 Visual Basic 2005 선언입니다.

Public Sub MyMethod (a as Integer, _
                     Optional b as Double = 1.2, _
                     Optional c as Integer = 1)

매개 변수 특성을 사용하여 기본 매개 변수 값을 할당할 수 있습니다.

Visual Basic 및 C++의 경우 메서드가 호출될 때 선택적 매개 변수를 생략할 수 있습니다. C#의 경우 선택적 인수에 대한 값을 지정해야 합니다.

예를 들어, 다음 Visual Basic 및 C++ 예제는 모두 MyMethod에 대한 올바른 호출입니다.

MyMethod(10, 55.3, 12)
MyMethod(10, 1.3) ' c == 1
MyMethod(11) ' b == 1.2, c == 1
MyMethod(10, 55.3, 12);
MyMethod(10, 1.3);   // c == 1
MyMethod(11);        // b == 1.2, c == 1

리플렉션을 사용하여 인수의 기본값을 검색하려면 매개 변수의 ParameterInfo 개체를 가져온 다음 ParameterInfo.DefaultValue 속성을 사용하여 기본값을 검색합니다. 기본값이 없으면 이 속성은 Value.DBNull을 반환합니다.

다음 예제에서는 MyMethod의 기본값을 콘솔에 표시합니다.

Dim m As MethodInfo = t.GetMethod("MyMethod")
Dim ps As ParameterInfo() = m.GetParameters()
Dim i As Integer
For i = 0 To ps.Length - 1
    Console.WriteLine("Default Value == {0}", ps(i).DefaultValue)
Next i
MethodInfo m = t.GetMethod("MyMethod");
ParameterInfo[] ps = m.GetParameters();
for (int i = 0; i < ps.Length; i++) 
{
    Console.WriteLine("Default Value == {0}", ps[i].DefaultValue);
}
MethodInfo m = t->GetMethod("MyMethod");
ParameterInfo[] ps = m->GetParameters();
for (int i = 0; i < ps.Length; i++) 
{
    Console::WriteLine(S"Default Value == {0}", ps[i]->DefaultValue);
}

기본값이 있는 인수를 사용하는 메서드를 호출하려면 InvokeMember 메서드에 대한 매개 변수 값으로 Type.Missing을 사용합니다. 이렇게 하면 지정된 매개 변수 값의 기본값을 사용하기 위해 런타임에 바인딩 서비스가 활성화됩니다. 기본값이 없는 매개 변수에 대해 Type.Missing이 전달되면 ArgumentException이 throw됩니다. 모든 컴파일러의 바인딩 메커니즘이 Type.Missing에 대해 이 규칙을 준수하는 것은 아닙니다. 일부 바인더는 이 기능을 지원하지 않거나 Type.Missing을 다르게 처리할 수 있습니다. Type.Missing을 사용할 때는 기본값이 뒤에 올 필요가 없습니다.

C# 언어에서는 기본 인수를 지원하지 않습니다.

다음 Visual Basic 2005 예제에서는 리플렉션을 사용하여 기본 인수가 있는 메서드를 호출하는 방법을 보여 줍니다.

Option Strict Off
Imports System
Imports System.Reflection
Public Class OptionalArg
    Public Sub MyMethod (a As Integer, Optional b As Double = 1.2, Optional c As Integer=1)
        Console.WriteLine("a = " & a & " b = " & b & " c = " & c)
    End Sub
End Class
Module Module1
    Sub Main()
        Dim o As New OptionalArg
        Dim t As Type
        t = GetType(OptionalArg)
        Dim Param As Object()= {10, 20, 30}
        t.InvokeMember("MyMethod", _
                        BindingFlags.Public Or _
                        BindingFlags.Instance Or _
                        BindingFlags.InvokeMethod Or _
                        BindingFlags.OptionalParamBinding, _
                        Nothing, _
                        o, _
                        New Object() {10, 55.3, 12})
        t.InvokeMember("MyMethod", _
                        BindingFlags.Public Or _
                        BindingFlags.Instance Or _
                        BindingFlags.InvokeMethod Or _
                        BindingFlags.OptionalParamBinding, _
                        Nothing, _
                        o, _
                        New Object() {10, 1.3, Type.Missing})
        t.InvokeMember("MyMethod", _
                        BindingFlags.Public Or _
                        BindingFlags.Instance Or _
                        BindingFlags.InvokeMethod Or _
                        BindingFlags.OptionalParamBinding, _
                        Nothing, _
                        o, _
                        New Object() {10, Type.Missing, Type.Missing})
    End Sub
End Module

앞의 방법을 사용하면 호출자가 값을 지정하지 않아도 뒤에 오는 기본 인수가 사용됩니다. 이것은 기본 인수가 있는 메서드를 호출하는 가장 일반적인 방법입니다.

MethodBase.Invoke를 사용하여 메서드를 호출할 경우에는 값이 없는 모든 매개 변수에 대해 Type.Missing을 포함하는 개체 배열을 전달하여 기본값으로 사용할 인수를 명시적으로 지정해야 합니다.

참고 항목

개념

형식 정보 보기

참조

Type.Missing

Reflection.Missing

MethodBase.Invoke

InvokeMember