繁体   English   中英

创建数组属性是否有意义?

[英]Does it EVER make sense to make an array property?

根据MSDN ,当返回数组时,应该使用方法而不是属性。 他们进一步推论为什么这是一个具体的例子。

但是,有几种情况我可以看到这看起来有点极端。

情况1

该属性位于数据容器中,其余数据是属性。 每次请求都不可能重构属性以生成新数组。

public class Foo
{
    private readonly int[] bar;
    private int fooish;

    public Foo(int[] bar, int fooish)
    {
        this.bar = bar;
        this.fooish = fooish;
    }

    public int[] Bar
    {
        get { return bar; }
    }

    public int Fooish
    {
        get { return fooish; }
    }
}

案例2

类的公共字段被重构为属性(至少提供封装的假象)。

public class Foo
{
    public int[] Bar { get; set; }
    public int Fooish { get; set; }

    // Other members...
}

我的问题是 - 如果我知道它们是由一个字段支持(并且可能永远都是),那么将它们变成方法是否有任何现实的论据?

背景 :我正在移植一个其他人将从Java中使用的库到C#,并试图在使用属性时提出某种经验法则,何时不使用(因为在Java中它们是方法或字段)。 不幸的是,在应用程序中广泛使用公共数组字段使得决策变得困难 - 如果我确实知道它应该总是像数组变量一样,我真的需要创建方法GetBar()SetBar(int[] bar)吗? 或者在这种情况下,这些公共字段是否应该作为.NET中的公共字段而不是制作属性? (呸)

首先,您提到的指南是用于设计类库 - 如果您的代码将被其他开发人员使用,那么它们比您在维护的应用程序中使用时更重要。

数组的问题在于调用者可以修改其中的元素 - 我不认为仅仅因为这些指南将数组暴露为公共字段而使得很多有意义(没有冒犯),因为它没有解决该问题。

在可能的情况下,您可以将它们公开为IReadOnlyList<T>

private int[] arr;
public IReadOnlyList<int> Arr { get { return arr; }}

如果应用程序确实要求调用者可以更改数组的内容,那么绝对应该避免使用方法,因为这会使它更加模糊:

class MyClass
{
    private int[] arr;

    // can't clone the array, because your application requires the caller to change elements
    public int[] GetArr() { return arr; }
}

...

// very unclear for the caller that he's actually modifying the array on the obj instance
int[] values = obj.GetArr();
values[2] = 12;

在那种情况下, obj.Arr[2] = 12; 更直观。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM