2012-07-07 65 views
-2

在C#中是否有一種方法可以創建類似於僅在創建對象的新實例時才創建的結構?這是一個例子。我希望人們能夠分配事件,問題是有很多要分配的事件,並且通常它們具有類似的功能,只是針對不同的對象。例如,左鍵按下事件,右鍵按下事件等等。我認爲我可以用結構組織所有這些,但是當我發現結構被認爲是「靜態」並且無法訪問非結構時,我遇到了一個障礙靜態成員。有沒有什麼結構可以讓我在C#中做到這一點。C#組織變量?

(最終的結果應該讓我做一個新的對象,並分配給該通過這些結構對象事件)

MouseObject mouse = new MouseObject(); 

mouse.Left.PressedEvent += somemethod(); 

在這個例子中左不可能是一個結構,因爲它是在非靜態使用實例。

+4

你的問題很困惑(或混淆)。結構不被認爲是靜態的 - 事實上,這個概念甚至沒有意義。你的代碼當然可以被編譯,儘管這不是一個好主意。我看不出在這裏使用結構的理由 - 您應該真正瞭解結構和類之間的差異。 – 2012-07-07 14:32:46

+1

當你感到「結構是靜態的」時,你是否在你的'MouseObject'類中定義了'Left'結構?如果你真的創建了你的結構的一個實例,它將不會是「靜態的」(除非你使用'static'關鍵字定義實例)。 – 2012-07-07 14:35:18

回答

4

爲什麼不使用其他課程?

class MouseButton 
{ 
    public SomeEvent PressedEvent; 
} 

class MouseObject 
{ 
    public MouseButton Left { get; } 
    public MouseButton Right { get; } 
} 
+0

我不知道我是如何錯過這個的,我試圖把我的結構放入MouseObject類中。 DERP。謝謝您的幫助。 – redcodefinal 2012-07-07 14:39:31

0

Mutable structs are evil。如果你使用結構體,如下所示,它會運行,但PressedEvent從來沒有得到我的處理程序,大概是因爲我正在修改的結構不是真的在MouseObject中。像在@ japreiss的解決方案中一樣,帶一堂課。

struct MouseButton 
{ 
    internal void OnPressed() 
    { 
     if (PressedEvent != null) 
      PressedEvent(this, EventArgs.Empty); 
    } 
    public event EventHandler PressedEvent; 
    public event EventHandler ReleasedEvent; 
} 
class MouseObject 
{ 
    public MouseButton Left { get; private set; } 
    public MouseButton Right { get; private set; } 
    public void OnLeftPressed() 
    { 
     Left.OnPressed(); 
    } 
} 
static void Main(string[] args) 
{ 
    var m = new MouseObject(); 
    m.Left.PressedEvent += (s, e) => Console.WriteLine("pressed"); 
    m.OnLeftPressed(); 
} 

此打印it was null!

0

我猜這是你使用的代碼。

public class MouseObject 
{ 
    public struct Left 
    { 
     public event EventHandler PressedEvent; 
    } 
} 

在這種情況下,Left不是MouseObject的成員。這只是另一種類型。這種封裝的行爲非常像名稱空間。

你可能打算是什麼這樣的:

public class MouseObject 
{ 
    public MouseButton Left { get; set; } 

    // Left still needs to be intialized, preferably in the constructor 
} 

public class MouseButton 
{ 
    public event EventHandler PressedEvent; 
} 
+0

是的就是這樣。我不完全確定爲什麼我認爲這會起作用。 – redcodefinal 2012-07-07 20:03:15