请考虑以下代码。
var guid = Guid.NewGuid();
var a = guid.ToString();
var b = guid.ToString("N");
a
的值看起来像7c9e6679-7425-40de-944b-e07fc1f90ae7
b
的值类似于7c9e6679742540de944be07fc1f90ae7
。
默认情况下,有没有办法告诉.NET我想要第二种格式,格式字符串为N
?
其他类型ToString
的默认行为(例如DateTime
)与当前文化相关联。 Guid
的默认行为是否可能以类似的方式与文化联系在一起? (我很怀疑。)
出于兼容性原因,我需要在没有破折号的情况下使用GUID字符串表示作为整个代码库的标准,但是在没有任何警告的情况下很容易忘记N
参数。
答案 0 :(得分:4)
没有。 documentation on this很清楚:
以注册表格式返回此实例的值的字符串表示形式。
和
某些其他对象的返回值
输入:System.String
此Guid
的值,使用“D”格式说明符格式化如下:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ToString()
会查询语言环境格式化程序,但遗憾的是不是Guid
。
您可以为Guid
定义extension method,然后使用它:
public static class GuidExtensions
{
public static string ToMyString(this Guid guid)
{
return guid.ToString("N");
}
}
// elsewhere
Guid guid = /* ... */;
Console.WriteLine(guid.ToMyString());
但我想忘记称这会像忘记"N"
一样简单,所以这可能不会有太大的改善。 (无论如何你都去了这条路线,请考虑扩展方法比ToMyString()
更好的名称: - ))
答案 1 :(得分:1)
有没有办法告诉.NET我想要第二种形式,默认格式为字符串N?
不,这是Guid.ToString()
的默认行为。
此Guid的值,使用" D"格式化。格式说明符如下:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
其中GUID的值表示为一系列小写的十六进制数字,分别为8,4,4,4和12位数字,并用连字符分隔。返回值的一个例子是" 382c74c3-721d-4f34-80e5-57657b6cbc27"。要将十六进制数字从a到f转换为大写,请在返回的字符串上调用String.ToUpper方法。
您可以添加自定义FxCop规则(或自定义其他一些静态分析工具)以检测 Guid.ToString()
的使用情况,但您无法<\ n em>阻止。