我创建了一个string[]
getter来获取有关类的一些信息。我希望它始终返回相同的值,而不是在每次调用时创建一个新对象。
我现在已经实现了这样:
string[] _someStrings = { "foo", "bar" };
protected string[] someStrings {
get {
return _someStrings;
}
}
似乎没问题。但是,我的第一个想法是这样写:
protected string[] someStrings {
get {
return { "foo", "bar" };
}
}
但这不起作用(我收到错误; expected
)。
为什么?
(这主要是“了解C#问题”。
更新我写了一个错字。我不想要在每次调用时创建一个新对象。
答案 0 :(得分: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
答案 1 :(得分:2)
作为替代方法,我可以建议,如果内容应该是常量,则使用a read-only collection代替:
private readonly ReadOnlyCollection<string> UnderlyingReadOnlyStrings;
// populate the read-only collection, then...
public ReadOnlyCollection<string> ReadOnlyStrings {
get { return UnderlyingReadOnlyStrings; }
}
这里的好处是您的收藏品真的是只读的。并且几乎不变。它不能重新分配,内容不能改变。您甚至可以将基础集合声明为静态并填充在静态构造函数中。
你的第二个例子不起作用,如前所述,因为你试图返回一个“内联数组”,可以这么说,语法不正确,如果是,你将{{1每次都是数组 - 这违背了你的要求。
答案 2 :(得分:1)
您的语法不正确。试试这个:
protected string[] someStrings
{
get
{
return new string[] { "foo", "bar" };
}
}
你不能拥有const
数组,但是你可以拥有一个readonly
数组,它可以按预期工作(显然也可以是static
):
public readonly string[] someStrings = { "foo", "bar" };