【问题标题】:Access nonstatic members of a static class访问静态类的非静态成员
【发布时间】:2015-09-23 10:15:45
【问题描述】:

我有一个静态类定义如下:

 public static class Classroom
  {
    public string Name;
    //other members
  }

如何在另一个类中访问变量Name

由于它是一个静态类,我无法创建这样的实例

Classroom ClassroomObj = new Classroom();

由于Name 不是静态的,我无法在不创建实例的情况下访问它。那么如何访问变量呢?

【问题讨论】:

  • 你甚至不能在静态类中声明非静态成员。第一个代码 sn-p 不会编译。
  • 我认为对这个问题的否决有点苛刻。对于新手程序员来说,这似乎是一个合理的问题。 OP 正在质疑 为什么 代码无法编译,所以请帮帮他
  • @AntP “没有有效的问题要回答” - 是的,有一个,仔细阅读:“我如何访问变量?”。
  • @AntP 当用户对某些事情的工作方式感到困惑时,让他负担有关如何编写问题的有效/无效问题会更加令人困惑。所以,不管它是否有效(我们仍有不同的意见),目标是帮助解决实际问题。
  • @tomab 并且在明确提出“实际问题”之前,该问题的质量很差,因此应该被否决。同样,正如我在一开始所说的那样,投票是对内容质量的评级,而不是对用户的奖励/惩罚。除了提出的问题之外,这里唯一可辨别的问题是“我不理解静态类”,这也是一个糟糕的问题。试图在狭隘的背景下回答一个广泛的问题实际上并不能帮助任何人,尤其是提问者。投反对票和乐于助人并不相互排斥。

标签: c# class static instance


【解决方案1】:

您还必须创建变量static

public static class Classroom
{
    public static string Name;
    //other members
}

原因是这样的:您的静态类可以被视为使用其名称访问的单个实例,而不是使用 new 创建实例并使用变量名访问它。所以这个静态类中的任何属性也必须有static,这样它就可以再次使用类名。

【讨论】:

  • 我怀疑,Classroom 在问题的上下文中应该是static:这意味着有只有一个教室。
  • 我回答的前提是 OP 在 new 的帮助下了解对象和实例如何工作,但对 static 感到困惑。上下文没有说明是否应该只有一个实例。
  • 这正是为什么应该做出回应以寻求明确性,而不是发布一个充其量可能不合适,最坏的情况可能实际上会助长误解和坏习惯的答案;)
  • 即使问题本身存在缺陷,也应遵守所提出的问题。 cmets 已经问过 OP 是否确定他的设计,因为它似乎有缺陷(在最坏的情况下,这只是一个思考的例子,教室是第一个想到的有意义的名字,因此与基本无关他想到的静态类的想法)。因此,如果没有 OP 回答和澄清他/她迄今为止没有回答的问题,只能基于 OP 设定的前提。因此,答案没有错,并且在 cmets 中提出了/曾经提出的问题,因此无事可做
【解决方案2】:

至于static class,你可以'创建它的实例

  public static class MyClass {
    public static String SomeField;
    ....
  }

  // the class is static, no instances are allowed
  var o = new MyClass(); // <- Compile time error! 

然而,非静态(即实例)字段想要实例,在静态类的情况下无论如何不能提供。这就是为什么 static 类中不允许使用 非静态 字段的原因。因此,您应该将您的类更改为 ordinal 一个:

  // No static
  public class Classroom
  {
    public string Name;
    ... 
  }

  ...

  Classroom room = new Classroom();
  room.Name = "123";

或者将Name 也设为static(不过,我怀疑您是否想要这种解决方案:这意味着您只有一个 Classroom):

  public static class Classroom
  {
    // note "static"
    public static string Name;
    ... 
  }

  ...

  Classroom.Name = "123";

【讨论】:

    【解决方案3】:

    你不能在静态类中声明实例成员

    【讨论】:

    • @freshbm 这实际上是一个答案,因为该请求是不可能实现的。对于“如何在 C# 中实例化命名空间?”之类的问题,您会怎么回答?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2012-04-13
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多