2014-12-31 24 views
-6
private void RectangleTapped(object sender, TappedRoutedEventArgs e) 
{ 
    RedRectangle.Fill.Opacity = 1.0; 
    GreenRectangle.Fill.Opacity = 1.0; 
    BlueRectangle.Fill.Opacity = 1.0; 
    YellowRectangle.Fill.Opacity = 1.0; 

    var rectangle =sender as Rectangle; 
    if (rectangle != null) 
    { 
     rectangle.Fill.Opacity =0.25;    
    } 
} 

var rectangle=sender as Rectangle是什麼意思?發件人在C#

此代碼也適用於var Rectangle=sender as Rectangle

+1

所以你有一個工作代碼,並想知道它爲什麼有效?你有沒有試過在C#_中搜索_as運算符? –

回答

1

as運算符試圖將參數轉換爲請求的類型,如果轉換/轉換失敗,返回null。 (MSDN

因此,您提供的代碼是檢查sender是否是Rectangle對象(或派生類型)。然後在使用轉換後的變量前檢查是否爲空,在使用as時總是很好的做法。

請注意,第二個代碼只是分配給不同的變量名稱,雖然使用類名稱作爲變量名稱是強烈勸阻。

4

事件的sender僅作爲對象傳遞給事件處理程序。現在,當事件發生時,您通常會知道您可以期待什麼類型的發件人(因爲您自己設置了事件處理程序),但該方法仍需要object類型。

現在as是一種嘗試將對象轉換爲該類型的類型轉換,但如果類型不兼容則返回null。因此,在這種情況下,你有這樣的:

var rectangle = sender as Rectangle; 

有兩種可能性:

  1. sender是可以被分配到一個Rectangle一個類型,在這種情況下,rectangle將包含對一個參考相同的對象,但類型爲Rectangle,而不是僅僅object
  2. sender是一些其他類型的,在這種情況下rectanglenull,它被捕獲在下面的檢查。
2

你有一些真正的基本概念,你試圖去理解。我會嘗試打破這個問題並澄清一些問題,並添加到您收到的兩個特殊答案中。

演員:

鑄造概念概念是非常重要的,因爲這個概念是在你的數據的修改勢在必行。你的具體問:

Explicit conversions (casts): Explicit conversions require a cast operator. Casting is required when information might be lost in the conversion, or when the conversion might not succeed for other reasons. Typical examples include numeric conversion to a type that has less precision or a smaller range, and conversion of a base-class instance to a derived class.

在你的例子中,你的實施as Rectangle。爲了簡單起見,我將使用更簡單的數據類型。該as當它轉換它不會產生以下錯誤:

  • 無效的轉換異常

相反,當它失敗,這是一個乾淨的方式默默地失敗則返回null。在某些情況下,您不希望異常中斷您的用戶流,從而滿足特定需求。

實施例(A):

int valid = 0; 
string number = valid as string; 

實施例(B):

string valid = 1; 
int number = valid as string; 

實施例(C):

string valid = "valid"; 
int? number = valid as int?; 

所有三種的那些考試普萊斯是有效的,但在例(C)你會注意到兩個項目:

  • int? - 允許一個int一個null
  • 它也不會破壞你的應用程序,因爲失敗的轉換將返回null

鑄造另一種方法是應用(int)(string)的數據明確強制到類型。所以它會或者成功和或者拋出異常。例如:

實施例(d):

string invalid = "Fail" 
int? number = (int?)invalid; 

這將導致無效轉換異常被拋出。 實例(C)實例(D)鑄造之間的差異的兩個簡單比較。

希望這可以爲您提供更好的信息。

相關問題