【问题标题】:static property which returns class instance返回类实例的静态属性
【发布时间】:2014-01-08 19:22:33
【问题描述】:

我想使用类似于link 的东西!部分源代码如下所示:

public struct Vector3
{
    public static Vector3 zero { get; }
}

这个函数返回一个已经初始化的向量(每个轴都为 0)。这可能吗,因为它是一个结构?这就是我所拥有的:

public class WorldBlock
{
    public enum e_WorldBlockType
    {
        Undef,
        Earth,
        Stone,
        Air // no block set
    }

    public static WorldBlock Empty { get; }
    public e_WorldBlockType BlockType { get; set; }
    public bool IsWalkable { get; set; }

    public WorldBlock(e_WorldBlockType blockType = e_WorldBlockType.Undef, bool isWalkable = false)
    {
        this.BlockType = blockType;
        this.IsWalkable = isWalkable;
    }
}

但我明白了:error CS0840: 'WorldBlock.Empty.get' must have a body because it is not marked abstract or extern. The property can be automatically implemented when you define both accessors

正文应该怎么写?

编辑: 如果我添加例如private set,它会编译,但如果我使用它,我会得到一个空指针异常。

【问题讨论】:

标签: c# properties static


【解决方案1】:

类似这样的:

private static WorldBlock __empty = ...;

public static WorldBlock Empty {
  get {
    return WorldBlock __empty;
  }
}

【讨论】:

  • 我认为,这可能是解决方案,给我一秒钟
  • smbd 可以告诉我,如果它只包含一个空 WorldBlock 实例,那么如果我有 20 个 WorldBlock 实例,那么只有一个 __empty 实例?
  • @immerhart:WorldBlock.Empty == new WorldBlock() 将评估为false。这是您的正常行为吗?
  • 不知道为什么...你有什么建议?
【解决方案2】:

如果你只想要一个空的 WorldBlock,我建议你写:

public static readonly WorldBlock Empty = new WorldBlock();

而不是您的财产。然而,由于“Empty”对象的设置器是公开的,所以它有点狡猾,所以不能保证它实际上是空的。

【讨论】:

  • +1。由于WorldBlock 是可变的,所以WorldBlock.Empty 没有多大意义。此外,您有一个错字 - 缺少字段名称。
  • 谢谢。我修正了错字
【解决方案3】:

你必须这样做:

public static WorldBlock Empty
{
  get{return someThing; }
}

someThing 替换为您希望Empty 存储的任何内容....如果是null 或其他任何内容。

从您的标题...看来您想要返回该类的一个实例。如果您只想要此类的一个实例...您正在寻找Singleton 设计模式。

【讨论】:

    【解决方案4】:

    您的“空”实例是否应该共享并且相同?如果是这样,那么您可能正在寻找以下主体。

    private static WorldBlock emptyInstance;
    public static WorldBlock Empty
    {
       get
       {
          if (emptyInstance == null)
          {
             //initialize it
          }
          return emptyInstance;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 2016-04-06
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多