如何使用属性将私有数组公开为只读? [关闭]

Posted

技术标签:

【中文标题】如何使用属性将私有数组公开为只读? [关闭]【英文标题】: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?! 【参考方案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;


【讨论】:

以上是关于如何使用属性将私有数组公开为只读? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

试图将类成员公开为只读或公共常量

如何公开集合属性? [关闭]

在 Amazon S3 中公开存储桶 [关闭]

如何使 QSlider 只读?

如何使 MFC 复选框只读但保持启用文本?

如何使一个类中的私有哈希图对其他类可见[关闭]