【问题标题】:Static constructor in C#C#中的静态构造函数
【发布时间】:2011-05-06 09:12:49
【问题描述】:

我正在尝试使用如下静态构造函数:

public static DataManager()
{
    LastInfoID = 1;
}

并收到此错误:

静态构造函数中不允许使用访问修饰符

我想知道我的问题是什么。

【问题讨论】:

  • 在我看来你应该问“什么是访问修饰符?”查看您最喜欢的 C# 语言书籍。现在错误信息变得完全可以理解了。
  • '访问修饰符' -> public + '不允许' -> 尝试删除它。 IMO C# 编译消息非常清楚。使用 Google 查找未知术语:google.nl/search?q=C%23+access+modifiers

标签: c# static constructor


【解决方案1】:
using System;

public class Something
{
    //
    private static  DateTime _saticConstructorTime;
    private         DateTime _instanceConstructorTime;
    //
    public static DateTime SaticConstructorTime
    {
        set { _saticConstructorTime = value; }
        get { return _saticConstructorTime ; }
    }
    public DateTime InstanceConstructorTime
    {
        set { _instanceConstructorTime = value; }
        get { return _instanceConstructorTime; }
    }
    //Set value to static propriety 
    static Something()
    {
        SaticConstructorTime = DateTime.Now;
        Console.WriteLine("Static constructor has been executed at: {0}",
                        SaticConstructorTime.ToLongTimeString());
    }
    //The second constructor started alone at the next instances
    public Something(string s)
    {
        InstanceConstructorTime = DateTime.Now;
        Console.WriteLine("New instances: "+ s +"\n");
    }
    public void TimeDisplay(string s)
    {
        Console.WriteLine("Instance \""+ s + "\" has been created at: " + InstanceConstructorTime.ToLongTimeString());
        Console.WriteLine("Static constructor has been created at: " + SaticConstructorTime.ToLongTimeString() + "\n");
    }
}
//
class Client
{
    static void Main()
    {
        Something somethingA = new Something("somethingA");
        System.Threading.Thread.Sleep(2000);
        Something somethingB = new Something("somethingB");

        somethingA.TimeDisplay("somethingA");
        somethingB.TimeDisplay("somethingB");
        System.Console.ReadKey();
    }
}
/* output :

Static constructor has been executed at: 17:31:28
New instances: somethingA

New instances: somethingB

Instance "somethingA" has been created at: 17:31:28
Static constructor has been created at: 17:31:28

Instance "somethingB" has been created at: 17:31:30
Static constructor has been created at: 17:31:28
 */

【讨论】:

    【解决方案2】:

    为了给这里的任何人一个更明确的答案,没有例子,想想为什么你必须从外部访问静态构造函数?静态类是在应用程序执行时在内存中创建的,这就是它们是静态的原因。换句话说,你永远不需要明确地调用一个,如果你这样做了,通过反射说(我不知道它是否会让你),那么你做错了。

    当您创建一个类的新实例时,构造函数的存在是为了初始化所有内部变量并执行任何必要的处理以使类按预期方式运行。请注意,如果您没有指定构造函数,编译器将为您创建一个。因此,您仍然需要像这样创建一个带有“()”的类

         new MyClass();
    

    因为您正在调用默认构造函数(前提是您没有定义无参数构造函数)。换句话说,非静态构造函数必须定义为公共的原因是因为您需要显式调用它。如果我没记错的话,C# 将不会在尝试调用(通过 malloc)未定义为 public 的构造函数的代码上编译。

    静态类中的构造函数用于“设置”目的。例如,我可以有一个静态类,它应该是我的代码和我不断保存和读取数据的文件之间的桥梁。我可以定义一个构造函数,在创建对象时,它将确保文件存在,如果不存在,则创建一个默认文件(在移植到其他服务器的 Web 系统中非常有帮助)。

    【讨论】:

      【解决方案3】:

      静态构造函数有 no 访问修饰符:它只是:

      static DataManager() // note no "public"
      {
          LastInfoID = 1;
      }
      

      这是因为它从未被显式调用(可能通过反射除外)——而是由运行时调用;访问级别将毫无意义。

      【讨论】:

      • 静态构造函数的默认访问修饰符是什么?也是公开的吗?
      • @Hacki 静态构造函数没有访问修饰符(你不能添加一个); 不需要调用它们——运行时会调用它们,并且运行时不需要任何特殊的访问权限;就生成的 IL 而言,.cctor 标记为 privatesharplab.io/…
      • 我只是好奇@marc Gravell,因为它在这里说:youtube.com/watch?v=KZ1b37S1mbY (@8:05) “静态构造函数默认是公共的”;在这个链接中:quora.com/… 大多数答案都是“私人的”,所以我有点困惑。谢谢你的澄清。
      • 我无法真正生成生成的 IL,它在哪个部分说它是私有的?这个“.class public auto ansi C”说它是公开的
      • @Hacki classpublic(如public class C);静态构造函数是private;您链接到的视频完全是错误的-实际上是两次:a)因为它声称它们是公开的(它们不是),b)因为他们建议这是“默认情况下”,即.. . 无意义:这是唯一的选择
      【解决方案4】:

      删除public。静态构造函数的语法是:

      class MyClass 
      {
          static MyClass() 
          {
              // Static constructor
          }
      }
      

      【讨论】:

        【解决方案5】:

        问题是LastInfoID 字段或属性未在您的类中声明为static,您只能从静态构造函数访问静态成员。还要从声明中删除 public 关键字:

        static DataManager()
        {
            LastInfoID = 1;
        }
        

        【讨论】:

        • 据我所知,根据问题,该错误与LastInfoID 完全无关。不过问题可能已被编辑。
        • 没有任何迹象表明ListInfoID 不是静态的。
        • 是的,我错了。它与public 修饰符有关。很抱歉。
        猜你喜欢
        • 2011-10-07
        • 2011-04-19
        • 2013-01-16
        • 1970-01-01
        • 2014-03-14
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多