수색…


메서드 선언

모든 메소드에는 접근 자 ( public , private , ...), 선택적 수정 자 ( abstract ), 이름 및 필요한 경우 메소드 매개 변수로 구성된 고유 한 서명이 있습니다. 반환 유형은 서명의 일부가 아닙니다. 메소드 프로토 타입은 다음과 같습니다.

AccessModifier OptionalModifier ReturnType MethodName(InputParameters)
{
    //Method body
}

AccessModifierpublic , protected , pirvate 또는 기본적으로 internal 있습니다.

OptionalModifierstatic abstract virtual override new 또는 sealed 가 될 수 있습니다.

ReturnType 은 return이 없으면 void 가 될 수 있고 int 에서 complex 클래스처럼 기본 클래스의 모든 유형이 될 수 있습니다.

Method는 입력 매개 변수가 없거나 전혀 없을 수 있습니다. 메서드에 대한 매개 변수를 설정하려면 각각을 일반 변수 선언 ( int a 와 같이)으로 선언해야하며 두 개 이상의 매개 변수에 대해서는 쉼표 ( int a, int b 와 같이)를 사용해야합니다.

매개 변수에는 기본값이있을 수 있습니다. 이를 위해 매개 변수 값을 설정해야합니다 (예 : int a = 0 ). 매개 변수에 기본값이 있으면 입력 값을 설정하는 것은 선택 사항입니다.

다음 메서드 예제는 두 정수의 합을 반환합니다.

private int Sum(int a, int b)
{
    return a + b;
} 

메서드 호출

정적 메서드 호출 :

// Single argument
System.Console.WriteLine("Hello World");  

// Multiple arguments
string name = "User";
System.Console.WriteLine("Hello, {0}!", name);  

정적 메서드 호출 및 반환 값 저장 :

string input = System.Console.ReadLine();

인스턴스 메소드 호출 :

int x = 42;
// The instance method called here is Int32.ToString()
string xAsString = x.ToString();

일반적인 메소드 호출하기

// Assuming a method 'T[] CreateArray<T>(int size)'
DateTime[] dates = CreateArray<DateTime>(8);

매개 변수 및 인수

메서드는 여러 개의 매개 변수를 선언 할 수 있습니다 (이 예제에서는 i , so 가 매개 변수 임).

static void DoSomething(int i, string s, object o) {
    Console.WriteLine(String.Format("i={0}, s={1}, o={2}", i, s, o));
}

매개 변수를 사용하여 메서드에 값을 전달할 수 있으므로 메서드에서 값을 전달할 수 있습니다. 값을 인쇄하거나 매개 변수로 참조되는 객체를 수정하거나 값을 저장하는 것과 같은 모든 종류의 작업이 가능합니다.

메서드를 호출하면 모든 매개 변수에 실제 값을 전달해야합니다. 이 시점에서 메서드 호출에 실제로 전달한 값을 인수라고합니다.

DoSomething(x, "hello", new object());

반환 형식

메서드는 nothing ( void ) 또는 지정된 유형의 값을 반환 할 수 있습니다.

// If you don't want to return a value, use void as return type.
static void ReturnsNothing() { 
    Console.WriteLine("Returns nothing");
}

// If you want to return a value, you need to specify its type.
static string ReturnsHelloWorld() {
    return "Hello World";
}

메서드가 반환 값을 지정하면 메서드 값을 반환 해야합니다 . return 문을 사용하여이 작업을 수행합니다. return 문에 도달하면 지정한 값과 모든 코드가 더 이상 실행되지 않고 반환됩니다. 예외는 finally 블록이며 메서드가 반환되기 전에 실행됩니다.

메서드가 아무 것도 반환하지 않으면 ( void ) 즉시 메서드에서 반환하려면 값없이 return 문을 사용할 수 있습니다. 그런 방법의 끝에서 return 문은 불필요합니다.

유효한 return 문 예 :

return; 
return 0; 
return x * 2;
return Console.ReadLine();

예외를 던지면 값을 반환하지 않고 메서드 실행을 끝낼 수 있습니다. 또한 yield 키워드를 사용하여 반환 값을 생성하는 반복기 블록이 있지만 여기서는 설명하지 않는 특별한 경우입니다.

기본 매개 변수

매개 변수를 생략 할 수있는 옵션을 제공하려는 경우 기본 매개 변수를 사용할 수 있습니다.

static void SaySomething(string what = "ehh") {
    Console.WriteLine(what);
}  

static void Main() {
    // prints "hello"
    SaySomething("hello"); 
    // prints "ehh"
    SaySomething(); // The compiler compiles this as if we had typed SaySomething("ehh")
}

이러한 메서드를 호출하고 기본값이 제공되는 매개 변수를 생략하면 컴파일러에서 해당 기본값을 삽입합니다.

기본값이있는 매개 변수는 기본값없이 매개 변수 뒤에 작성해야합니다.

static void SaySomething(string say, string what = "ehh") {
        //Correct
        Console.WriteLine(say + what);
    }

static void SaySomethingElse(string what = "ehh", string say) {
        //Incorrect
        Console.WriteLine(say + what);
    }   

경고 :이 방법으로 작동하기 때문에 경우에 따라 기본값이 문제가 될 수 있습니다. 메서드 매개 변수의 기본값을 변경하고 해당 메서드의 모든 호출자를 다시 컴파일하지 않으면 해당 호출자는 컴파일 할 때 존재하는 기본값을 계속 사용하므로 불일치가 발생할 수 있습니다.

메소드 오버로딩

정의 : 이름이 같은 여러 메소드가 다른 매개 변수로 선언 될 때이를 메소드 오버로드라고합니다. 메소드 오버로드는 일반적으로 용도는 동일하지만 다른 데이터 유형을 매개 변수로 허용하도록 작성된 함수를 나타냅니다.

영향을 미치는 요인

  • 인수의 수
  • 인수 유형
  • 반환 유형 **

계산 함수를 수행 할 Area 라는 메소드를 생각해보십시오.이 함수는 다양한 인수를 받아들이고 결과를 리턴합니다.

public string Area(int value1)
{
    return String.Format("Area of Square is {0}", value1 * value1);
}

이 메서드는 하나의 인수를 받아들이고 문자열을 반환합니다. 정수 (예 : 5 )로 메서드를 호출하면 "Area of Square is 25" 출력됩니다.

public  double Area(double value1, double value2)
{
    return value1 * value2;
}

마찬가지로이 메서드에 두 개의 double 값을 전달하면 출력은 두 값의 곱이며 double 유형입니다. 이것은 곱셈과 직사각형의 면적을 찾는 데 사용될 수 있습니다.

public double Area(double value1)
{
    return 3.14 * Math.Pow(value1,2);
}

이 값은 특히 원의 면적을 찾는 데 사용할 수 있습니다. 원의 면적은 이중 값 ( radius )을 받아들이고 면적으로 다른 이중 값을 반환합니다.

이 메소드들 각각은 충돌없이 정상적으로 호출 될 수 있습니다 - 컴파일러는 각 메소드 호출의 매개 변수를 검사하여 어떤 버전의 Area 을 사용 Area 결정합니다.

string squareArea = Area(2);
double rectangleArea = Area(32.0, 17.5);
double circleArea = Area(5.0); // all of these are valid and will compile.

** 반환 유형 만으로는 두 가지 방법을 구별 할 수 없습니다. 예를 들어 Area에 동일한 매개 변수가있는 두 개의 정의가있는 경우 (예 :

public string Area(double width, double height) { ... }
public double Area(double width, double height) { ... }
// This will NOT compile. 

우리 클래스가 다른 값을 반환하는 동일한 메소드 이름을 사용해야 할 필요가 있다면 인터페이스를 구현하고 명시 적으로 사용법을 정의함으로써 모호성 문제를 제거 할 수 있습니다.

public interface IAreaCalculatorString {
    
    public string Area(double width, double height);

}

public class AreaCalculator : IAreaCalculatorString {

    public string IAreaCalculatorString.Area(double width, double height) { ... } 
    // Note that the method call now explicitly says it will be used when called through
    // the IAreaCalculatorString interface, allowing us to resolve the ambiguity.
    public double Area(double width, double height) { ... }

익명 메소드

익명 메서드는 코드 블록을 대리자 매개 변수로 전달하는 기술을 제공합니다. 그들은 시체가 있지만 이름이없는 메서드입니다.

delegate int IntOp(int lhs, int rhs);
class Program
{
    static void Main(string[] args)
    {
        // C# 2.0 definition
        IntOp add = delegate(int lhs, int rhs)
        {
            return lhs + rhs;
        };

        // C# 3.0 definition
        IntOp mul = (lhs, rhs) =>
        {
            return lhs * rhs;
        };

        // C# 3.0 definition - shorthand
        IntOp sub = (lhs, rhs) => lhs - rhs;

        // Calling each method
        Console.WriteLine("2 + 3 = " + add(2, 3));
        Console.WriteLine("2 * 3 = " + mul(2, 3));
        Console.WriteLine("2 - 3 = " + sub(2, 3));
    }
}

액세스 권한

// static: is callable on a class even when no instance of the class has been created
public static void MyMethod()

// virtual: can be called or overridden in an inherited class
public virtual  void MyMethod()

// internal: access is limited within the current assembly
internal  void MyMethod()

//private: access is limited only within the same class
private  void MyMethod()

//public: access right from every class / assembly
public void MyMethod()

//protected: access is limited to the containing class or types derived from it
protected void MyMethod()

//protected internal: access is limited to the current assembly or types derived from the containing class.
protected internal void MyMethod()


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow