C# 返回一个常量字符串数组
我创建了一个C# 返回一个常量字符串数组,c#,arrays,C#,Arrays,我创建了一个string[]getter来获取一些关于类的信息。我希望它总是返回相同的值,而不是在每次调用时创建一个新对象 我现在已经这样实施了: string[] _someStrings = { "foo", "bar" }; protected string[] someStrings { get { return _someStrings; } } protected string[] someStrings { get { re
string[]
getter来获取一些关于类的信息。我希望它总是返回相同的值,而不是在每次调用时创建一个新对象
我现在已经这样实施了:
string[] _someStrings = { "foo", "bar" };
protected string[] someStrings {
get {
return _someStrings;
}
}
protected string[] someStrings {
get {
return { "foo", "bar" };
}
}
看起来还可以。然而,我的第一个想法是这样写的:
string[] _someStrings = { "foo", "bar" };
protected string[] someStrings {
get {
return _someStrings;
}
}
protected string[] someStrings {
get {
return { "foo", "bar" };
}
}
但这不起作用(我得到了错误;预期的)
为什么?
(这主要是一个“理解C”问题)
更新我输入了一个错误。我不想在每次调用时创建一个新对象。您的语法不正确。请尝试以下操作:
protected string[] someStrings
{
get
{
return new string[] { "foo", "bar" };
}
}
您不能有常量
数组,但可以有一个只读
数组,它将按照您的预期工作(显然也可以是静态
):
您的语法不正确。请尝试以下操作:
protected string[] someStrings
{
get
{
return new string[] { "foo", "bar" };
}
}
您不能有常量
数组,但可以有一个只读
数组,它将按照您的预期工作(显然也可以是静态
):
正确的语法如下:
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
正确的语法如下:
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
作为一种替代方法,我是否可以建议,如果内容应该是恒定的,则使用以下方法:
private readonly ReadOnlyCollection<string> UnderlyingReadOnlyStrings;
// populate the read-only collection, then...
public ReadOnlyCollection<string> ReadOnlyStrings {
get { return UnderlyingReadOnlyStrings; }
}
只读只读字符串下的私有只读只读集合;
//填充只读集合,然后。。。
公共只读集合只读字符串{
获取{return underyingreadonlystrings;}
}
这里的好处是,您的集合确实是只读的,并且实际上是常量。它不能被重新分配,而且内容也不能更改。您甚至可以将基础集合声明为静态集合,并填充到静态构造函数中
如前所述,您的第二个示例不起作用,因为您试图返回一个“内联数组”“,也就是说,语法不正确,如果是这样,您每次都会对数组进行新建,这违反了您的要求。作为一种替代方法,我是否可以建议,如果内容应该是恒定的,请改为使用以下方法:
private readonly ReadOnlyCollection<string> UnderlyingReadOnlyStrings;
// populate the read-only collection, then...
public ReadOnlyCollection<string> ReadOnlyStrings {
get { return UnderlyingReadOnlyStrings; }
}
只读只读字符串下的私有只读只读集合;
//填充只读集合,然后。。。
公共只读集合只读字符串{
获取{return underyingreadonlystrings;}
}
这里的好处是,您的收藏确实是只读的。而且几乎是恒定的。无法将其重新分配给,并且无法更改内容。您甚至可以将基础集合声明为静态集合,并填充到静态构造函数中
如前所述,您的第二个示例不起作用,因为您正试图返回一个“内联数组”,可以说,语法不正确,如果是,您每次都将new
ing数组,这违反了您的要求。这不是会在每次调用时创建一个新对象吗?我想避免这种情况。@BartFriederichs你说“返回相同的值,每次调用时创建一个新对象”创建字符串数组真的没有那么糟糕。对于“const”数组有一个更好的解决方案。我更新了我的答案。@在更新后的答案中,你可以像我在参数中做的一样,使用只读。出于子类化的原因(所有子类都应该注册一个不同的集合),我希望将它放在属性中。即使这里的readonly
,也可能会产生误导。如果集合本身和项目应为只读,则最好使用只读集合
。请看我的答案@Bartfriederichs,这不是在每次调用时都会创建一个新对象吗?我想避免这种情况。@BartFriederichs你说“返回相同的值,每次调用时创建一个新对象”创建字符串数组真的没有那么糟糕。对于“const”数组有一个更好的解决方案。我更新了我的答案。@在更新后的答案中,你可以像我在参数中做的一样,使用只读。出于子类化的原因(所有子类都应该注册一个不同的集合),我希望将它放在属性中。即使这里的readonly
,也可能会产生误导。如果集合本身和项目应为只读,则最好使用只读集合
。请看我的答案@Bartfriederichs,这不是一个匿名类型的列表吗?你不应该写“新字符串[]”吗?(我相信你,但我正在试图理解为什么…@Pluc:不,这会创建一个数组。使用new{…}
创建匿名类型-请注意缺少的方括号。它看起来很相似,但完全是另一回事<代码>新[]{“foo”,“bar”}代码>和新字符串[]{“foo”,“bar”}代码>完全相同。在第一个场景中,编译器推断数组的元素类型为string
,因为您指定的所有元素都是字符串。这不构成匿名类型的列表吗?你不应该写“新字符串[]”吗?(我相信你,但我正在试图理解为什么…@Pluc:不,这会创建一个数组。使用new{…}
创建匿名类型-请注意缺少的方括号。它看起来很相似,但完全是另一回事<代码>新[]{“foo”,“bar”}代码>