代码之家  ›  专栏  ›  技术社区  ›  Ian manuel aldana

常量变量已删除。无法再在类外访问成员

  •  0
  • Ian manuel aldana  · 技术社区  · 17 年前

    我有一个名为“constants”的类,它包含应用程序中的所有“constant”变量(主要是字符串)。

    这门课是这样写的:

    public class Constants
    {
         public const string DATABASE="myDatabase";
         public const string whatever="whatever";
    
    
         public enum Colors
         {
            Red
            Blue
            Orange
         }
    
         public const string Time = "07/03/2009 9:14 PM";
    }
    

    这个类的成员可以被其他类正常访问。

    奇怪的是,如果我删除“const”,这个变量就不能再在其他类上访问了。

    public class Constants
    {
         public const string DATABASE="myDatabase";
         public const string whatever="whatever";
    
    
         public enum Colors
         {
            Red
            Blue
            Orange
         }
    
         public string Time = DateTime.Now.ToString(); //NO LONGER CONST
    }
    

    我试图清理解决方案并重建。我还关闭/重新运行了VS2005。这是已知的错误吗?还是我错过了什么?

    谢谢!

    4 回复  |  直到 17 年前
        1
  •  9
  •   Brian Rasmussen    17 年前

    一旦你移除 const 修饰符变量变为实例变量。只能通过类的实例(而不是通过类型)访问实例变量。这是“按设计”。

    您需要使用如下代码来访问时间

    var c = new Constants();
    var t = c.Time;
    

    如果由于某种原因“const”不适合您的需要,特别是如果您使用的类型不能是const,那么您可能需要尝试使用static。它在访问语义方面具有相同的效果。

        2
  •  2
  •   Thomas Freudenberg    17 年前

    这个 康斯特 关键字暗示两者 静止的 只读 . 没有 康斯特 它不再是静态的,所以您需要一个 Constants 要访问该成员:

    var c = new Constants();
    Console.WriteLine(c.Time); // should work now
    
        3
  •  1
  •   jason    17 年前

    当你移除 const 修饰符从变量的声明中,变量变为实例级声明; 康斯特 考虑成员 static 成员。因此,需要创建类的实例来访问变量。

    因此,

    Constants c = new Constants();
    Console.WriteLine(c.Time);
    

    或者,您可以添加 静止的 readonly 要说的修饰语

    class Constants {
        [...]
        public readonly static string Time = DateTime.Now.ToString();
    }
    
    Console.WriteLine(Constants.Time);
    
        4
  •  0
  •   Hans Kesting    17 年前

    不要创建常量类的实例,而是将该类声明为“static”:

    public static class Constants 
    { 
      public string Whatever="whatever";
      // ...
    }
    

    您仍然需要将“变量”声明为静态的,但是您可以通过类:constants.whatever来访问它们。

    推荐文章