提问人:Yogeswaran K 提问时间:2/27/2017 最后编辑:PiotrYogeswaran K 更新时间:3/1/2017 访问量:87
无法使结构中的值类型在 c 中可变#
Not able to make the value types inside a structure as mutable in c#
问:
我正在将 VB6 代码转换为 C#,在这里我必须将 struct 数组转换为 c# 中的 List 方法,但无法修改以下示例代码中的值,出现错误为
“无法修改 的返回值,因为它不是变量”。System.Collections.Generic.List<test.Program.TagFieldValue>.this[int]
我做错了什么..有没有其他方法可以在不将我的类型转换为类的情况下做到这一点?
using System;
using System.Collections.Generic;
namespace test
{
class Program
{
private struct TagFieldValue
{
private int _ID;
public int ID { get { return _ID; } set { _ID = value; } }
}
private List<TagFieldValue> mFieldValues = new List<TagFieldValue>();
static void Main(string[] args)
{
Program obj = new Program();
obj.test();
}
public void test()
{
for (int i = 1; i <= 10; i++)
{
TagFieldValue temp = new TagFieldValue();
temp.ID = i;
mFieldValues.Add(temp);
}
for (int i = 0; i <= 9; i++)
{
mFieldValues[i].ID = mFieldValues[i].ID + 10;
}
for (int i = 0; i <= 9; i++)
{
Console.WriteLine(mFieldValues[i].ID);
}
Console.ReadLine();
}
}
}
答:
2赞
Guy
2/27/2017
#1
Structs
作为值传递,而不是引用。 将修改列表中的副本,而不是本身。若要修改列表中的值,需要创建新的mFieldValues[i].ID = mFieldValues[i].ID + 10;
struct
TagFieldValue
for (int i = 0; i <= 9; i++)
{
mFieldValues[i] = new TagFieldValue { ID = mFieldValues[i].ID + 10 };
}
或更改为TagFieldValue
class
private class TagFieldValue
{
public int ID { get; set; }
}
评论
0赞
Adam Houldsworth
2/27/2017
这实际上是在各个点上获取结构的副本,但突出的情况是.创建新结构的替代方法,因为在这种情况下,结构不是不可变的,因此获取副本,进行更改,然后复制回数组:mFieldValues[i].ID =
var s = mFieldValues[i]; s.ID = s.ID + 10; mFieldValues[i] = s;
0赞
Yogeswaran K
2/27/2017
当前的实现包含许多结构,其中大多数在 VB6 中用作结构数组,因此在这里我将它们在 C# 中制作为 List <mystructure> ..如果我开始将每个结构转换为类代码,则可读性会降低,维护将是一个问题,但同时,如上所述,每次在许多地方编辑值看起来也不好。请就此提出一些建议。
0赞
Adam Houldsworth
2/27/2017
@user3816092 不完全确定你认为它的可读性和可维护性会降低 - 这些不是类的负面品质,只是糟糕的代码。
0赞
Pepijn Bakker
3/1/2017
#2
结构不是那么灵活。也无法定义输入,因此如果要执行此操作,则应改用类。我遇到了类似的问题,将其更改为类不会出现任何问题。
评论