如何将参数传递给静态类构造函数?

时间:2015-12-11 08:36:59

标签: c# class static static-classes static-constructor

我有一个带静态构造函数的静态类。我需要以某种方式将参数传递给这个静态类,但我不确定最好的方法是什么。 你会推荐什么?

;WITH CTE as
(
  SELECT min(Id) Id ,FromDate, row_number() over (ORDER BY FromDate) rn
  FROM @temp x
  WHERE 
    not exists
      (SELECT * FROM @temp WHERE x.FromDate > FromDate and x.FromDate <= Todate)
  GROUP BY FromDate
), CTE2 as
(
  SELECT Max(Id) Id ,ToDate, row_number() over (ORDER BY ToDate) rn
  FROM @temp x
  WHERE
    not exists
      (SELECT * FROM @temp WHERE x.ToDate >= FromDate and x.ToDate < Todate)
  GROUP BY ToDate
)
SELECT SUM(DateDiff(month, CTE.FromDate, CTE2.ToDate))
FROM CTE
JOIN CTE2
ON CTE.rn = CTE2.rn

3 个答案:

答案 0 :(得分:29)

不要使用静态构造函数,而是使用静态初始化方法:

public class A
{
    private static string ParamA { get; set; }

    public static void Init(string paramA)
    {
        ParamA = paramA;
    }
}

在C#中,静态构造函数是无参数的,并且很少有方法可以克服这个限制。一个是我上面建议你的。

答案 1 :(得分:3)

根据MSDN,A static constructor is called automatically to initialize the class before the first instance is created。因此,您无法发送任何参数。

CLR必须调用一个静态构造函数,它如何知道要传递哪些参数?

所以不要使用静态构造函数。

这是针对您的要求的工作。

public class StaticClass 
{ 
  private int bar; 
  private static StaticClass _foo;

  private StaticClass() {}

  static StaticClass Create(int initialBar) 
  { 
    _foo = new StaticClass();
    _foo.bar = initialBar; 
    return _foo;
  } 
}
  

静态构造函数具有以下属性:

     
      
  • 静态构造函数不接受访问修饰符或具有参数。静态构造函数会自动调用   在创建第一个实例之前初始化类或任何   静态成员被引用。
  •   
  • 无法直接调用静态构造函数。
  •   
  • 用户无法控制程序中何时执行静态构造函数。
  •   
  • 静态构造函数的典型用法是当类使用日志文件并使用构造函数将条目写入此文件时。
  •   
  • 当构造函数可以调用LoadLibrary时,静态构造函数在为非托管代码创建包装类时也很有用   方法
  •   
  • 如果静态构造函数抛出异常,则运行时将不会再次调用它,并且该类型将保持未初始化状态   程序所在的应用程序域的生命周期   运行
  •   

答案 2 :(得分:0)

如果通过“HardCodedParameter”实际上是指硬编码,则可以使用常量。

public static class YoursClass
{ 
    public const string AnotherHardCodedParam = "Foo";
}

public static class MyClass
{
    private const string HardCodedParam = "FooBar";

    static MyClass()
    {
        DoStuff(MyClass.HardCodedParam);
        DoStuff(YoursClass.AnotherHardCodedParam);
    }
}

此外,您可以使用静态只读属性。