C # - Строка в строке вопроса?

2

Я не уверен, в чем проблема. Я работаю с 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;

Я не буду подробно разбираться в том, почему я использую строки в этом конкретном ключе. Все работает нормально. Я предполагаю, что это имеет какое-то отношение к тому, что строка находится внутри другой строки? Это может быть совершенно очевидно, но я действительно понятия не имею. Любые идеи?

  • 0
    Вместо этого инициализируйте SaveFormat в конструкторе, и все будет в порядке.
Теги:
string
field
initializer

4 ответа

7
Лучший ответ

Нет, это не имеет никакого отношения к этому - это просто, что инициализаторы полей экземпляра не могут использовать другие поля экземпляра или методы экземпляра. Вот простой пример:

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");
  • 0
    На самом деле, она будет меняться между вызовами не будет? И я, кажется, помню, что слышал, что DateTime.Now был «медленным» помимо этого.
  • 1
    Это может сделать - это не может. Он недостаточно детализирован, чтобы гарантировать смену вызовов. Даже если это действительно изменится, только некоторые изменения будут проблематичными - в основном, если «секунда» изменится с 59 на 00 после того, как вы оценили «минуту» или что-то подобное.
3

Ошибка сообщает вам, что именно происходит. Вы пытаетесь инициализировать поле экземпляра SaveFormat со значением, которое зависит от поля экземпляра CaptureTime, используя синтаксис инициализатора поля. Переместите инициализацию этих значений в конструктор уровня экземпляра, и все будет хорошо.

Кстати, сохраните DateTime.Now во временном значении вместо повторного вызова, как вы сейчас. Что делать, если вы просматриваете границу даты во время выполнения кода? Тьфу.

1

В С# запрещено писать инициализаторы нестатического поля, которые ссылаются друг на друга, поскольку обычно порядок инициализации undefined.

Переместить инициализацию в конструктор вашего класса

И вам действительно лучше использовать String.Format или DateTime.Format(string) для форматирования даты.

  • 0
    +1 Спасибо, это ответило на мой вопрос; не знал, что инициализаторы поля экземпляра были недетерминированными
0

Вам нужно установить член в конструкторе или назначить его через свойство.

Btw, вы можете очистить этот код DateTime, используя ToString перегружать.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню