2009-10-16 3 views
2

Я не уверен, что конкретно проблема здесь. Я работаю с двумя строками, и я продолжаю получать ошибку. «Инициализатор поля не может ссылаться на нестатические поля, метод или свойство« Captcha.Capture.CaptureTime ».C# - Строка в строке вопроса?

Вот отрывок из кода:

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 вместо этого, и все будет в порядке. – Deeksy

ответ

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

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

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

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

+0

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

0

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

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

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