【问题标题】:Auto implemented properties issue自动实现的属性问题
【发布时间】:2016-03-25 21:58:16
【问题描述】:

我不知道我做错了什么,我想通过 get 访问器访问私有整数,但我无法让它工作。 Map 类编译得很好,但我无法从 MapViewer 中的一个实例访问 get 方法。

我也尝试在官方文档中阅读它,代码应该没问题,但它不是

谢谢!

public class Map {

    int xSize {get;} = 0;
    int ySize {get;} = 0;

    public Map(int xSize, int ySize){
        this.xSize = xSize;
        this.ySize = ySize;
    }

}


public class MapViewer : MonoBehaviour {

    int xSize = 20;
    int ySize = 20;

    Map map;
    Texture2D image;

    void Start () {
        map = new Map (xSize, ySize);
        image = new Texture2D(map.???, map.???); //The issue is here
    }

【问题讨论】:

    标签: c# get accessor


    【解决方案1】:

    这些属性默认为private,您需要将它们声明为public

    public int xSize {get;} = 0;
    public int ySize {get;} = 0;
    

    【讨论】:

    • 我知道它们默认是私有的,所以我认为这更多的是我如何理解 getter 和 setter 的问题。据我所知,我会使用 getter 和 setter 来防止直接修改属性。在我的情况下,我希望 xSize 和 ySize 变量只是“获取”而不是“设置”,所以我认为将它们保留为私有只会允许我通过获取来编辑它们的值。如果变量被公开,即使没有获取和设置,我也可以访问它们。我在获取和设置方面做错了什么?谢谢!
    【解决方案2】:

    private 和 public 只定义属性的可见性。如果您希望它们仅在您的班级中设置,您绝对可以这样做:

    public int xSize { get; private set;}
    

    这将让其他类“看到”并评估该属性,但禁止他们设置它们。另一方面,您仍然可以在 Map 类中更改值。

    【讨论】:

    • 这就是我要找的,谢谢!使用私有集时,当我尝试从另一个类分配值时,我的 IDE 在编译之前不会发出任何警告。奇怪
    • 实际上大多数 IDE 应该强调尝试从另一个类设置属性,因为这会导致编译错误。 Visual Studio 中的 Intellisense 至少可以。
    【解决方案3】:

    您的属性是私有的。您需要指定公共访问权限。

    【讨论】:

      【解决方案4】:

      当您没有指定访问修饰符时,它会隐藏在 IDE 中,默认值为“private”。

      所以实际上你的代码是这样的;

      public class Map {
      
          private int xSize {get;} = 0;
          private int ySize {get;} = 0;
      
          public Map(int xSize, int ySize){
              this.xSize = xSize;
              this.ySize = ySize;
          }
      
      }
      
      
      public class MapViewer : MonoBehaviour {
      
          private int xSize = 20;
          private int ySize = 20;
      
          private Map map;
          private Texture2D image;
      
          void Start () {
              map = new Map (xSize, ySize);
              image = new Texture2D(map.???, map.???); //The issue is here
          }
      

      改变它喜欢;

      public class Map {
      
          public int xSize {get;} = 0;
          public int ySize {get;} = 0;
      
          public Map(int xSize, int ySize){
              this.xSize = xSize;
              this.ySize = ySize;
          }
      
      }
      
      public class MapViewer : MonoBehaviour {
      
          private int xSize = 20;
          private int ySize = 20;
      
          private Map map;
          private Texture2D image;
      
          void Start () {
              map = new Map (xSize, ySize);
              image = new Texture2D(map.???, map.???); //The issue is here
          }
      

      请点击下一个链接了解 C# 中的默认访问修饰符:
      What are the Default Access Modifiers in C#?

      C# 中的访问修饰符:
      https://msdn.microsoft.com/en-us/library/ms173121.aspx

      注意:您可以使用 resharper 来帮助您。但是不要像使用修饰工具一样使用 resharper。来自 Resharper 的“了解您应该如何处理错误或警告”。转发器:https://www.jetbrains.com/resharper/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 2013-03-19
        相关资源
        最近更新 更多