2012-08-16 60 views
2

哪個更好地訪問屬性值?訪問屬性值哪個更好?

訪問這樣

propertyobjA.objB.Prop1 
propertyobjA.objB.Prop2 

或分配給VAR

var objB = propertyobjA.objB; 
then call objB.Prop1 and objB.Prop1 

哪一個提高了C#的表現?

+5

通常的方法是每個案例的時間,看看哪個更快。另外,不成熟的優化是所有邪惡的根源。 – dandan78 2012-08-16 14:41:26

+1

找出方法是測試兩者。 – Oded 2012-08-16 14:42:43

回答

0

對性能的影響很大程度上取決於propertyObjA.objB屬性獲取器的實現。例如,如果它簡單實現爲:

public Foo objB { get { return this._objB; } } 

然後調用兩次將會對性能產生微不足道的影響。

但是,如果相同的屬性做了一些計算成本很高的事情,那麼您的第二個建議會表現得更好。

話雖這麼說,你不應該使用屬性的getter隱藏潛在的計算昂貴的操作,而不是寧願一個方法調用,而不是指導原則框架狀態,例如:

public objB ComputeB(); 
4

爲了完全誠實,答案很可能是第二個會更快,但我幾乎可以保證它不會影響絲毫。您應該小心過早考慮優化問題。所有性能問題中的99%都歸結爲更大的問題,例如頻繁訪問數據庫等,而不是像這樣的小問題。即使這兩種情況之間存在細微的差異,除非這是這個星球上最重要的軟件之一,但重要的是可讀性(在這種情況下並不難讀),而不是更快。

1

這取決於objB是什麼。如果你正在計算的東西(你不應該可以做),那麼當然分配它的值將產生更好的性能。

另外需要注意的是,你應該避免依賴於變量的子屬性,因爲你在類之間加入了更高的耦合度。

1

我認爲這不會在性能上產生很大的差異(第二種選擇可能會快一點)。但這不是你的表現問題(如果有的話)的來源。

UPDATE:有關的propertyobjA.objB價值可能越來越Prop1Prop2之間變化,所以兩個備選方案不能被視爲是相同的代碼的思考。

+0

+1。有一件事情是肯定的;與絕大多數程序員相比,編譯器在這種微型優化方面要好得多。在像C#這樣的現代語言中,在編譯器完成之後,你絕對不會知道你的代碼是如何翻譯的。 – Thor84no 2012-08-16 14:46:01

+0

@ Thor84no更新了我的答案,只是注意到兩個樣本不是等效的代碼。 – Botz3000 2012-08-16 14:57:18

+0

這取決於屬性是否是常量。據推測,他對代碼的控制權不算什麼。 – Thor84no 2012-08-16 14:59:45

0

你真的應該不關心自己與像使用c#這樣的高級語言編寫代碼時就是這樣的。

諸如c#和java之類的語言的現代編譯器非常複雜,並且會對您的代碼執行各種優化。作爲開發人員的最終結果是,在編寫特定的一小段代碼時,您永遠不會看到性能上的差異。編譯器會選擇最優化的方式。

其他一切都是根據偏好。如果你想鏈接幾個屬性訪問,那很好。如果您想將中間結果分配給變量以提高代碼的可讀性,那也可以。