Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为调试和日志重写ToString()-字符串是否应本地化?_C#_.net_Api_Tostring_Api Design - Fatal编程技术网

C# 为调试和日志重写ToString()-字符串是否应本地化?

C# 为调试和日志重写ToString()-字符串是否应本地化?,c#,.net,api,tostring,api-design,C#,.net,Api,Tostring,Api Design,我正在设计一个.NET库,供其他开发web和桌面应用程序的开发人员使用。我在不同的类中重写ToString(),以提供用于调试目的和包含在应用程序日志文件中的信息 我的一些课程包含数字和日期 考虑一个对象,它包含一个名为date的date和一个名为value的double(可能还有其他字段)。。。如果我重写该对象的ToString(),我可能需要执行以下操作: public override string ToString() { return "ObjectName[date=" +

我正在设计一个.NET库,供其他开发web和桌面应用程序的开发人员使用。我在不同的类中重写
ToString()
,以提供用于调试目的和包含在应用程序日志文件中的信息

我的一些课程包含数字和日期

考虑一个对象,它包含一个名为
date
date
和一个名为
value
double
(可能还有其他字段)。。。如果我重写该对象的
ToString()
,我可能需要执行以下操作:

public override string ToString() {
    return "ObjectName[date=" + date + ", value=" + value + "]";
}
但这将包括来自
date.ToString()
value.ToString()
的结果,这将为我提供根据
Thread.CurrentThread.CurrentCulture
进行本地化的字符串

在我看来,这似乎是错误的。my
ToString()
实现返回的字符串用于调试和记录消息,而不是用于用户界面。因此,我认为返回本地化字符串只会混淆问题。如果“2341”出现在日志文件中,开发人员需要知道线程的
CurrentCulture
的值,才能知道它是指两千341还是2点341。它与日期更容易混淆——像xx/xx/xxxx这样的字符串可以是dd/mm/yyyy或mm/dd/yyyy。我不希望我的
ToString()
方法产生这种歧义

因此,我倾向于使我的
ToString()
方法对区域性不敏感,以确保所有返回的字符串在不同区域性之间保持一致。例如,在内部,我的
ToString()
方法会像
value.ToString(CultureInfo.InvariantCulture)
那样格式化一个数字

然而,.NET库中的规范似乎是在默认无参数的实现中使用
CurrentCulture
。许多具有
ToString()
方法的对象也具有
ToString(IFormatProvider)
方法。就好像.NET的设计者决定默认使用
ToString()
是为了用户界面显示(本地化),而调试和日志(需要调用
ToString(CultureInfo.InvariantCulture)
)是次要的

因此,如果我以一种对区域性不敏感的方式实现我的
ToString()
方法,我觉得我会有点违背规则。但默认情况下创建区域性敏感字符串似乎很愚蠢,因为区域性敏感对日志文件或调试毫无意义

我可以在默认的
ToString()
实现中使用
CurrentCulture
来表示数字和日期,还可以提供
ToString(FormatProvider)
方法,这样人们就可以在日志文件等中使用不区分区域性的字符串。但这似乎很愚蠢,因为这只是迫使开发人员编写更多代码来获取他们想要的不区分区域性的字符串(无论他们是否考虑过)

底线是像
ObjectName[value=12.234,date=2011-10-01]
这样的字符串永远不应该出现在用户界面中,那么程序员为什么希望它被本地化呢

我一直在阅读框架设计指南中关于实现
ToString()
的建议。有些建议似乎有些矛盾。例如:

我认为 toStult是一种特别危险的方法,用于提供UI泛型类型,因为它很可能是用特定的UI来实现的,这对于其他UI需求来说是无用的。为了避免以这种方式诱惑自己,我更喜欢让我的

ToString
输出尽可能地极客化,以强调应该看到输出的唯一“人类”是“开发人员人类”(一个他们自己的亚种)

ToString
最重要的值是调试器使用它作为显示对象的默认方式

似乎不太适合:

返回区域性相关信息时,根据当前线程区域性设置字符串格式

使用线程的
CurrentCulture
属性返回的
CultureInfo
实例格式化任何数字或日期

我完全支持遵循指导原则,并编写符合程序员期望的API。但是如果
ToString()
是为程序员准备的,那么将其本地化似乎很愚蠢。C#编译器不允许程序员使用依赖于系统的十进制分隔符编写双文本,因此为程序员编写的
ToString()
方法的行为肯定应该类似吗

你觉得怎么样
ToString()
的输出不用于用户界面时,其中的数字和日期是否应本地化?


更新

我使用
DebuggerDisplay
属性做了一些测试,默认情况下,它以不区分区域性的方式格式化数字

[DebuggerDisplay("[value={value}]")]
class DoubleHolder {
    private double value;
    DoubleHolder(double value) {
        this.value = value;
    }
}

[TestMethod]
public void TestDebuggerValue() {
    DoubleHolder s = new DoubleHolder(12345678.12345);
    string doubleString = TestDouble.ToString();
    CultureInfo current = Thread.CurrentThread.CurrentCulture;
    Thread.CurrentThread.CurrentUICulture = current;
    CultureInfo ui = Thread.CurrentThread.CurrentUICulture;
    Debugger.Break();
}
在调试器中运行该测试,当该测试中断时,您可以看到
DoubleHolder
中包含的
double
使用
作为十进制分隔符进行格式化

然后关闭Visual Studio,将标准和格式的windows区域选项更改为法语,然后再次运行测试。您将看到,
doubleString
有一个
作为十进制分隔符,但是调试器仍然在
DoubleHolder
中显示
double
,并带有一个

我想在一个合适的法语版本的Windows上测试这个,用法语的VisualStudio。在Visual Studio中,如果转到工具->选项->环境->国际设置,可以将语言设置为“与Microsoft Windows相同”。在我的安装中,默认设置为“英语”。但要获得法语版的VisualStudio,您需要获得胜利
[DebuggerDisplay("{Name} [date={Date}, value={Value}]")]
public class MyClass {
    // ...
}