C# 何时计算插值字符串?

C# 何时计算插值字符串?,c#,clr,C#,Clr,我有以下代码: internal class Constants { internal static string Source { get; set; } #region EvaluationRepository internal static string QUERY_001 = $@" select e.* from {Source} e where e.id = @Id "; internal s

我有以下代码:

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

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

        internal static string QUERY_002 = $@"
select
  e.*
from {Source} e
where
  e.statusid=@StatusId
  and e.begindate >= @FromDate
  and e.enddate <= @ToDate
";

        internal static string QUERY_003
        {
            get
            {
                return $@"
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}的时间是我将查询作为属性公开时。查询003 当暴露为场时,它不起作用。查询001,查询002

有人能解释为什么吗?因为静止不确定这是不是一个词


很抱歉SQL的逐字插值噪音:

它是在运行时完成的。它相当于使用string.Format生成的IL


字段未正确填充的原因是源在静态类初始化时最初执行时是空的。

实际上,字符串插值在这里是一个麻烦。您实际上是在询问何时对字段初始值设定项求值?是的,因为当我将字符串公开为字段时,{Source}未填充。这是因为它是静态的,这意味着它将在第一次初始化静态类时创建值,因此在这之后更改Source没有任何效果。但是当您访问该属性时,该属性将初始化一个新字符串,从而使用源的最新值。是!就这样。我可以用一个静态构造函数来欺骗它,并给它一个默认值来证明它。另外,我宁愿看到String.Format而不是String.Format*trollface@grmbl字符串和字符串是一回事。string只是一个语言关键字,是类string的别名。我知道。我想不使用关键字作为对象对我来说是一种强迫症。@Rob你的答案很模糊-所有变量都是在运行时计算的。如果说grmbl的字符串初始化只计算一次,则更有帮助,当调用包含类的静态构造函数时,它们需要非平凡的初始化。有关更多帮助,请参阅。