字符串问题中的C#-字符串?

字符串问题中的C#-字符串?,c#,string,field,initializer,C#,String,Field,Initializer,我不确定到底是什么问题。我正在处理2个字符串,并不断收到错误“字段初始值设定项无法引用非静态字段、方法或属性‘Captcha.Capture.CaptureTime’” 下面是代码的一个片段: string CaptureTime = DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "-" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Hour.ToS

我不确定到底是什么问题。我正在处理2个字符串,并不断收到错误“字段初始值设定项无法引用非静态字段、方法或属性‘Captcha.Capture.CaptureTime’”

下面是代码的一个片段:

string CaptureTime = DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "-" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();


string SaveFormat = Properties.Settings.Default.SaveFolder + "Screenshot (" + CaptureTime + ")." + Properties.Settings.Default.ImageFormat;

我不会详细说明为什么我会以这种特殊的方式使用字符串。一切正常。我猜这和一个字符串在另一个字符串中有关?这可能是显而易见的,但我真的不知道。有什么想法吗?

错误会准确地告诉您发生了什么。您正试图使用一个值来初始化实例字段
SaveFormat
,该值取决于使用字段初始值设定项语法的实例字段
CaptureTime
。将这些值的初始化移到实例级构造函数中,您就会没事了

顺便说一下,现在在临时值中保存
DateTime.Now
,而不是像当前那样重复调用。如果在代码执行时翻滚日期边界会怎样?糟糕。

在C#中禁止编写相互引用的非静态字段初始值设定项,因为通常初始化顺序是未定义的

将初始化移动到类的构造函数


您最好使用String.Format或DateTime.Format(String)进行日期格式化。

不,这与此无关-只是实例字段初始值设定项不能使用其他实例字段或实例方法。下面是一个简单的例子:

class Test 
{
    int x = 0;
    int y = x + 1;
}
将初始化移到构造函数体中可能是最简单的方法。顺便说一句,你不应该在一个初始值设定项中多次访问
DateTime。现在,它可能在调用之间发生变化,导致可怕的结果。改为使用局部变量-这同样更容易从构造函数中完成:

string CaptureTime;
string SaveFormat;

public YourType()
{
    DateTime now = DateTime.Now;

    CaptureTime = now.Month + "-" + now.Day + "-" + now.Year + "-" + 
        now.Hour.ToString() + now.Minute.ToString() + now.Second.ToString();
    SaveFormat = Properties.Settings.Default.SaveFolder + 
        "Screenshot (" + CaptureTime + ")." + 
        Properties.Settings.Default.ImageFormat;
}
顺便说一下,生成CaptureTime的更简单方法是:

CaptureTime = now.ToString("MM-dd-yyyy-HHmmss");

您需要在构造函数中设置成员,或通过属性分配它

顺便说一句,您可以使用重载清除DateTime代码

string CaptureTime = DateTime.Now.ToString("your format");

将SaveFormat初始化到构造函数中,你就没事了。事实上,它会在调用之间改变,不是吗?我似乎还记得听到过
DateTime。除此之外,
是“慢”的。它可能会,也可能不会。它不够细粒度,无法保证调用之间的更改。即使它确实发生了变化,也只是一些变化会有问题——基本上,如果在您评估“分钟”或类似内容后,“秒”从59变为00。+1谢谢,这回答了我的问题;不知道实例字段初始值设定项是不确定的-