c# - 强制 C# 编译器创建未使用的对象实例

标签 c# compiler-construction instance jit

是的,这正是我想要做的 :) 至少对于特定的类(class)。 问题是,我创建了一个对象的静态实例,但我不直接使用它。由于我在构造函数中执行了一些操作,例如将对象添加到列表中,因此在获取列表之前必须至少调用一次构造函数。

我猜编译器只是优化了未使用的对象。

必须有一个简单的解决方案:-/

编辑

好吧,我可能错过了什么。让我发布我的代码。我为自定义枚举目的编写了一个类。

        public class TypeSafeEnum<TNameType, TValueType>
        {
        protected readonly TNameType name;
        protected readonly TValueType value;

        private static List<TypeSafeEnum<TNameType, TValueType>> listEnums = new List<TypeSafeEnum<TNameType, TValueType>>();

        protected TypeSafeEnum(TNameType name, TValueType value)
        {
          this.name = name;
          this.value = value;

          listEnums.Add(this);
        }

        public TNameType Name
        {
          get { return name; }
        }

        public TValueType Value
        {
          get { return value; }
        }

        public static TypeSafeEnum<TNameType, TValueType> GetName(TNameType name)
        {
          TypeSafeEnum<TNameType, TValueType> tse = null;
          for (int i = 0; i < listEnums.Count; i++)
          {
            TypeSafeEnum<TNameType, TValueType> typeSafeEnum = listEnums[i];
            if (EqualityComparer<TNameType>.Default.Equals(typeSafeEnum.name, name))
            {
              tse = typeSafeEnum;            
            }
          }
          return tse;
        }

        public static TypeSafeEnum<TNameType, TValueType> GetValue(TValueType value)
        {
          TypeSafeEnum<TNameType, TValueType> tse = null;
          for (int i = 0; i < listEnums.Count; i++)
          {
            TypeSafeEnum<TNameType, TValueType> typeSafeEnum = listEnums[i];
            if (EqualityComparer<TValueType>.Default.Equals(typeSafeEnum.value, value))
            {
              tse = typeSafeEnum;
            }
          }
          return tse;
        }

        public static TNameType[] GetNames()
        {
          TNameType[] names = new TNameType[listEnums.Count];
          for (int i = 0; i < listEnums.Count; i++)
          {
            TypeSafeEnum<TNameType, TValueType> typeSafeEnum = listEnums[i];
            names[i] = typeSafeEnum.name;
          }
          return names;
        }

        public static TValueType[] GetValues()
        {
          TValueType[] values = new TValueType[listEnums.Count];
          for (int i = 0; i < listEnums.Count; i++)
          {
            TypeSafeEnum<TNameType, TValueType> typeSafeEnum = listEnums[i];
            values[i] = typeSafeEnum.value;
          }
          return values;
        }
        }


        public abstract class StringEnum : TypeSafeEnum<string, int>
        {
            protected StringEnum(string name, int value) : base(name, value)
            {
            }
        }


        public sealed class FileOptionEnum : StringEnum
        {
            public static readonly FileOptionEnum Name = new FileOptionEnum("Name", 0);
            public static readonly FileOptionEnum Extension = new FileOptionEnum("Extension", 1);
            public static readonly FileOptionEnum Size = new FileOptionEnum("Size", 2);
            public static readonly FileOptionEnum LastModified = new FileOptionEnum("Last Modified", 3);
            public static readonly FileOptionEnum LastOpened = new FileOptionEnum("Last Opened", 4);
            public static readonly FileOptionEnum Created = new FileOptionEnum("Created", 5);

            public FileOptionEnum(string name, int value) : base(name, value)
            {
            }
        }

下面是我的使用方法:

        // if I omit this line it returns me empty array
        FileOptionEnum @enum = FileOptionEnum.Name;
        string[] names = FileOptionEnum.GetNames();
        cbFileOptions.Items.AddRange(names);

最佳答案

你可以简单地写

new YourObject();

这不会被优化掉。
然而,除非类的构造函数将自身保存在某个地方(例如,将对象添加到列表或静态字段,或将事件处理程序添加到其他内容),否则该对象可能会立即被垃圾回收。

关于c# - 强制 C# 编译器创建未使用的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2958066/

相关文章:

c# - 如何计算c#应用程序的执行时间

parsing - LR(k) 到 LR(1) 语法转换

compiler-construction - 用于优化的 LLVM 静态值分析

java - 如何为实例设置唯一ID

javascript - 在 javascript 中查找某个原型(prototype)有多少个实例

c# - 如何将实体从一个 Entity Framework 上下文复制到另一个 Entity Framework 上下文?

c# - 如何在 asp.net mvc 3 中不使用 ajax 的情况下渲染某些特定 div 中的部分 View ?

c# - 检查 C# 中的任何条件编译符号

c++ - 我们是否应该在 C++ 中更喜欢临时变量而不是用户定义的变量

java - 创建实例变量不起作用?