【问题标题】:use a variable to store type使用变量来存储类型
【发布时间】:2019-02-19 11:41:59
【问题描述】:

我希望我的程序可以配置它应该使用什么类型的 int(很可能在 int16int32 之间)以节省空间。

我想在代码开头确定类型,所以我只需要更改一个位置,而不是将所有int16 更改为int32

会不会有类似的东西:

Type myIntType = int16;// or int32
//just change here
.....
.....
//lost of use of myIntType
List<myIntType> arr = new List<myIntType>();
.....

在小情况下,int 列表将包含 0 到 10,000 之间的数字 所以UInt16应该不错。

但对于大型情况,int 列表将包含 0 到 1,000,000 之间的数字 所以应该使用Int32

我什至希望有 int20。

而且列表的大小可能非常大,所以空间很密集。

【问题讨论】:

  • 我认为您正在寻找泛型,但不清楚。
  • 这是个坏主意。
  • 不,您不能使用变量来设置泛型参数。请在该列表中添加更多关于您想做什么的信息,以获得更好的解决方案。
  • 这是个坏主意,但您可以在文件顶部使用using myIntType = System.Int16;(每个文件)...
  • 你可以排序使用using MyList = System.Collections.Generic.List&lt;short&gt;;获得这个效果,但是这only引入了该类型的别名,所以它不会易于编写在所有情况下都能正常工作的代码。一般来说,您应该会发现这种切换根本没有回报——如果您的数据不需要int 但可以容纳short,为什么不总是使用它呢?如果您的数据可能不适合short,为什么不总是使用int?最重要的是,您如何确定这甚至是内存使用的实际问题,值得解决?

标签: c# variables types int


【解决方案1】:

您可以在 C# 中使用动态类型(我不确定它是在哪个版本中引入的,但最新版本应该有)

    List<dynamic> l = new List<dynamic>();
    dynamic d1 = 1;
    dynamic d2 = (Int16)1;

    l.Add(d1);
    l.Add(d2);
    //Your code goes here
    Console.WriteLine(d1.GetType());
    Console.WriteLine(d2.GetType());

    l.ForEach( x => Console.WriteLine(x.GetType()));

【讨论】:

  • 如果意图是节省内存,dynamic 不会削减它,因为这是一个对象引用。它并不比 int 好,在 64 位设置中差两倍……这甚至没有触及 dynamic 的运行时成本,与原生类型相比,这是相当可观的。
  • 感谢@JeroenMostert 指出。对于社区,这是我发现的动态内存使用的解释 - stackoverflow.com/questions/41686630/… 我仍然在这里留下答案,以防有人正在寻找可以完成的方法
猜你喜欢
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多