1

我创建了一个string[]getter 来获取有关某个类的一些信息。我希望它始终返回相同的值,而不是在每次调用时创建一个新对象。

我现在像这样实现它:

string[] _someStrings = { "foo", "bar" };
protected string[] someStrings {
    get {
        return _someStrings;
    }
}

这似乎没问题。但是,我的第一个想法是这样写:

protected string[] someStrings {
    get {
        return { "foo", "bar" };
    }
}

但这不起作用(我得到错误; expected)。

为什么?

(这主要是一个“了解 C# 的问题)。

更新我打错了。我不想在每次调用时都创建一个新对象。

4

3 回答 3

4

正确的语法是这样的:

return new [] { "foo", "bar" };

原因是没有的短语new []法只对赋值有效。

正如您在评论中正确指出的那样,这将在每次调用时创建一个新对象。避免这种情况的唯一方法是使用存储创建的实例并返回该字段的字段。这正是您已经拥有的解决方案。
但是请注意,这允许消费者更改数组的内容并影响其他消费者:

var a1 = foo.SomeStrings;
var a2 = foo.SomeStrings;
a1[0] = "Some other value";
Assert.Equal("Some other value", a2[0]); // will pass
于 2013-08-07T12:52:45.960 回答
2

作为一种替代方法,我可以建议,如果内容应该是不变的,请改用只读集合,例如:

private readonly ReadOnlyCollection<string> UnderlyingReadOnlyStrings;

// populate the read-only collection, then...

public ReadOnlyCollection<string> ReadOnlyStrings {
  get { return UnderlyingReadOnlyStrings; }
}

这样做的好处是您的收藏确实是只读的。并且几乎是恒定的。不能重新分配,内容也不能更改。您甚至可以将底层集合声明为静态并填充到静态构造函数中。

如前所述,您的第二个示例不起作用,因为您正在尝试返回“内联数组”,可以这么说,并且语法不正确,如果是,您new每次都会使用数组 -这违背了你的要求。

于 2013-08-07T12:57:44.457 回答
1

你的语法不正确。尝试这个:

protected string[] someStrings 
{
    get 
    {
        return new string[] { "foo", "bar" };
    }
}

你不能有const数组,但你可以有一个可以readonly按预期工作的数组(显然也可以static是):

public readonly string[] someStrings = { "foo", "bar" };
于 2013-08-07T12:51:49.343 回答