1

好的,我有这门课和主课。我在 VS 2010 Ultimate 和 .NET 4 客户端上。

internal class tezt
{
    private int[] _numeros = new int[5];
    public int[] Numeros
    {
        get { return _numeros; }
    }
}
public class tezt2
{
    private int[] _numeros = new int[5];
    public int[] Numeros
    {
        get { return _numeros; }
    }
}
class tezt3
{
    private int[] _numeros = new int[5];
    public int[] Numeros
    {
        get { return _numeros; }
    }
}
internal static class Program
{
    private static void Main()
    {
        var arrNums = new tezt();
        var arrNums2 = new tezt2();
        var arrNums3 = new tezt3();
        Console.WriteLine(arrNums.Numeros[0]);
        arrNums.Numeros[0] = 5;
        Console.WriteLine(arrNums.Numeros[0]);
        Console.WriteLine(arrNums2.Numeros[0]);
        arrNums2.Numeros[0] = 6;
        Console.WriteLine(arrNums2.Numeros[0]);
        Console.WriteLine(arrNums3.Numeros[0]);
        arrNums3.Numeros[0] = 7;
        Console.WriteLine(arrNums3.Numeros[0]);
        Console.ReadKey(true);
    }
}

这些行发生了什么:

arrNums.Numeros[0] = 5;
arrNums2.Numeros[0] = 6;
arrNums3.Numeros[0] = 7;

是不是因为派生这些对象的类没有set参数,所以不能允许这些分配?

可以做些什么来避免这种情况,限制这种情况,这样做会arrNums.Numeros[0] = 5;引发错误?

4

2 回答 2

2

您不是在设置Numeros属性,而是在修改该属性内索引处的元素。您只使用该属性的吸气剂

不允许的分配是为该对象的属性分配一个新值:

arrNums.Numeros = new int[5]; // will not compile.

你可以让 getter 返回一个IEnumerable<int>来保护它:

class tezt3
{
    private int[] _numeros = new int[5];
    public IEnumerable<int> Numeros
    {
        get { return _numeros; }
    }
}

您也可以使用ReadOnlyCollection. 在这个问题中深入讨论了使用IEnumerable<T>vs的优缺点。ReadOnlyCollection<T>

于 2012-04-25T02:18:31.023 回答
0

我也可以建议不要在属性上使用数组。这是来自框架设计指南的引用

返回数组的属性可能非常具有误导性。通常需要返回一个内部数组的副本,以便用户无法更改内部状态。这可能导致代码效率低下。

在以下示例中,Employees 属性在循环的每次迭代中被访问两次。对于以下短代码示例,这将是 2n + 1 个副本:

Company microsoft = GetCompanyData("MSFT");
for (int i = 0; i < microsoft.Employees.Length; i++)
{   
  if (microsoft.Employees[i].Alias == "kcwalina")
  {  ...  }
}

本书的注释者布拉德·艾布拉姆斯 ( Brad Abrams ) 评论了这个陷阱:

本书中的一些指导方针经过辩论并在摘要中达成一致;其他人是在艰苦的学校里学到的。返回数组的属性的指导方针是在硬敲阵营中。当我们调查 .NET Framework 1.0 版中的一些性能问题时,我们注意到正在创建数以千计的数组并很快被丢弃。事实证明,框架本身的许多地方都遇到了这种模式。不用说,我们修复了这些实例和指南。- 布拉德艾布拉姆斯

于 2012-04-25T03:05:44.930 回答