【问题标题】:C# - String within a string issue?C# - 字符串中的字符串问题?
【发布时间】:2010-12-07 06:23:38
【问题描述】:

我不确定这里到底是什么问题。我正在使用 2 个字符串,并且不断收到错误消息“字段初始化程序无法引用非静态字段、方法或属性 'Captcha.Capture.CaptureTime'”。

这是代码中的一个 sn-p:

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 初始化到构造函数中,你会没事的。

标签: c# string field initializer


【解决方案1】:

不,这与此无关 - 只是实例字段初始化程序不能使用其他实例字段或实例方法。这是一个简单的例子:

class Test 
{
    int x = 0;
    int y = x + 1;
}

将初始化移动到构造函数体中可能是最简单的。顺便说一句,您不应该在一个初始化程序中多次访问DateTime.Now - 它可能会在调用之间发生变化,从而导致可怕的结果。改用局部变量 - 构造函数更容易做到这一点:

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.Now除此之外还“慢”。
  • 它可能会 - 它可能不会。它的粒度不够细,无法保证调用之间的变化。即使它确实发生了变化,也只有 一些 变化会有问题 - 基本上,如果在您评估“分钟”或类似情况后“秒”从 59 变为 00。
【解决方案2】:

错误告诉你到底发生了什么。您正在尝试使用字段初始化器语法使用取决于实例字段 CaptureTime 的值来初始化实例字段 SaveFormat。将这些值的初始化移到实例级构造函数中就可以了。

顺便说一句,将DateTime.Now 保存在一个临时值中,而不是像现在这样重复调用。如果在代码执行时翻转日期边界怎么办?呸。

【讨论】:

    【解决方案3】:

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

    将初始化移至类的构造函数

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

    【讨论】:

    • +1 谢谢,这回答了我的问题;不知道实例字段初始值设定项是不确定的-
    【解决方案4】:

    需要在构造函数中设置成员,或者通过属性赋值。

    顺便说一句,您可以使用 ToString 重载清除该日期时间代码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多