代码之家  ›  专栏  ›  技术社区  ›  Shaun Hamman

是否可以更改基本数据类型的默认值?

  •  2
  • Shaun Hamman  · 技术社区  · 17 年前

    我最近创建了一个通用矩阵<T>类,该类充当列表的包装器<列表<T>&燃气轮机;收集据我所知,这门课学得很好。我遇到了一个关于T的默认值的小问题。

    我创建了Matrix的一个实例<int>(3,3),它创建一个3x3整数矩阵,使用默认值(T)将所有整数默认为0。我知道值类型(包括原语)默认为0,引用类型默认为null。我想知道是否有可能更改此默认值,以便如果将值类型传递到矩阵中,它将填充5,而不是0。

    我怀疑更改默认值是不可能的,在矩阵被实例化后,我将不得不一个一个地循环遍历矩阵单元格,但我想在这里问一下,以防万一。

    6 回复  |  直到 17 年前
        1
  •  3
  •   Matthew Scharley    17 年前
     public Matrix(int width, int height) : this(width, height, default(T)) {}
     public Matrix(int width, int height, T defaultValue)
     {
         List<T> rows = new List<T>(height);
         for (int i = 0; i < height; i++)
         {
             List<T> columns = new List<T>(width);
             for (int j = 0; j < width; j++)
             { columns.Add(defaultValue); }
             rows.Add(columns);
         }
         // store `rows` wherever you are storing it internally.
     }
    

    但正如约瑟夫所说,没有办法确定 default(T) 评估为。

        2
  •  1
  •   Joseph    17 年前

    var someInt = default(int); //this will always be 0, you can't change it
    var someReference = default(SomeClass); //this will always be null
    

    这是一个 msdn article 关于它,虽然它并没有比已经说过的更具描述性。

        3
  •  1
  •   Tinister    17 年前

    default(T) 默认情况下,运行时会根据应用程序的请求将内存归零,而C#只分配空间,而不会覆盖零。在内存中,非数字类型的默认值(例如null引用、false)表示为零。这会导致一些奇怪的行为;例如 default(MyEnumType) 即使从未指定枚举值等于零,也将为零。

        4
  •  1
  •   Guffa    17 年前

    public struct DefaultFiveInteger {
    
       private int _value;
    
       public DefaultFiveInteger(int value) {
          _value = x - 5;
       }
    
       public static implicit operator int(DefaultFiveInteger x) {
          return x._value + 5;
       }
    
       public static implicit operator DefaultFiveInteger(int x) {
          return new DefaultFiveInteger(x);
       }
    
    }
    

    现在,您可以声明一个初始化为默认值(0)的变量,它将返回带有偏移量的值:

    DefaultFiveInteger x;
    Console.Write(x);
    

    输出:

    5
    
        5
  •  0
  •   DougJones    17 年前

    public struct MyInt
    {
        private int _defaultInt;
        public int DefaultInt
        {
            get
            {
                if (_defaultInt == 0)
                    return 5;
                else
                    return _defaultInt;
            }
            set
            {
                _defaultInt = value;
            }
        }
    }
    
        6
  •  0
  •   ShawnFeatherly    15 年前

    结合Guffa和DougJones的想法,你可以抵消一位地产支持成员的影响。

    public struct MyInt
    {
        private const int INT_DEFAULT = 5;
        private int _defaultInt;
        public int DefaultInt
        {
            get { return _defaultInt + INT_DEFAULT; }
            set { _defaultInt = value - INT_DEFAULT; }
        }
    }
    
    推荐文章