C#의 변수 매개 변수를 사용하여 참조 할 수있는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/435049

  •  10-07-2019
  •  | 
  •  

문제

변수 매개 변수 목록을 수정하는 함수를 원하지만 모든 값 유형 (int, String)입니다. Params 키워드를 Ref 키워드 또는 그에 가까운 것으로 작동시키는 방법이 있습니까?

public void funcParams(params object[] list)
{
   /* Make something here to change 'a', 'b' and 'c' */
}

public void testParams()
{
    int a = 1, b = 2, c = 3;

    funcParams(a, b, c);
}

문제는 객체 필드를 수정하는 방법을 더 쉽게 만들려고 노력하고 있다는 것입니다. Cecil을 사용하여 동적 코드 생성을하고 있으며 너무 많은 IL 생성 코드를 작성하지 않으려 고 노력하고 있습니다.

단순화하기 위해 필드 목록을 참조별로 전달하고 싶습니다. 각 IL을 생성하여 변경하는 대신 변경하는 기능으로 변경해야합니다. 일부 매개 변수는 무효가 될 수 있으며 코드 생성을 조금 더 고통스럽게 만듭니다. 이 경우 매개 변수 대신 일부 과부하 메소드를 만드는 것은 그리 유용하지 않습니다.

도움이 되었습니까?

해결책

예. 것이 가능하다.

그러나 결과 코드는 "안전하지 않은"이므로 파견 할 수 없습니다.

요구 사항에 따라 문제가 될 수도 있고 아닐 수도 있습니다.

어쨌든 다음은 코드입니다.

using System;

namespace unsafeTest
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            unsafe 
            {       
                int x = 0;
                int y = 0;
                int z = 0;
                bar(&x, &y, &z);
                Console.WriteLine(x);
                Console.WriteLine(y);
                Console.WriteLine(z);
            }
        }

        unsafe static void bar(params int *[] pInts)
        {
            int i = 0;
            foreach (var pInt in pInts)
            {
                *pInt = i++;
            }
        }
    }
}

다른 팁

글쎄, 당신은 몇 가지 과부하를 선언 할 수 있습니다.

public void FuncParams(ref int a) {...}
public void FuncParams(ref int a, ref int b) {...}

그렇지 않으면 배열에서 다시 읽어야합니다 ( params 실제로 "암시 적 배열"을 의미합니다) :

object[] args = {1,2,3};
funcParams(args);
Console.WriteLine(args[0]); // updated
Console.WriteLine(args[1]); // updated
Console.WriteLine(args[2]); // updated

(물론, 만 수락하는 경우 ints, an을 사용하는 것이 좋습니다 int[] 전역)

아니요, 깔끔한 구문으로는 불가능합니다. 그 이유는 내부적으로 런타임이 메소드를 배열 인수를 취하는 간단한 방법으로 취급하기 때문입니다. 컴파일러는 배열을 생성하고 지정된 인수로 채우는 하우스 키핑을 수행합니다. 인수는 가치 유형이므로 배열에 복사되며 변경 사항은 ~ 아니다 원래 변수에 영향을 미칩니다. 그것을 달성하는 다른 방법은 존재의 목적을 물리 칠 것입니다 params 변수 수의 인수에 대한 좋은 구문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top