C# 设置数组项变量的值

C# 设置数组项变量的值,c#,C#,我想为数组项变量设置一个值: string string1; string string2; string[] myArray = { string1, string2 }; public Test(){ for(int i=0; i < myArray.Length; i++){ myArray[i] = "hello!"; } } string1; 弦2; 字符串[]myArray={string1,string2}; 公开考试(){ for(i

我想为数组项变量设置一个值:

string string1;
string string2;
string[] myArray = { string1, string2 };

public Test(){
  for(int i=0; i < myArray.Length; i++){
    myArray[i] = "hello!";
  }
}
string1;
弦2;
字符串[]myArray={string1,string2};
公开考试(){
for(int i=0;i

如果我使用myArray[I]=“Hello”方法,那么它将设置为myArray值,而不是string1和string2值。

我不太清楚您要问什么,但我认为您的困惑在于引用和值类型

如果您想使用
myArray
写入
string1
string2
,您必须了解C#中的值和引用类型

对于当前的用法,可以考虑字符串值类型。我的意思是:如果您将一个字符串分配给另一个字符串(

stringstringx=a_previous_声明的_string
),它将创建一个副本。更改副本不会更改原件。将字符串存储在
MyArray
中也会创建一个副本

(请注意,实际上string是一种引用类型,在执行赋值时其行为类似于值类型(
stringX=stringY
)操作。如果您想了解更多,您可以(例如)开始。为了解释值类型和引用类型之间的一般区别,使用您的示例,我简化了一个调用字符串(此处为值类型)

如果要更改原始字符串,必须在
myArray
中存储对字符串的引用。为此,在C#中,您可以创建一个引用类型变量来保存您的值类型。这可以是一个将字符串作为字段保存的类。然后,在
MyArray
中存储对类的引用。如果随后通过
MyArray
更改字符串,则原始的
string1
string2
也将被修改

我创建了最简单的版本来帮助您理解。请参阅@knittl他的答案,以了解更通用的实现,该实现也适用于其他值类型(如
int
float

我的示例(我测试并作为C#控制台应用程序运行):

C#中的数组包含基本值(整数、双精度、布尔值等)或引用(对类或结构实例的引用)。当您更新数组中的一项时,您只需更改数组中的“值”。您没有更新指向的对象。换句话说:您只需交换引用以指向另一个对象,该对象永远不会更改

要实现这一点,您需要插入另一个级别的inderection(想想好的ol'C中指向指针的指针)

实现这一点的一个选项是引入包装器类型来保存您的值并允许更新它:

class Reference<T> {
  T Value { get; set; }
  public Reference(T value) {
    this.Value = value;
  }
}

Reference<string> string1;
Reference<string> string2;
Reference<string>[] myArray = { string1, string2 };

public Test() {
  for(int i = 0; i < myArray.Length; i++) {
    myArray[i].Value = "hello!";
  }
}
类参考{
T值{get;set;}
公共参考(T值){
这个。值=值;
}
}
参考线1;
参考线2;
引用[]myArray={string1,string2};
公开考试(){
for(int i=0;i
您需要初始化“string1”和“string2”的空字符串。然后它将获取其中的值。

        string string1="";
        string string2="";
        string[] myArray = { string1, string2 };

        for (int i = 0; i < myArray.Length; i++)
        {
            myArray[i] = "hello!";
        }
字符串string1=“”;
字符串string2=“”;
字符串[]myArray={string1,string2};
for(int i=0;i
不能通过操纵数组来更改变量string1和string2

我希望下面的代码片段能更清楚地说明发生了什么。重要的一点是,在创建数组时,它包含对变量指向的对象的引用,而不是对变量本身的引用
a[i]=
更改数组元素指向的对象,而不是创建它的变量

//Int是一种值类型
inti1=1;
int[]ai={i1};//数组包含实际数字“1”,
//数组的每个元素的大小为int
ai[0]=7;//这将在*阵列内*将数字1交换到7*
//C是一个引用类型的类
C=新的C{Property=1};
C[]a2={C};//数组包含对“c”的引用
//现在c和a2[0]都指向同一个对象
//重要的是,c不能控制数组
//数组不控制变量c
//他们只是指向同一个物体
a2[0]。属性=2;//这将更改对象a2点的特性,
//c指向的是同一个对象
//请注意c.属性=3;不会更改数组,
//它将更改[0]也指向的对象。
//但是,我们也可以更改对象a[0]的点数;
a2[0]=新的C{Property=4};//这使[0]指向一个新对象
//在C#中,string是一种引用类型
字符串string1=“Hello1”;
字符串[]myArray={string1};
myArray[0]=“你好!”;//这使myArray[0]指向另一个对象,该对象是一个新字符串“hello!”

Ok。那么问题具体是什么呢?你能解释一下你想做什么吗<代码>字符串1=“你好”?@knittl是的,我想更改string1和string2值如果您有一个值数组,为什么还需要单独的值?这似乎是不必要的重复。是的,但我的观点是,为什么您需要string1和string2呢?为什么不简单地将数据存储在数组中,而忽略单个变量?我是唯一一个完全不理解这个答案的人吗?@Olegl,我希望如此;)(虽然不是100%精确),但是对于当前的用法,可以考虑字符串值类型。“廷坦,为什么?正如我在回答中所解释的,当他分配一个字符串时,它将创建一个副本。这里没有什么误导性的东西,我有一个概念,这里是它的背后,所以OP可以搜索一个关于值类型、引用类型以及字符串在其中的适应方式的通读。@tymtam,好的,现在可以毫无疑问的事实是,
string
是一个特殊情况。这是行不通的。在循环之后,参考
stri
class Reference<T> {
  T Value { get; set; }
  public Reference(T value) {
    this.Value = value;
  }
}

Reference<string> string1;
Reference<string> string2;
Reference<string>[] myArray = { string1, string2 };

public Test() {
  for(int i = 0; i < myArray.Length; i++) {
    myArray[i].Value = "hello!";
  }
}
        string string1="";
        string string2="";
        string[] myArray = { string1, string2 };

        for (int i = 0; i < myArray.Length; i++)
        {
            myArray[i] = "hello!";
        }