【问题标题】:Use of protected keyword in c#? [closed]在 C# 中使用受保护的关键字? [关闭]
【发布时间】:2021-08-29 04:27:34
【问题描述】:

我想了解以下代码(第 3 行)中“受保护”关键字的使用。

  public class  PlayerData
  {
     static protected PlayerData instance;
     static public PlayerData Instance { get { return instance; } }

     public int health;
  }


  public class GameManager
  {
      PlayerData.Instance.health = 10;
  }

【问题讨论】:

  • 你知道protected是什么意思吗?
  • 派生类可以完全替换实例,因为它是受保护的。但这是糟糕的设计。大多数设计指南都建议成员变量(无论是否静态)应该始终是私有的。
  • 我建议询问作者。他们应该知道他们为什么要这么做。
  • 是的,我知道受保护的含义:受保护的成员可以在其类内和派生类实例中访问。我问这个问题是因为这里没有继承。所以我认为他写这段代码是有特定原因的。我只是想学习
  • 它由 Unity 3D 开发人员编写。我在名为 Trash Dash 的游戏中找到了它。脚本的名称是 PlayerData。

标签: c# unity3d static field protected


【解决方案1】:

子类不能访问私有字段。

可以是受保护的字段。

如果该字段是受保护的,我们可以从这个类继承并使用该字段而不是属性。

这避免了使用 getter 方法,这是一种通过 CPU PROC CALL 和 RET 使用 CPU STACK 返回引用的疯狂耗时。

因此使用字段instance而不是属性Instance会更优化速度,因为我们直接使用引用而不需要会减慢进程和当前线程的方法调用,因此游戏.

对于每种用法,速度大约快 5 倍,模糊地说。

但话虽如此,我们必须小心不要更改底层对象实例,除非我们有充分的理由。这个字段可以是只读的,但不是,谁知道为什么。也许是为了能够改变对象……要么只是疏忽,要么这个 ref 是在构造函数之外分配的,或者可以随时重新分配。

【讨论】:

  • 属性 getter 和 setter 几乎总是由编译器或 JIT 优化内联。因此,您声称的 5 倍速度优势至少可以说是推测性的。
  • @GoodNightNerdPride 确实,我说的是理论上的。我对你提到的没有特别的了解。但是我们不能依赖在如此低级别的可能优化,因为这不能保证,因为 .NET IL 代码不像 C 内联函数那样内联。这取决于许多因素,从一个平台到另一个平台,从一个实现到另一个。
猜你喜欢
  • 2017-03-26
  • 2013-03-24
  • 2014-03-30
  • 2012-05-12
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多