나는 다른 지점에서 작은 작업을 반복해야하는 메서드를 작업하고 있지만 반복되는 코드는 메서드에 전용이어야합니다. 분명한 해결책은 중첩 된 함수입니다. 그러나 무엇을 시도해도 C# 컴파일러는 나에게 barfs를 사용합니다. 이 펄 스 니펫 (snippet)와 거의 동일한함수를 메서드에 비공개로 만드는 방법은 무엇입니까?
뭔가 :
my $method = sub {
$helper_func = sub { code to encapsulate };
# more code
&$helper(called whenever needed);
# more code
}
내가 무슨 말을하고 무엇을, 나는 C#으로 달성하기 위해 노력하고있어 것입니다.
이 컨텍스트에서 클래스의 다른 메서드는 도우미 함수에 액세스 할 수 있어야합니다. C#에서이 구문을 작성하는 가장 논리적 인 방법은 다음과 같습니다.
var helper = (/* parameter names */) => { /* code to encapsulate */ };
실제로 컴파일러에서 보관해야합니다. 실제로 나 쓸 수 어떤 CSC 방법 — 내에 델리게이트 타입 선언되어, 람다 대신 이전 대리자() {} 문법을 이용하여 등가이고, 같은 과제는 , 금지되므로
그러나, 이것이다 :
복사 주위 코드의 덩어리를 붙여 손으로 매개 변수를 편집 있지만 유지보다 클래스의 나머지 부분에 개인 대리자 형식을 오히려 누설하지에 대한 모든 벌금과 멋쟁이private delegate /* return type */ Helper(/* parameters */);
private /* return type */ method(/* parameters */) {
Helper helper = (/* parameter names */) => {
/* code to encapsulate */
};
// more code
helper(/* called whenever needed */);
// more code
}
그것은 메서드에 전용입니다. 처음부터 목적을 이겨내지 못했습니다. 매개 변수에 goto 문과 로컬 변수를 사용하면 코드 재사용을 희생하지 않고도이 상황에서 "도우미"를 더 잘 캡슐화 할 수 있습니다. 레지스터를 통해 매개 변수를 전달하여 함수 호출을 시뮬레이트하려면 어셈블러를 사용하는 것이 좋습니다. 문제를 모두 피하기 위해 코드를 리팩터링하는 허용 가능한 방법을 찾지 못했습니다.
그래서 이걸 Common Object Oriented Language에 따르도록 할 수 있습니까?
'Action' 또는 제네릭 버전이란 무엇입니까? –
나는 System.Action과 System.Func에 대해 들어 본 적이 없다는 이유로 사과를해야만하는 것처럼 보입니다. MSDN을 보면, C# 3.5에서 몇 가지 새로운 기능을 놓친 것 같습니다 :-). – TerryP
NET3.5 또는 C# 3.0 (모든 사람을 혼란에 빠뜨릴 수 있음) –