【发布时间】:2016-03-10 07:09:37
【问题描述】:
我的 DefaultValue() 函数有问题。它总是返回false,表示该结构不是默认值。
为什么这不起作用?
[StructLayout(LayoutKind.Sequential)]
private struct ArrayItem
{
public long SrcSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 250)]
public string SrcFile;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 250)]
public string DestFile;
}
[StructLayout(LayoutKind.Sequential)]
private struct MyInfo
{
public int Count;
public int AppOne;
public int AppTwo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100, ArraySubType = UnmanagedType.Struct)]
public ArrayItem[] Files;
}
private bool DefaultValue<T>(T structure)
{
if (EqualityComparer<T>.Default.Equals(structure, default(T)))
return true;
else
return false;
}
//Success returns 'Value Changed' as expected
MyInfo fileInfoOne = new MyInfo();
fileInfoOne.Count = 3;
fileInfoOne.Files = new ArrayItem[100];
fileInfoOne.Files[0].SrcSize = 100;
Debug.Write("fileInfoOne: ");
if (DefaultValue(fileInfoOne.Files[0])) Debug.WriteLine("Default Value."); else Debug.WriteLine("Value Changed.");
//Fails but has all the default settings, should return 'Default Value'
MyInfo fileInfoTwo = new MyInfo();
fileInfoTwo.Files = new ArrayItem[100];
fileInfoTwo.Files[0].SrcSize = 0;
fileInfoTwo.Files[0].SrcFile = "";
fileInfoTwo.Files[0].DestFile = "";
Debug.Write("fileInfoTwo: ");
if (DefaultValue(fileInfoTwo.Files[0])) Debug.WriteLine("Default Value."); else Debug.WriteLine("Value Changed.");
【问题讨论】:
-
首先,发布的代码总是抛出 NRE。其次,
fileInfoTwo没有被使用。 -
@IvanStoev 谢谢你,+1 的帮助。我得到了纠正,在我自己尝试以确保它编译并运行正常后,我注意到它正在工作!我的 IRL 申请仍然每次都返回 false。我认为这与我设置数组对象有关。即使我使用默认值设置它,结构本身也可能不是默认值?
-
值类型的默认值为 0(零),引用类型的默认值为
null。如果您正在测试带有数组集的MyInfostruct,它永远不会是默认值(数组是引用类型)。 -
谢谢你,但我只是在测试 ArrayItem 对象。我正在考虑对它做某种反思性的方法。比如比较一下
<T>中的所有属性。 -
@IvanStoev 原来我的问题是如何定义数组项!您指出
The default values are 0 (zero) for value types and null for reference types.这让我尝试将值类型(字符串)设置为 null 而不是“”。为分数添加一个答案! ;) 再次感谢!
标签: c# generics struct .net-4.0