2016-11-04 3 views
2

я следующий код:Когда выполняется интерполированная строка?

internal class Constants 
    { 
     internal static string Source { get; set; } 

     #region EvaluationRepository 
     internal static string QUERY_001 = [email protected]" 
select 
    e.* 
from {Source} e 
where 
    e.id = @Id 
"; 

     internal static string QUERY_002 = [email protected]" 
select 
    e.* 
from {Source} e 
where 
    [email protected] 
    and e.begindate >= @FromDate 
    and e.enddate <= @ToDate 
"; 

     internal static string QUERY_003 
     { 
      get 
      { 
       return [email protected]" 
select 
    d.statusid [StatusId], 
    count(1) [Count] 
from 
    (select e.statusid 
    from {Source} e 
    where e.begindate >= @FromDate and e.enddate <= @ToDate) d 
group by d.statusid 
"; 
      } 
     } 
     #endregion 
    } 

Единственный раз, когда {Source} заполнен, когда я разоблачить запрос как собственности. (QUERY_003)
Не работает при выставлении в качестве поля . (QUERY_001, QUERY_002)

Может ли кто-нибудь объяснить, почему? Из-за статичности (не уверен, что это слово)?

Извините за дословной интерполяции шума для SQL :)

+1

Действительно, интерполяция строк - это красная селедка. Вы действительно спрашиваете: «Когда инициализаторы полей оцениваются?». –

+0

Да, потому что, когда я выставляю строку как поле {Источник}, не заполняется. – grmbl

+2

Это потому, что это 'static', что означает, что он будет создавать значение при первом инициализации класса' static', поэтому изменяется 'Source' после этого не будет никакого эффекта. Но свойство будет инициализировать новую строку, когда вы ее получите, используя последнее значение для 'Source'. – juharr

ответ

3

Это сделано во время выполнения. Это эквивалентно (до сгенерированного IL) с использованием string.Format.

Причина, по которой полей не заполнена должным образом, потому что Source пуст, когда он изначально выполняется (когда инициализирован статический класс).

+0

ДА! Вот и все. Я мог бы обмануть его со статическим конструктором и дать ему значение по умолчанию, чтобы это доказать. – grmbl

+0

также, я скорее вижу String.Format вместо string.Format * trollface – grmbl

+0

@grmbl 'string' и' String' - это то же самое. 'string' - это просто ключевое слово языка, которое является псевдонимом для класса' String'. – MgSam