[C#] 메소드 호출자에게 여러 값 반환

이 질문C ++ 버전을 읽었 지만 실제로 이해하지 못했습니다.

누군가 어떻게 할 수 있는지 명확하게 설명 할 수 있습니까?



답변

C # 7 이상에서는 이 답변을 참조하십시오 .

이전 버전에서는 .NET 4.0+의 Tuple을 사용할 수 있습니다 .

예를 들어 :

public Tuple<int, int> GetMultipleValue()
{
     return Tuple.Create(1,2);
}

두 값 한과 튜플 Item1Item2속성으로.


답변

C # 7이 릴리스되었으므로 포함 된 새로운 Tuples 구문을 사용할 수 있습니다.

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

다음과 같이 사용할 수 있습니다.

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

요소에 이름을 제공 할 수도 있습니다 ( “Item1”, “Item2″등이 아님). 서명 또는 리턴 메소드에 이름을 추가하여이를 수행 할 수 있습니다.

(string first, string middle, string last) LookupName(long id) // tuple elements have names

또는

return (first: first, middle: middle, last: last); // named tuple elements in a literal

그것들은 또한 해체 될 수 있는데, 이것은 아주 좋은 새로운 기능입니다 :

(string first, string middle, string last) = LookupName(id1); // deconstructing declaration

체크 아웃 이 링크를 무엇을 할 수 있는지에 더 많은 예제를 볼 수 🙂


답변

세 가지 다른 방법을 사용할 수 있습니다

1. ref / out 파라미터

심판 사용 :

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int add = 0;
    int multiply = 0;
    Add_Multiply(a, b, ref add, ref multiply);
    Console.WriteLine(add);
    Console.WriteLine(multiply);
}

private static void Add_Multiply(int a, int b, ref int add, ref int multiply)
{
    add = a + b;
    multiply = a * b;
}

밖으로 사용 :

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int add;
    int multiply;
    Add_Multiply(a, b, out add, out multiply);
    Console.WriteLine(add);
    Console.WriteLine(multiply);
}

private static void Add_Multiply(int a, int b, out int add, out int multiply)
{
    add = a + b;
    multiply = a * b;
}

2. 구조체 / 클래스

구조체를 사용하여 :

struct Result
{
    public int add;
    public int multiply;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.add);
    Console.WriteLine(result.multiply);
}

private static Result Add_Multiply(int a, int b)
{
    var result = new Result
    {
        add = a * b,
        multiply = a + b
    };
    return result;
}

수업 사용 :

class Result
{
    public int add;
    public int multiply;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.add);
    Console.WriteLine(result.multiply);
}

private static Result Add_Multiply(int a, int b)
{
    var result = new Result
    {
        add = a * b,
        multiply = a + b
    };
    return result;
}

3. 튜플

튜플 클래스

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.Item1);
    Console.WriteLine(result.Item2);
}

private static Tuple<int, int> Add_Multiply(int a, int b)
{
    var tuple = new Tuple<int, int>(a + b, a * b);
    return tuple;
}

C # 7 튜플

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    (int a_plus_b, int a_mult_b) = Add_Multiply(a, b);
    Console.WriteLine(a_plus_b);
    Console.WriteLine(a_mult_b);
}

private static (int a_plus_b, int a_mult_b) Add_Multiply(int a, int b)
{
    return(a + b, a * b);
}


답변

C #에서는이 작업을 수행 할 수 없습니다. 당신이 할 수있는 것은 out매개 변수가 있거나 자신의 클래스를 반환하는 것입니다 (또는 불변의 경우 구조체).

매개 변수 사용

public int GetDay(DateTime date, out string name)
{
  // ...
}

커스텀 클래스 (또는 구조체) 사용

public DayOfWeek GetDay(DateTime date)
{
  // ...
}

public class DayOfWeek
{
  public int Day { get; set; }
  public string Name { get; set; }
}


답변

여러 값을 반환하려는 경우 반환하려는 값이 포함 된 클래스 / 구조를 반환하거나 다음과 같이 매개 변수에 “out”키워드를 사용할 수 있습니다.

public void Foo(int input, out int output1, out string output2, out string errors) {
    // set out parameters inside function
}


답변

이전 포스터가 맞습니다. C # 메서드에서 여러 값을 반환 할 수 없습니다. 그러나 몇 가지 옵션이 있습니다.

  • 여러 멤버를 포함하는 구조체를 반환
  • 클래스의 인스턴스를 반환
  • 출력 매개 변수 사용 ( out 또는 ref 키워드 사용)
  • 사전 또는 키-값 쌍을 출력으로 사용

여기의 장단점은 종종 파악하기가 어렵습니다. 구조체를 반환하는 경우 구조체는 값 형식이며 스택에 전달되므로 크기가 작아야합니다. 클래스의 인스턴스를 반환하면 문제를 피하기 위해 사용할 수있는 디자인 패턴이 있습니다 .C #은 참조로 개체를 전달하기 때문에 클래스 멤버를 수정할 수 있습니다 (VB에서와 같이 ByVal이 없기 때문에) ).

마지막으로 출력 매개 변수를 사용할 수 있지만 몇 개 (예 : 3 이하)의 매개 변수 만있는 경우 시나리오에이 사용을 제한합니다. 그렇지 않으면 유지 관리가 어려워집니다. 또한 출력 매개 변수를 사용하면 반환 값에 무언가를 추가해야 할 때마다 메서드 서명이 변경되어야하지만 구조체 또는 클래스 인스턴스를 반환하면 메서드 서명을 수정하지 않고 멤버를 추가 할 수 있기 때문에 민첩성을 저해 할 수 있습니다.

아키텍처 관점에서 키-값 쌍 또는 사전을 사용하지 않는 것이 좋습니다. 이 스타일의 코딩에는 메서드를 사용하는 코드에서 “비밀 지식”이 필요합니다. 키의 의미와 값의 의미를 미리 알고 있어야하며 내부 구현 작업을 수행하는 개발자가 사전 또는 KVP 작성 방식을 변경하면 전체 애플리케이션에서 장애 단계를 쉽게 작성할 수 있습니다.


답변

클래스 인스턴스 를 반환 하거나 매개 변수를 사용 합니다 . 다음은 출력 매개 변수의 예입니다.

void mymethod(out int param1, out int param2)
{
    param1 = 10;
    param2 = 20;
}

다음과 같이 호출하십시오.

int i, j;
mymethod(out i, out j);
// i will be 20 and j will be 10