2012-05-14 43 views
0

这可能是一个愚蠢的问题,但是说我想在我的ASP .NET应用程序中从OnSelectedIndexChanged事件中获得两个值。
哪个更好?哪个更好?它甚至重要吗?

var personId = Convert.ToInt32(((GridView)sender).SelectedDataKey.Values["PersonId"]); 
var name = ((GridView)sender).SelectedDataKey.Values["Name"].ToString(); 

OR

var gView = (GridView)sender; 
var personId = Convert.ToInt32(gView.SelectedDataKey.Values["PersonId"]); 
var name = gView.SelectedDataKey.Values["Name"].ToString(); 

铸造是否在GridView两次做出多大的差别至于速度去?如果我拉更多的价值呢?是否有其他一些

+2

*“哪个更好?它有没有关系?”*不,绝对不会。相信你的编译器就像这样的微型优化。 –

+1

_“这可能是一个愚蠢的问题”_是的,它是。 –

回答

5

后者(投一次)会稍快。我也更喜欢它的可读性。性能差异非常小,以至于在这种情况下真正考虑它很可能是毫无意义的微观优化。

2

不是铸造更好。理论上,它在实践中速度更快并不重要。但是,您曾经投过一次结果会产生更清晰的代码。

1

我会选择不施放超过我需要的。在这种情况下,性能不会有太大影响,但更容易遵循。

3

编译器会为您优化。为了可读性,我更喜欢第二个。

+0

也许JIT会,但写的IL代码实际上保留了两个单独的演员(使用ILSpy验证)。我想知道JIT是否能够 - 如果发送者对象在这两行代码之间发生了变化,该怎么办?在这样一个简单的例子中,除了线程外,我们可以看到它不会,但总的来说,它可能会发生。 –

+1

不在发布模式下的Visual Studio 2010上。不要在没有测试的情况下提出这样的声明(并指定* what * compiler)。 –

0

铸造两次花费多于铸造一次。
有一个选项,编译器在两种情况下都会输出相同的.dll,这意味着它已经为您优化了它 - 特别确保 - 用第一个选项编译并保存获得的.DLL,然后使用第二选择。
比较两个.DLL的大小 - 如果它是相同的 - 编译器已经为你优化了它,否则就去做第二个选择,因为它更易读和更优化。

1

我几乎没有改善的第二个选项去,因为一个铸造性和可读性,

var key = ((GridView)sender).SelectedDataKey; 
var personId = Convert.ToInt32(key.Values["PersonId"]); 
var name = key.Values["Name"].ToString(); 

而且这个代码显示意图更好 - 你与DataKey在这里工作,而不是与整个GridView控件,所以你不” t需要保持对GridView对象的引用。

相关问题