CA1305:指定 IFormatProvider
类型名 |
SpecifyIFormatProvider |
CheckId |
CA1305 |
类别 |
Microsoft.Globalization |
是否重大更改 |
非重大更改 |
原因
某方法或构造函数调用具有可接受 System.IFormatProvider 参数的重载的一个或多个成员,且该方法或构造函数不调用采用 IFormatProvider 参数的重载。 该规则忽略对 .NET Framework 方法(记录为忽略 IFormatProvider 参数)以及下列其他方法的调用:
规则说明
如果未提供 System.Globalization.CultureInfo 或 IFormatProvider 对象,则重载成员提供的默认值可能不会在所有区域设置中产生想要的影响。 另外,.NET Framework 成员会根据对您的代码来说可能不正确的假设来选择默认区域性和格式设置。 要确保代码在您的环境中按预期运行,应根据下列准则提供区域性特定的信息:
如果值将显示给用户,请使用当前区域性。 请参见 CultureInfo.CurrentCulture。
如果值将由软件(与文件或数据库相关)存储和访问,请使用固定区域性。 请参见 CultureInfo.InvariantCulture。
如果不知道值的目标,请让数据使用者或数据提供者来指定区域性。
请注意,CultureInfo.CurrentUICulture 仅用于使用 System.Resources.ResourceManager 类的实例检索本地化资源。
即使重载成员的默认行为适合您的需要,也最好显式调用区域性特定的重载,这样您的代码将是自描述代码且更易于维护。
如何解决冲突
要修复与该规则的冲突,请使用以 CultureInfo 或 IFormatProvider 为参数的重载,并根据以上列出的准则指定参数。
何时禁止显示警告
如果确定默认区域性/格式提供者的确是正确选择,且代码可维护性不是开发时应优先考虑的重要问题,则可以安全地禁止显示此规则发出的警告。
示例
在下面的示例中,BadMethod 将导致与此规则冲突的两种情况。 GoodMethod 通过将固定区域性传递到 Compare 来更正第一个冲突,并通过将当前区域性传递到 ToLower 来更正第二个冲突,因为 string3 将显示给用户。
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);
}
}
}
该示例产生下面的输出。