在 C# 中通过引用分配可变字符串数组
Assign a variadic array of strings by reference in C#
我有一个名为 Category 的 class,它采用可变构造函数。参数是字符串。
class Category
{
string[] definedSets; // Sets supplied to the constructor
public Category(params string[] specifiedSets)
{
definedSets = specifiedSets;
}
etc.
对构造函数的调用可能看起来像 Category myCat = new Category(myString1, myString2);
问题是如果 myString1 或 myString2 的内容发生变化,我希望 definedSets 发生变化。我试过 definedSets = ref specifiedSets;
,但出现错误 The left hand side of a ref assignment must be a ref variable
,我不知道如何解决。
我走的路对吗?我该怎么办?
string
s 是不可变的,你不能改变它们的值。每当您分配新值时,它都会分配新内存。不可能每次都引用同一个内存位置。
我建议使用 StringBuilder
class 并将 definedSets
的类型更改为 StringBuilder
,
public class Category
{
StringBuilder[] definedSets; // Sets supplied to the constructor
public Category(StringBuilder specifiedSets)
{
this.definedSets = specifiedSets;
}
}
为此,您必须将字符串包装在自定义包装器中 class:
public class StrWrapper
{
public string Value {get; set;}
public StrWrapper(string val) => Value = val;
}
您可以传递对象引用并随时更改其中的字符串。
另请注意,您无法保存字符串参考:
因此,即使您可以让 ctor 接受一个 (string ref)[]
数组,您也只能在那里使用它而不存储它。
只需传递一个常规数组即可:
var strings = new[] { myString1, myString2 };
new Category(strings);
然后保留数组并随时更改其元素。
我有一个名为 Category 的 class,它采用可变构造函数。参数是字符串。
class Category
{
string[] definedSets; // Sets supplied to the constructor
public Category(params string[] specifiedSets)
{
definedSets = specifiedSets;
}
etc.
对构造函数的调用可能看起来像 Category myCat = new Category(myString1, myString2);
问题是如果 myString1 或 myString2 的内容发生变化,我希望 definedSets 发生变化。我试过 definedSets = ref specifiedSets;
,但出现错误 The left hand side of a ref assignment must be a ref variable
,我不知道如何解决。
我走的路对吗?我该怎么办?
string
s 是不可变的,你不能改变它们的值。每当您分配新值时,它都会分配新内存。不可能每次都引用同一个内存位置。
我建议使用 StringBuilder
class 并将 definedSets
的类型更改为 StringBuilder
,
public class Category
{
StringBuilder[] definedSets; // Sets supplied to the constructor
public Category(StringBuilder specifiedSets)
{
this.definedSets = specifiedSets;
}
}
为此,您必须将字符串包装在自定义包装器中 class:
public class StrWrapper
{
public string Value {get; set;}
public StrWrapper(string val) => Value = val;
}
您可以传递对象引用并随时更改其中的字符串。
另请注意,您无法保存字符串参考:
因此,即使您可以让 ctor 接受一个 (string ref)[]
数组,您也只能在那里使用它而不存储它。
只需传递一个常规数组即可:
var strings = new[] { myString1, myString2 };
new Category(strings);
然后保留数组并随时更改其元素。