我试图弄清楚我是如何成功更改"只读"数组的.下面的代码运行成功,但我很困惑为什么私有/只读数组的解除引用是合法的,如下所示:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.Time[5] = 5; // Why is this legal? How can I make it illegal?
}
}
public class MyClass
{
private readonly uint[] time;
public IList<uint> Time
{
get { return time; }
}
public MyClass()
{
time = new uint[7];
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如我在上面提到的那样,我认为Time [5]是非法的,因为公共IList Time没有setter.
如何更改MyClass以确保它不合法myClass.Time[5]?
注意:我已经澄清了这个问题的意图,我在一开始就不清楚其意图是制作这个ILLEGAL.而且我想了解为什么它的合法性一如既往.
正如我在上面提到的那样,我认为Time [5]是非法的,因为公共IList Time没有setter.
缺少setter意味着您无法将NEW ARRAY分配给属性的支持字段,但这并不意味着您无法更改支持字段指向的CURRENT数组引用.
另外,如何在构造函数中创建一个只读且在此类之外不可更改的数组?
您可以根据MSDN在声明阶段或类的构造函数中实现只读字段.
至于如何解决这个问题,下面的MSDN文章讨论了这个确切的问题以及解决它的一些方法.我不确定您的要求是什么,但我建议您尝试使用ReadOnlyCollectionBase实现自定义集合,然后传递它或者您可以使用ReadOnlyCollection<T>.ReadOnlyCollectionBase的链接提供了一个实现示例.
| 归档时间: |
|
| 查看次数: |
564 次 |
| 最近记录: |