헬퍼 기능은 문자열에서 안전한 변환을위한 기능입니다
-
05-07-2019 - |
문제
VB6로 돌아가서, 나는 널, 숫자의 경우`` '' '' '' '숫자, 숫자 등 0 등의 차이를 신경 쓰지 않고 코드를 코딩 할 수있는 몇 가지 기능을 작성했습니다. 코딩 할 때 특별한 케이스를 추가하는 것보다 생산성을 더 많이 죽이는 것은 없습니다. 관련이없는 오류를 일으킬 수있는 데이터를 다루기위한 코드; 9999/10000 숫자로 사용하는 것이 널이라면 실제로 0으로 취급합니다.
나는 지금 C#에 있고 VB6과 C# 2005의 차이점은 상당히 광범위합니다. .
따라서 문자열, 데이터베이스 필드, 요청 양식/쿼리 스팅 필드, ???를 수락하는 함수를 작성해야합니다. .
또한 반바지, int16, int32, long, 내가 걱정할 수있는 모든 것을 위해 이것을해야합니다.
그런 다음 줄을 위해 이것을 할 것입니다. 그리고 날짜.
이것이 가치있는 추구입니까? 프레임 워크 나 C#에 대신 사용할 수있는 것이 있습니까? 나는 다른 기능을 호출 할 때 데이터를 인라인으로 사용할 수 있고 임시 변수 등을 만들 필요가없는 것을 정말로 원합니다.
해결책
전환 기능의 SCAD가 내장되어 있습니다. 그러나 ... 나는 그들 중 누구도 당신이 원하는 것을 정확하게하는 것을 확신하지 못합니다. 일반적으로, .NET 메소드는 유효하지 않은 입력을 통과 할 때주의를 기울이고 예외를 던집니다.
다행히도 유틸리티 메소드를 쉽게 작성하여 숫자 값, 빈 문자열 또는 널 문자열의 문자열 표현을 모든 출력 유형으로 변환 할 수 있습니다.
public static T SafeConvert<T>(string s, T defaultValue)
{
if ( string.IsNullOrEmpty(s) )
return defaultValue;
return (T)Convert.ChangeType(s, typeof(T));
}
사용:
SafeConvert(null, 0.0) == 0.0;
SafeConvert("", 0.0) == 0.0;
SafeConvert("0", 0.0) == 0.0;
이 일반 메소드는 두 번째 인수 유형에서 리턴 유형을 취합니다.이 유형은 전달 된 문자열이 널 또는 비어있을 때 기본값으로 사용됩니다. 통과하다 0
그리고 당신은 얻을 것입니다 In32
뒤. 통과하다 0L
, Int64
. 등등...
다른 팁
C#에서 대부분의 데이터 유형은 무효가되지 않으며 (숫자, 날짜 등) 문자열 만 무효입니다. DB에서 데이터를 얻는다면 무효, 또는 그 구문이 부족한 버전, int?, double?, dateTime ?, 등.
모든 nullables가 있습니다 방법 이를 통해 실제 값 또는 기본값이 Null 인 경우 기본값을 얻을 수 있습니다. 이를 통해 이러한 기능을 만드는 것을 피하는 데 도움이됩니다.
문자열의 경우 String.isnullorempty (str) 함수가 있습니다.
당신도 할 수 있습니다 확장 방법을 추가하십시오 특별한 기능을 원하지 않는 경우. 코드에서 처리하는 한 확장 방법은 널 값에 적용될 수 있습니다. 예를 들어:
public static string ValueOrDefault(this string str)
{
if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE;
else return str;
}
.NET 라이브러리에는 Convert라는 클래스가 있습니다. 기본 유형과 몇 가지 공통 클래스 (DateTime과 같은 몇 가지 공통 클래스)에서 필요한 모든 것을 변환 할 수있는 기능이 있습니다.
기본적으로 convert.toint32 (val)처럼 작동합니다.
편집 : 모든 단어를 읽는 법을 배워야합니다. NULL에 대한 걱정을 잡지 못했습니다 ... 이것에 대한 연산자가 있습니다. 당신은 그것을 사용할 수 있습니까 ?? 널 확인하고 기본값을 제공하여 작동 할 수 있습니다.
당신은 또한 LINQ를 살펴보고 싶을 수도 있습니다. 그것은 당신을 위해 많은 종류의 매핑을 처리합니다.
@shog9와 비슷하다고 생각합니다. 사용자 특이한 입력을 처리하기 위해 시도 캐치를 추가합니다. 입력을 변환하려는 유형을 보내고 입력을 객체로 가져옵니다.
public static class SafeConverter
{
public static T SafeConvert<T>(object input, T defaultValue)
{
if (input == null)
return defaultValue; //default(T);
T result;
try
{
result = (T)Convert.ChangeType(input.ToString(), typeof(T));
}
catch
{
result = defaultValue; //default(T);
}
return result;
}
}
이제 아래처럼 전화하십시오
SafeConverter.SafeConvert<ushort>(null, 0);
SafeConverter.SafeConvert<ushort>("", 0);
SafeConverter.SafeConvert<ushort>("null", 0);
SafeConverter.SafeConvert<ushort>("-1", 0);
SafeConverter.SafeConvert<ushort>("6", 0);
SafeConverter.SafeConvert<ushort>(-1, 0);
SafeConverter.SafeConvert<ushort>(0, 0);
SafeConverter.SafeConvert<ushort>(1, 0);
SafeConverter.SafeConvert<ushort>(9, 0);