C#中具有命名的非只读类型的匿名类

本文关键字:只读 类型 | 更新日期: 2023-09-27 18:20:27

目前我正在做一些事情:

public class UselessClass
{
    public string x;
    public int y;
}

我只在函数中使用过一次这个类。。。

Dictionary<string, UselessClass> dict;

我希望能够编辑UselessClass的值,所以我认为Tuple是不够的,因为它们在创建后是只读的。我还想让命名的变量x和y做一些事情,比如:

dict["hello"].y++;

当一个函数只使用过一次UselessClass时,我能做到这一点而不必让它坐在代码周围吗?某种带有命名变量的匿名类?

添加更多详细信息:

这纯粹用于算法函数中,我想用某些变量连接一个字符串,即另一个字符串x和一个表示距离的整数

我能想到的向已经存在的类类字符串添加属性的最好方法是使用字典。

不做:

Dictionary<string, string> names;
Dictionary<string, int> distances;

这似乎是在浪费记忆,我宁愿把名字和距离都放在同一个结构中。

但结构本身毫无意义,它只用于算法中进行计算。

C#中具有命名的非只读类型的匿名类

无匿名类型是不可变的。如果您想要一个可变类型,请使用类(而不是结构)。使用dynamicExpandoObject是一种选择,但您会失去设计时类型的安全性。

如果你提供更多的上下文作为它们是如何使用的,那么可能还有其他选择。

要提供一个与terrybozzio类似的解决方案,尽管它不那么黑客(使用单个元素数组并不那么好),您还可以使用一个使类型可变的包装器:

class Mutable<T>
{
    public Mutable(T value)
    {
        Value = value;
    }
    public T Value { get; set; }
}

然后你甚至可以将其用于匿名类型:

var x = new {
    Foo = "Bar",
    Baz = new Mutable<int>(2)
};
Console.WriteLine(x.Baz.Value); // 2
x.Baz.Value++;
Console.WriteLine(x.Baz.Value); // 3

但正如我在上面的一条评论中所说,如果需要在字典声明中引用匿名类型,那么就不能真正使用匿名类型。您可以使用元组,但总的来说,如果只引入自定义类型,您将获得更多的灵活性。例如,如果你决定(出于任何原因)需要另一个值,那么你可以简单地添加它,而不会破坏所有内容。另一方面,如果你使用元组或类似的东西,你就必须更新它的每一次使用

一种可能性就像你说的使用Tuple,但由于它们的元素无法更改,如果你想调用它,你可以做一点"破解",那就是声明一个Tuple<int[],string[]>,所以当你向字典中添加一个项时,你实例化了元组,但每个数组中只有一个元素可以操作:

Dictionary<string,Tuple<int[],string[]>> test = new Dictionary<string, Tuple<int[],string[]>>();
//here i add a new dict entry and to the int[] i assign the value 5.
test.Add("test1", new Tuple<int[], string[]>(new int[1]{5}, new string[1]));
test["test1"].Item1[0]++;
test["test1"].Item1[0]++;
//here the int will be 7.

虽然我会选择无用类。。。