Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';是否将日期时间[]强制转换为对象[]?_C#_.net_.net 4.0_Casting - Fatal编程技术网

C# 为什么可以';是否将日期时间[]强制转换为对象[]?

C# 为什么可以';是否将日期时间[]强制转换为对象[]?,c#,.net,.net-4.0,casting,C#,.net,.net 4.0,Casting,似乎我可以将DateTime强制转换为对象,那么为什么我不能将数组DateTime[]强制转换为对象[]?我知道这与值/引用类型有关,但装箱不允许我这样做吗?仅适用于引用类型的数组DateTime是一种值类型,因此不能将DateTime[]分配给对象[]变量。您必须显式地创建一个对象数组,并将值复制到该数组上。换句话说,创建类型为object[]的新数组实例 有很多方法可以做到这一点。一个简单的使用就足够了 DateTime[] x = new DateTime[] { ... }; objec

似乎我可以将DateTime强制转换为对象,那么为什么我不能将数组DateTime[]强制转换为对象[]?我知道这与值/引用类型有关,但装箱不允许我这样做吗?

仅适用于引用类型的数组
DateTime
是一种值类型,因此不能将
DateTime[]
分配给
对象[]
变量。您必须显式地创建一个对象数组,并将值复制到该数组上。换句话说,创建类型为
object[]
的新数组实例

有很多方法可以做到这一点。一个简单的使用就足够了

DateTime[] x = new DateTime[] { ... };
object[] y = new object[x.Length];
x.CopyTo(y, 0);

我做了一些测试。可能不是最好的方法,但它应该给一个好主意,它将与一个适当的分析器

class Program
{
    static void Main(string[] args)
    {
        var now = DateTime.Now;
        var dates = new DateTime[5000000];
        for (int i = 0; i < dates.Length; i++)
            dates[i] = now.AddSeconds(i);
        for (int i = 0; i < 5; i++)
        {
            Test("Test1", () =>
            {
                var result = new object[dates.LongLength];
                for (long l = 0; l < result.LongLength; l++)
                    result[l] = dates[l];
                return result;
            });
            Test("Test2", () =>
            {
                var result = new object[dates.LongLength];
                dates.CopyTo(result, 0);
                return result;
            });
            Test("Test3", () =>
            {
                var result = new object[dates.LongLength];
                Array.Copy(dates, result, dates.LongLength);
                return result;
            });
            Test("Test4", () =>
            {
                var result = Array.ConvertAll(dates, d => (object)d);
                return result;
            });
            Test("Test5", () =>
            {
                var result = dates.Cast<object>().ToArray();
                return result;
            });
            Test("Test6", () =>
            {
                var result = dates.Select(d => (object)d).ToArray();
                return result;
            });
            Console.WriteLine();
        }
    }

    static void Test<T>(string name, Func<T> fn)
    {
        var startMem = GC.GetTotalMemory(true);
        var sw = Stopwatch.StartNew();
        var result = fn();
        sw.Stop();
        var endMem = GC.GetTotalMemory(false);
        var diff = endMem - startMem;
        Console.WriteLine("{0}\tMem: {1,7}/{2,7} ({3,7})", name, startMem, endMem, diff);
        Console.WriteLine("\tTime: {0,7} ({1,7})", sw.ElapsedMilliseconds, sw.ElapsedTicks);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var now=DateTime.now;
var日期=新日期时间[5000000];
for(int i=0;i
{
var结果=新对象[dates.LongLength];
for(长l=0;l
{
var结果=新对象[dates.LongLength];
日期。复制到(结果为0);
返回结果;
});
测试(“测试3”,()=>
{
var结果=新对象[dates.LongLength];
数组.Copy(日期、结果、日期.longlegth);
返回结果;
});
测试(“测试4”,()=>
{
var result=Array.ConvertAll(日期,d=>(对象)d);
返回结果;
});
测试(“测试5”,()=>
{
var result=dates.Cast().ToArray();
返回结果;
});
测试(“测试6”,()=>
{
var result=dates.Select(d=>(object)d.ToArray();
返回结果;
});
Console.WriteLine();
}
}
静态无效测试(字符串名称,Func fn)
{
var startMem=GC.GetTotalMemory(true);
var sw=Stopwatch.StartNew();
var result=fn();
sw.Stop();
var endMem=GC.getTotalMemy(false);
var diff=endMem-startMem;
WriteLine({0}\tMem:{1,7}/{2,7}({3,7})”,name,startMem,endMem,diff);
Console.WriteLine(“\t时间:{0,7}({1,7})”,sw.ElapsedMilliseconds,sw.ElapsedTicks);
}
}
规格:
Win7Pro x64,Core2QuadQ9550@2.83GHz,4GiB DDR2 1066(PC2-8500)
64位构建(32位大致相同,只是总体内存更少)

测试1成员:40086256/200087360(160001104) 时间:444(1230723) 测试2成员:40091352/200099272(160007920) 时间:751(207801) 测试3成员:40091416/200099256(160007840) 时间:800(2213764) 测试4成员:40091480/200099256(160007776) 时间:490(1358326) 测试5成员:40091608/300762328(260670720) 时间:1407(3893922) 测试6成员:40091672/300762328(260670656) 时间:756(2092566) 测试1成员:40091736/200099184(16000748) 时间:515(1425098) 测试2成员:40091736/200099184(16000748) 时间:868(2404151) 测试3成员:40091736/200099160(160007424) 时间:885(2448850) 测试4成员:40091736/200099184(16000748) 时间:540(1494429) 测试5成员:40091736/300762240(260670504) 时间:1479(4093676) 测试6成员:40091736/300762216(260670480) 时间:746(2065095) 测试1成员:40091736/200099168(160007432) 时间:500(1383656) 测试2成员:40091736/200099160(160007424) 时间:781(2162711) 测试3成员:40091736/200099176(160007440) 时间:793(2194605) 测试4成员:40091736/200099184(16000748) 时间:486(1346549) 测试5成员:40091736/300762232(260670496) 时间:1448(4008145) 测试6成员:40091736/300762232(260670496) 时间:749(2075019) 测试1成员:40091736/200099184(16000748) 时间:487(1349320) 测试2成员:40091736/200099176(160007440) 时间:781(2162729) 测试3成员:40091736/200099184(16000748) 时间:800(2214766) 测试4成员:40091736/200099184(16000748) 时间:506(1400698) 测试5成员:40091736/300762224(260670488) 时间:1436(3975880) 测试6成员:40091736/300762232(260670496) 时间:743(205802) 测试1成员:40091736/200099184(16000748) 时间:482(1335709) 测试2成员:40091736/200099184(16000748) 时间:777(2150719) 测试3成员:40091736/200099184(16000748) 时间:793(2196184) 测试4成员:40091736/200099184(16000748) 时间:493(1365222) 测试5成员:40091736/300762240(260670504) 时间:1434(3969530) 测试6成员:40091736/300762232(260670496) 时间:746(2064278)
有趣的是,
ConvertAll()
的性能与普通循环基本相同。

不能将
DateTime[]
强制转换为
object[]
,因为这样会不安全。相同长度的引用类型的所有数组在内存中具有相同的布局。DateTime为值类型,数组为“平面”(未装箱)。您无法安全地强制转换到
对象[]
,因为内存中的布局与
对象[]
不兼容

顺便说一句,您可以使用


因为
DateTime
对象
,但是
DateTime的数组
不是
对象
的数组

值类型的数组与引用类型的数组不同,因此这两种类型的数组基本上是不兼容的。值类型数组实际上包含这些值 Test1 Mem: 40086256/200087360 (160001104) Time: 444 (1230723) Test2 Mem: 40091352/200099272 (160007920) Time: 751 (2078001) Test3 Mem: 40091416/200099256 (160007840) Time: 800 (2213764) Test4 Mem: 40091480/200099256 (160007776) Time: 490 (1358326) Test5 Mem: 40091608/300762328 (260670720) Time: 1407 (3893922) Test6 Mem: 40091672/300762328 (260670656) Time: 756 (2092566) Test1 Mem: 40091736/200099184 (160007448) Time: 515 (1425098) Test2 Mem: 40091736/200099184 (160007448) Time: 868 (2404151) Test3 Mem: 40091736/200099160 (160007424) Time: 885 (2448850) Test4 Mem: 40091736/200099184 (160007448) Time: 540 (1494429) Test5 Mem: 40091736/300762240 (260670504) Time: 1479 (4093676) Test6 Mem: 40091736/300762216 (260670480) Time: 746 (2065095) Test1 Mem: 40091736/200099168 (160007432) Time: 500 (1383656) Test2 Mem: 40091736/200099160 (160007424) Time: 781 (2162711) Test3 Mem: 40091736/200099176 (160007440) Time: 793 (2194605) Test4 Mem: 40091736/200099184 (160007448) Time: 486 (1346549) Test5 Mem: 40091736/300762232 (260670496) Time: 1448 (4008145) Test6 Mem: 40091736/300762232 (260670496) Time: 749 (2075019) Test1 Mem: 40091736/200099184 (160007448) Time: 487 (1349320) Test2 Mem: 40091736/200099176 (160007440) Time: 781 (2162729) Test3 Mem: 40091736/200099184 (160007448) Time: 800 (2214766) Test4 Mem: 40091736/200099184 (160007448) Time: 506 (1400698) Test5 Mem: 40091736/300762224 (260670488) Time: 1436 (3975880) Test6 Mem: 40091736/300762232 (260670496) Time: 743 (2058002) Test1 Mem: 40091736/200099184 (160007448) Time: 482 (1335709) Test2 Mem: 40091736/200099184 (160007448) Time: 777 (2150719) Test3 Mem: 40091736/200099184 (160007448) Time: 793 (2196184) Test4 Mem: 40091736/200099184 (160007448) Time: 493 (1365222) Test5 Mem: 40091736/300762240 (260670504) Time: 1434 (3969530) Test6 Mem: 40091736/300762232 (260670496) Time: 746 (2064278)
void Main()
{
    DateTime[] dates = new DateTime[] { new DateTime(2000, 1, 1), new DateTime (2000, 3, 25) };
    object[] objDates = new object[2];
    Array.Copy(dates, objDates, 2);

    foreach (object o in objDates) {
        Console.WriteLine(o);
    }
}
DateTime[] dates = ...;
object[] objects = dates.Select(d => (object)d).ToArray();
DateTime[] dates = new DateTime[3];

dates[0] = new DateTime(2009, 01, 01);
dates[1] = new DateTime(2010, 01, 01);
dates[2] = new DateTime(2011, 01, 01);

object[] dates2 = Array.ConvertAll(dates, d => (object)d);
object[] dates3 = Array.ConvertAll(dates, 
                        delegate(DateTime d) { return (object)d; });