c#在数组对象中存储秒表并处理它

本文关键字:处理 存储 数组 对象 | 更新日期: 2023-09-27 18:11:26

我有一个对象数组,其中存储了不同的值类型。其中一种是秒表。我该怎么处理呢?我应该把数组元素转换成什么才能把它当作秒表来处理?

下面是我的代码的一个小复制器

public static object[] test()
    {
        object[] obj = new object[6];
        obj[0] = bool;
        obj[1] = string;
        obj[2] = double;
        obj[3] = float;
        obj[4] = int;
        obj[5] = System.Diagnostics.Stopwatch.StartNew();
        return obj;
    }
    object[] testobject = new object[6];
    testobject = test();
    Console.WriteLine(testobject[5].Elapsed.TotalMilliseconds);   //handle stopwatch

c#在数组对象中存储秒表并处理它

也许你应该为这个写一个类?

public class MyObject
{
    public bool SomeBool {get; set;}
    public string SomeString {get; set;}
    public double SomeDouble {get; set;}
    public float SomeFloat {get; set;}
    public int SomeInt {get; set;}
    public System.Diagnostics.Stopwatch Stopwatch {get; set;}
    public MyObject()
    {
        this.Stopwatch = System.Diagnostics.Stopwatch.StartNew();
    }
}

然后使用这个类,你只需要调用Stopwatch属性:

var myObject = new MyObject();
Console.WriteLine(myObject.Stopwatch.Elapsed.TotalMilliseconds);

现在,如果你真的想知道实例化一个数组需要多长时间(以毫秒为单位),你有两个选择:

    使用性能分析工具,如dotTrace在数组创建代码之外实例化秒表

:

var stopWatch = System.Diagnostics.Stopwatch.StartNew();
//create your array here
Console.WriteLine(stopWatch.Elapsed.TotalMilliseconds);

无论哪种方式,首先找出你想要完成的目标都是很好的。

您有一个object数组,因此您必须强制转换每个元素以访问其特定类型的属性和方法:

Console.WriteLine(((Stopwatch)testobject[5]).Elapsed.TotalMilliseconds);

另一方面,传递object数组通常不是一个好主意。您丢失了类型信息,因此,如果您将其中一个元素更改为不同的类型,那么现在需要更新执行该元素强制类型转换的代码。最好创建自己的类型来保存所有这些数据。

我不完全确定我理解你有什么问题,但假设它是基于把你的Stopwatch元素到object的数组,这段代码应该为你工作:

object[] testobject = test();  
System.Diagnostics.Stopwatch stopwatch = (System.Diagnostics.Stopwatch) testobject[5];
Console.WriteLine(stopwatch.Elapsed.TotalMilliseconds);  

这段代码假设您知道元素5将始终是Stopwatch:如果不是,您将得到一个运行时错误。

在强制转换前检查对象的类型

if (obj[5] is System.Diagnostics.Stopwatch) {
    Console.WriteLine(((System.Diagnostics.StopWatch)obj[5]).Elapsed.TotalMilliseconds);
}

或检查强制转换是否正常

var sw = obj[5] as System.Diaogstics.Stopwatch;
if (sw != null) {
    Console.WriteLine(sw.Elapsed.TotalMilliseconds);
}

可以强制转换。

如果强制转换无效——如果对象实际上不是一个秒表,那么这个强制转换将抛出InvalidCastException:

var stopwatch = (Stopwatch)testobject[5];

如果它不是Stopwatch, as运算符将返回null:

var stopwatch = testobject[5] as Stopwatch;
顺便说一句,您上面展示的数据结构有设计不良的味道。真的没有必要使用如此不"类型安全"的东西。您应该依靠您的代码来提供您所需要的东西,而不是在运行时强制进行转换。因为如果你做错了——如果你尝试像var x = (Stopwatch)object[4]这样的东西——编译器就不会捕捉到它,你会得到一个愤怒的客户报告运行时崩溃。

一般来说,更喜欢将对象实例存储为它们的实际类型,而不是原始的object