C#의 변수 매개 변수를 사용하여 참조 할 수있는 방법이 있습니까?
문제
변수 매개 변수 목록을 수정하는 함수를 원하지만 모든 값 유형 (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
(물론, 만 수락하는 경우 int
s, an을 사용하는 것이 좋습니다 int[]
전역)
아니요, 깔끔한 구문으로는 불가능합니다. 그 이유는 내부적으로 런타임이 메소드를 배열 인수를 취하는 간단한 방법으로 취급하기 때문입니다. 컴파일러는 배열을 생성하고 지정된 인수로 채우는 하우스 키핑을 수행합니다. 인수는 가치 유형이므로 배열에 복사되며 변경 사항은 ~ 아니다 원래 변수에 영향을 미칩니다. 그것을 달성하는 다른 방법은 존재의 목적을 물리 칠 것입니다 params
변수 수의 인수에 대한 좋은 구문입니다.