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
也许你应该为这个写一个类?
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
。