首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中具有命名非只读类型的匿名类

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

Stack Overflow用户
提问于 2014-09-03 23:37:32
回答 3查看 88关注 0票数 1

目前,我正在做的事情大致如下:

代码语言:javascript
运行
复制
public class UselessClass
{
    public string x;
    public int y;
}

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

代码语言:javascript
运行
复制
Dictionary<string, UselessClass> dict;

我希望能够编辑元组的值,所以我认为UselessClass是不够的,因为它们一旦创建就是只读的。我还想让命名变量x和y来做如下事情:

代码语言:javascript
运行
复制
dict["hello"].y++;

我可以做到这一点,而不必让这个UselessClass坐在代码周围,而实际上它只对一个函数使用一次吗?某种带有命名变量的匿名类?

要添加更多详细信息:

这纯粹是在一个算法函数中使用的,在这个函数中,我希望将一个字符串与某些变量连接在一起,即另一个字符串x和一个表示距离的整数

我能想到的将属性添加到已有类(如string )的最佳方法是使用字典。

而不是做:

代码语言:javascript
运行
复制
Dictionary<string, string> names;
Dictionary<string, int> distances;

这似乎是在浪费内存,我宁愿将名称和距离都放在同一个结构中。

但是结构本身本身是没有意义的,它只是在算法中用来执行计算。

EN

回答 3

Stack Overflow用户

发布于 2014-09-03 23:41:08

否-匿名类型是不可变的。如果您想要可变类型,请使用类(而不是结构)。使用dynamicExpandoObject将是一种替代方案,但您会失去设计时类型安全性。

如果你给出更多的上下文来说明它们是如何使用的,那么可能会有其他的选择。

票数 3
EN

Stack Overflow用户

发布于 2014-09-04 00:02:34

一种可能是像你所说的使用元组,但是由于它们的元素不能改变,你可以做一些"hack“,如果你想调用它是声明一个Tuple<int[],string[]>,所以当你向字典添加一个条目时,你实例化了这个元组,但每个数组中只有一个元素可以操作:

代码语言:javascript
运行
复制
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.

虽然我会选择UselessClass..。

票数 1
EN

Stack Overflow用户

发布于 2014-09-04 00:12:31

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

代码语言:javascript
运行
复制
class Mutable<T>
{
    public Mutable(T value)
    {
        Value = value;
    }
    public T Value { get; set; }
}

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

代码语言:javascript
运行
复制
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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25648413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档