CA1305: IFormatProvider를 지정하십시오.
TypeName |
SpecifyIFormatProvider |
CheckId |
CA1305 |
범주 |
Microsoft.Globalization |
변경 수준 |
주요 변경 아님 |
원인
메서드 또는 생성자가 System.IFormatProvider 매개 변수를 받아들이는 오버로드가 있는 하나 이상의 멤버를 호출하지만 IFormatProvider 매개 변수를 사용하는 오버로드는 호출하지 않습니다. 이 규칙에서는 IFormatProvider 매개 변수를 무시한다고 문서화되어 있는 .NET Framework 메서드와 다음의 추가적인 메서드에 대한 호출을 무시합니다.
규칙 설명
System.Globalization.CultureInfo 또는 IFormatProvider 개체가 제공되지 않으면 오버로드된 멤버에서 제공하는 기본값이 모든 로캘에서 원하는 효과를 나타내지 않을 수 있습니다. 또한 .NET Framework 멤버에서는 코드에 적합하지 않을 수 있다는 가정 하에 기본 문화권 및 서식을 선택합니다. 현재 시나리오에 맞게 코드가 작동하도록 하려면 다음 지침에 따라 문화권별 정보를 제공해야 합니다.
값이 사용자에게 표시될 경우 현재 문화권을 사용합니다. CultureInfo.CurrentCulture를 참조하십시오.
값이 소프트웨어에서 저장되고 액세스되면, 즉 파일이나 데이터베이스에 유지되면 고정 문화권을 사용합니다. CultureInfo.InvariantCulture를 참조하십시오.
값의 대상을 모르면 데이터 소비자 또는 공급자가 문화권을 지정하도록 합니다.
CultureInfo.CurrentUICulture는 System.Resources.ResourceManager 클래스의 인스턴스를 사용하여 지역화된 리소스를 검색할 때만 사용됩니다.
오버로드된 멤버의 기본 동작이 현재 작업에 적합하더라도 문화권별 오버로드를 명시적으로 호출하여 코드가 자체적으로 문서화되고 더욱 쉽게 유지 관리되도록 하는 것이 더 좋습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 CultureInfo 또는 IFormatProvider를 사용하는 오버로드를 사용하고 앞에서 설명한 지침에 따라 인수를 지정합니다.
경고를 표시하지 않는 경우
기본 문화권/서식 공급자가 올바른 것이 확실하고 코드 유지 관리성이 개발에서 별로 중요하지 않은 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다.
예제
다음 예제에서 BadMethod는 이 규칙을 두 번 위반합니다. GoodMethod는 고정 문화권을 Compare로 전달하여 첫 번째 위반 문제를 해결하고, string3이 사용자에게 표시되므로 현재 문화권을 ToLower로 전달하여 두 번째 위반 문제를 해결합니다.
using System;
using System.Globalization;
namespace GlobalizationLibrary
{
public class CultureInfoTest
{
public void BadMethod(String string1, String string2, String string3)
{
if(string.Compare(string1, string2, false) == 0)
{
Console.WriteLine(string3.ToLower());
}
}
public void GoodMethod(String string1, String string2, String string3)
{
if(string.Compare(string1, string2, false,
CultureInfo.InvariantCulture) == 0)
{
Console.WriteLine(string3.ToLower(CultureInfo.CurrentCulture));
}
}
}
}
다음 예제에서는 DateTime 형식에서 선택한 기본 IFormatProvider에 대한 현재 문화권의 효과를 보여 줍니다.
using System;
using System.Globalization;
using System.Threading;
namespace GlobalLibGlobalLibrary
{
public class IFormatProviderTest
{
public static void Main()
{
string dt = "6/4/1900 12:15:12";
// The default behavior of DateTime.Parse is to use
// the current culture.
// Violates rule: SpecifyIFormatProvider.
DateTime myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
// Change the current culture to the French culture,
// and parsing the same string yields a different value.
Thread.CurrentThread.CurrentCulture = new CultureInfo("Fr-fr", true);
myDateTime = DateTime.Parse(dt);
Console.WriteLine(myDateTime);
}
}
}
이 예제의 결과는 다음과 같습니다.