【问题标题】:How to use properties to expose a private array as read-only? [closed]如何使用属性将私有数组公开为只读? [关闭]
【发布时间】:2011-08-22 18:20:49
【问题描述】:

下面的代码是做什么的?

class MyClass {
    private int[] myPrivates;
    public int[] GetMyPrivates
    {
      get { return myPrivates; }
    }

    protected int[] SetMyPrivates
    {
      set { myPrivates = value; }
    }
}

有没有更好的方法来保护数组myPrivates?是否有可能使它成为唯一的?

【问题讨论】:

  • “为什么不让 myPrivates 只读?” 好吧.. 你想要它只读吗?如果您需要一个二传手,那么显然它不应该是只读的。如果您不需要 setter,则将其设为只读。
  • 我个人认为保护自己的隐私总是一个好主意。
  • 为什么要写 C# Javastyle?
  • @Albin Sunnanbo javastyle到底是什么?
  • 这里需要的唯一答案是:lolwhut?!

标签: c# properties private protected


【解决方案1】:

您的问题非常不清楚。

你可能正在尝试写作

public int[] MyArray { 
    get { return data; }
    protected set { data = value; }
}

如果您想阻止人们修改数组(例如,instance.MyArray[5] = 42),您需要改为公开ReadOnlyCollection<int>

【讨论】:

  • 我使用时会产生编译错误
【解决方案2】:

您可以通过这种方式将您的 getter 和 setter 替换为属性:

class MyClass {
    public int[] MyValues { get; protected set; }

    public MyClass() {
        MyValues = new [] {1, 2, 3, 4, 5};
    }

    public void foo {
        foreach (int i in MyValues) {
            Trace.WriteLine(i.ToString());
        }
    }
}

MyOtherClass {
    MyClass myClass;

    // ...
    void bar {
        // You can access the MyClass values in read outside of MyClass, 
        // because of the public property, but not in write because 
        // of the protected setter.
        foreach (int i in myClass.MyValues) {
            Trace.WriteLine(i.ToString());
        }
    }
}

您可以添加几乎任何低于的保护级别,该级别是 getter 和 setter 的属性之一。

【讨论】:

  • myPrivates 在哪里??我需要在课堂上进行设置。
  • 这是一个自动属性。我将添加一个使用示例。
  • 作为伪代码很有趣。但是我在寻找答案
  • 我刚刚为你更新了我的答案。
  • 您提供了时间。我会接受
【解决方案3】:

您可以做的最好的事情之一就是使用 .NET 的auto-implemented properties。这是一项允许您在没有支持字段的情况下声明属性的功能。支持字段由 .NET 自动生成。

所以,你的代码可以翻译成:

class MyClass
{
   public int[] GetMyPrivates
   {
      get;
      protected set;
   }
}

现在,关于您更笼统的问题,“您可以在课堂上做什么”。嗯...这是一个非常、非常的开放性问题,值得进行长时间的解释。但是,只要略过表面,您就可以:

  • 定义对象(这就是 class 所做的)
  • 通过fields(一个简单的变量)和properties(一种看起来像字段的方法)描述您的对象的特征。
  • 通过methods描述对象的行为(这是面向对象的函数术语)
  • 定义您的项目(对象、特征和/或行为)是静态的还是实例的。简单地说,instance 意味着您正在处理对象/特征/行为的特定实例; static 表示您正在处理整个对象系列
  • 为您的对象/特征/行为(例如,内部、公共、受保护、私有)定义 access control

可以说的还有很多,但这应该让您了解在 .NET 中使用类时所拥有的能力

【讨论】:

    【解决方案4】:

    如果您来自 Java 背景(您的 括号 提示是这样),您可能需要知道 .NET 有一个称为属性的概念,因此您可以说:

    class MyClass {
        private int[] myPrivates;
        public int[] MyPrivates {
          get { return myPrivates; }
          set {myPrivates = value;}
        }
    }
    

    甚至是自动属性:

    class MyClass {
        public int[] MyPrivates {get; set;}
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2012-04-29
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多