混淆在C#静态成员概念

时间:2017-09-28 20:39:38

标签: c#

我知道类的静态成员是该类的所有实例之间的共享成员但是在创建实例时如何使用它? 例如,我有一个名为Map()的类,我希望将MaxZoom的所有实例的Map()级别保持在与18相同的级别。在下面的代码中我填充实例使用Object Initializer并设置每个实例的Title但MaxZoom怎么样?在哪里以及如何指定它?

void Main()
{
     var map = new Map(){ Title= "Green Coverage"};
     Console.WriteLine(map.Title);
}

public class Map
{
    private static int MaxZoom = 18;
    public string Title {get; set;}
}

4 个答案:

答案 0 :(得分:2)

  

使用对象初始值设定项[我]设置每个实例的TitleMaxZoom怎么样?

您无法在对象初始值设定项中设置MaxZoom,正是因为它在类的所有实例之间共享。因此,它不属于任何特定的实例。

您已在静态初始值设定项中将MaxZoom设置为18。如果您想更改它,请使用Map.MaxZoom = ...表达式。由于该字段是私有的,因此您必须将其设置为Map方法之一。

注意:如果您根本不打算更改MaxZoom,请将其设为readonlyconst。如果您计划更改它,使用属性可以提供更好的选择。

答案 1 :(得分:1)

您不能将其用作实例的一部分。您可以使用类定义来引用它。

例如,要更改MaxZoom,您可以使用

void Main()
{
  Map.MaxZoom = 30;   // now all maps can only zoom to 30
  var map = new Map(){ Title= "Green Coverage"};
  Console.WriteLine(map.Title);
}

正如Igor在下面指出的那样,为了实现这一点,您需要将MaxZoom从private更改为public

如果您愿意,可以放入具有调用静态属性的相同属性的实例成员。这对于可能是特定于实例的常见计算非常有用。

答案 2 :(得分:1)

如果要从外部类访问静态变量,则需要将private访问修饰符设置为internal or public

public class Map
{
    public static int MaxZoom = 18;
    public string Title {get; set;}
}

静态成员仅初始化一次,无论使用该类类型创建的对象数量如何。

您也可以从静态构造函数初始化静态变量:

public class Map
{
     public static int MaxZoom;
     public string Title { get; set; }

     static Map()
     {
          MaxZoom = 18;
     }
  }

答案 3 :(得分:0)

在地图类中定义MaxZoom时,已经指定了MaxZoom的值。您只能在Map类中使用它,因为它是私有的。

如果您无意在运行时更改MaxZoom的值,请使用const