我最近创建了一个通用矩阵<T>类充当围绕一个List <名单<T >>集合的包装。 据我所知,这个类可以正常使用。 我遇到了一个小问题,虽然有关的T的默认值。
我创建矩阵的一个实例<int>的(3,3),这产生整数的3×3矩阵,全部采用默认(T)默认为0。 我知道值类型(包括图元)默认为0当量,和引用类型默认为空。 我想知道是否有可能改变这个默认值,这样,如果一个值类型传递到矩阵,将它与5周的例如,而不是0的填充。
我试图创造我自己的结构(值类型),但由于不能够使用内部结构参数构造函数,我不能找到一种方法,从0更改默认值。
我怀疑更改默认值是不可能的,我会通过细胞矩阵单元格必须循环已被实例化后,但我想在这里问的,以防万一我这样做了。
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)
的计算结果为。
有没有办法来改变像你如何描述缺省值。
var someInt = default(int); //this will always be 0, you can't change it
var someReference = default(SomeClass); //this will always be null
下面是一个MSDN文章就可以了,虽然它不是比什么已经不幸的是说得多描述。
你可以封装它的价值,只与你想要的默认值的偏移公开它的结构:
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
那么既然你在寻找结构已经,可以按如下方式模拟的默认值:
public struct MyInt
{
private int _defaultInt;
public int DefaultInt
{
get
{
if (_defaultInt == 0)
return 5;
else
return _defaultInt;
}
set
{
_defaultInt = value;
}
}
}
我执行的理解default(T)
是运行时,默认情况下,零出内存的应用程序请求,和C#也就是分配的空间而没有覆盖零。 它碰巧的是,非数字类型的默认值(例如空引用,假)被表示为在存储器零。 这可能会导致一些奇怪的行为; 例如, default(MyEnumType)
将是,即使你从来没有指定一个枚举值等于零为零。
结合Guffa的和道格·琼斯的想法,你可能会抵消性能衬件。
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; }
}
}