Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#静态成员概念的困惑_C# - Fatal编程技术网

C#静态成员概念的困惑

C#静态成员概念的困惑,c#,C#,我知道类的静态成员是该类的所有实例之间的共享成员,但创建实例时如何使用它? 例如,我有一个名为Map()的类,我希望将MaxZoom的所有Map()实例的级别保持在与18相同的级别。在下面的代码中,我使用对象初始值设定项填充实例,并设置每个实例的标题,但是MaxZoom怎么样?我可以在哪里以及如何指定它 void Main() { var map = new Map(){ Title= "Green Coverage"}; Console.WriteLine(map.Titl

我知道类的静态成员是该类的所有实例之间的共享成员,但创建实例时如何使用它? 例如,我有一个名为
Map()
的类,我希望将
MaxZoom
的所有
Map()
实例的级别保持在与18相同的级别。在下面的代码中,我使用对象初始值设定项填充实例,并设置每个实例的标题,但是
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;}
}

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

例如,要更改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


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

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

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

使用对象初始值设定项[我正在]设置每个实例的
标题
,但是
MaxZoom
如何

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

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


注意:如果您根本不打算更改
MaxZoom
,请将其设置为
readonly
const
。如果您确实计划更改它,则使用属性提供了更好的选择。

如果您希望从类外访问静态变量,则需要将
私有
访问修饰符设置为
内部或公共

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;
     }
  }

您初始化了它一次,并且已经在代码中这样做了
MaxZoom=18
。就这样,你完了,别无选择。你可以在课堂上随时阅读。请记住,您将
MaxZoom
定义为
private
,不能在类之外访问它。您已经指定了它。它是
静态的
,所以只有一个,它是在类定义的第行中定义和指定的。您是否试图以某种方式使用它,但遇到了问题?可以使用类名++访问静态变量方法名。在您的情况下,您可以像这样访问它:
Map.MaxZoom=value您已经在类中设置了静态成员的值。因为它是私人的,所以你不能在课外聊天。如果将其公开,可以通过
Map.MaxZoom=20
进行设置。但在更改它时需要小心,因为它可能会影响类的所有实例的行为。这有帮助吗?OPOoh中
MaxZoom
的访问修饰符是什么!很好的观点,伊戈尔!!!谢谢你的评论,但这正是我迷路的地方。我没有在任何构造函数中使用
MaxZoom
,所以我的地图将如何使用它@足够:要在Map类外部使用
MaxZoom
,请将其设置为
internal
public
。这样您就可以使用
Map.MaxZoom