2009-09-12 5 views
13

Stackoverflow에서 읽은 후 DateTime의 형식을 확인하는 경우 DateTime.TryParse를 사용해야합니다. 일부 정규 표현식을 시도한 후에는 길고 불쾌한 서식을 많이 사용하는 것처럼 보입니다.C#에서 매개 변수를 없앱니다?

그러나 TryParse에는 "out"매개 변수가 필요하며 유효성 검사 형식 검사를하고 싶기 때문에 실제 결과가 필요하지 않습니다.

그래서 "out"결과를 보유하고 아무 것도하지 않는 변수가 남았습니다. 나가는 매개 변수를 할 필요가없는 방법 있는가?

그래서이 경고를 없애고 그냥 변수가 돌아 다니는 것을 멈 춥니 다.

답변

19

아니요.

bool IsValidDate(string value) 
    { 
    DateTime result; 
    return DateTime.TryParse(value, out result); //result is stored, but you only care about the return value of TryParse() 
    } 
+6

내가 당신의 대답 – MPritchard

+0

에 실제 PARAMS에 elipsis을 확대하고 생각 하는데요 @Martin - 감사합니다, 그래, 내가 생각이 너무하지만 우리가 사용하게 될 어떤 형식 문자열 chobo2 알 수 없기 때문에, 나는 그가 나보다 잘 모르는 것이라고 생각했다. –

+0

오류, "형식 문자열"이 아닌 "형식 공급자"로 지정하십시오. –

4

번호 당신은 변수의 제거 얻을 수 있지만, 당신은 컴파일러 중 하나를 경고하지한다 : 나는 주요 흐름에서 소음을 유지하기 위해 어딘가 방법을 포장 것입니다.

변수를 out으로 전달하는 것은 변수를 "사용"합니다. 컴파일러는 그 때문에 경고를 발행하지 않습니다.

+0

당신의 권리 나는 사람이 점점 더 천천히 업데이트되고 있다고 생각했습니다. – chobo2

3

.NET 3 이상을 사용하는 경우 언제든지 Extension 메서드를 만들 수 있습니까?

public static bool IsValidDate(this string value) 
{ 
    DateTime date = DateTime.Null; 
    return DateTime.TryParse(value, out date); 
} 

+2

변수를'out' 인수로 전달하기 전에 변수를 초기화 할 필요가 없습니다. 단지 그것을 선언하는 것으로 충분할 것입니다. –

+0

참. 내가 가지고있는 방어적인 습관 일뿐입니다. –

+10

사실, C#에서는 컴파일러 자체가 변수의 명확한 초기화를 시행하고 초기화되기 전에 컴파일되는 경우 컴파일하지 않기 때문에이 "방어적인"습관은 기껏해야 불필요합니다. 변수가 실제로 필요하지 않을 때 변수를 초기화 한 다음 메서드에'out' 인수로 전달하는 것을 잊어 버리면 "방어력"으로 인해 오류가 자동으로 사라집니다. –

1

TryParse이 더 나은 옵션입니다 [더 적절한 하나에 메소드 이름을 바꾸려면 편집]. 낭비되는 바로 그 변수. 다른 옵션으로는 try-catch 블록 내에서 Convert.ToDateTime()을 사용하는 것입니다. 그러나 try-catch 블록은 무겁기 때문에 효율적이지 않습니다. 다음 옵션은 regex입니다. 이것은 더 나은 해결책입니다. 나는 이것이 당신에게 다른 사람들에 비해 즉시 결과를 줄 것 같아요.

김 Gräsman 말했듯이 당신은 아주 잘 방법을 포장 할 수

...

+0

하루가 끝날 무렵 변수 비행을하는 데 별 도움이되지 않지만 널 또는 뭔가를 사용할 수 있어야합니다. 아니면 그냥 확인하고 아무것도 반환하지 않는 파서가 있어야합니다. – chobo2

7

나는 이렇게 실제로 을 제안 아니지만, 당신은 이 쉽도록 하나의 헬퍼 클래스를 사용할 수 있습니다 모든 아웃 매개 변수 :

public static class OutHelper<T> 
{ 
    [ThreadStatic] 
    public static T Ignored; 
} 

은 그럼 당신은 호출 할 수

if (DateTime.TryParse(text, out OutHelper<DateTime>.Ignored)) 

끔찍하고 공용 변경 가능 필드를 사용하며 응용 프로그램이 일부 악의적 인 코드와 함께 실행되는 경우 파싱 한 마지막 값에 대한 코드 액세스 권한을 제공하지만 작동해야합니다 :)

+0

이것은 내 눈이 피가 나게합니다. 스레드 안전성이 실패합니다. –

+1

@Mehrdad : 어떤 점에서 스레드로부터 안전하지 않습니까? 아이디어는 당신이 가치에서 결코 읽지 않는다이다, 그래서 그것이 여러 번 쓰여지는지 누구가 걱정 하는가? 호출 한 메서드가 처음에 out 매개 변수에 쓴 다음 나중에 읽으면 오류가 발생할 가능성이 있지만 어쨌든 나쁜 생각처럼 들립니다. 분명히 그것은 여전히 ​​일반적으로 여전히 끔찍한 생각입니다. –

+1

@Jon : 피 호출자가 'out'매개 변수를 임시 저장소로 사용하여 종료 할 때 반환 값을 포함하는 상황을 정확하게 의미했습니다. 이것은 피 호출자가 변경되지 않는다고 가정하는 것은 나쁜 생각이지만 자연스러운 기대입니다. 이 목적을 위해 전역 변수를 사용하면이 가정을 심각하게 깨뜨릴 수 있습니다. 어쨌든, 당신이 언급 한대로 그것은 대부분 "트릭"종류의 것이므로 실제로 피해야합니다. –

2

With C# 7 (2016 년 8 월 이후) 당신은 out var 구조체를 사용할 수 있습니다. 그리고 나서 후속 코드에서 새로운 var를 무시하십시오.

bool success = DateTime.TryParse(value, out var result); 
+0

가장 높은 투표 결과 여야합니다. 'result'는 즉시 범위를 벗어난다. – fafrd

+0

이것은 실제로 동일한 범위 내의 코드에 대해 '결과'를 유지합니다. 메서드 내에서 성공을 확인하고 결과 값 (또는 기본값 (DateTime))을 가질 수 있습니다. 또한이 표기법은 C# 7 이전에는 지원되지 않았습니다. – kskid19

관련 문제