2012-10-23 10 views
7

अरे दोस्तों मैं हाल ही में सी # और घटनाओं का उपयोग कर रहा हूं लेकिन मैं बस अपनी खुद की घटनाएं बनाना शुरू कर रहा हूं और उनका उपयोग कर रहा हूं। मैं घटना कीवर्ड का उपयोग करने के बारे में थोड़ा उलझन में हूं, मुझे केवल प्रतिनिधियों का उपयोग करके एक ही परिणाम मिला।"घटना" कीवर्ड का उद्देश्य

public partial class Form1 : Form 
{ 
    ServerConnection connection = new ServerConnection(); 

    public Form1() 
    { 
     InitializeComponent(); 
     connection.ref = new del(MethOne); 
     connection.ref += new del(MethTwo); 
    } 

    public void MethOne(object message) 
    { 
     MessageBox.Show((string)message); 
    } 

    public void MethTwo(object message) 
    { 
     MessageBox.Show((string)message); 
    } 

} 


public delegate void del(string message); 



public class ServerConnection 
{ 
    private TcpListener tcpListener; 
    public del ref; 

    private List<NetworkStream> clientList = new List<NetworkStream>(); 

    public ServerConnection() 
    { 
     this.tcpListener = new TcpListener(IPAddress.Any, 3000); 
     ThreadStart startListening = new ThreadStart(ListenForClients); 
     Thread startThread = new Thread(startListening); 
     startThread.Start(); 
    } 


    public void ListenForClients() 
    { 
     tcpListener.Start(); 
     ParameterizedThreadStart handleClient = new ParameterizedThreadStart(HandleClient); 

     while (true) 
     { 
      TcpClient newClient = tcpListener.AcceptTcpClient(); 
      Thread handleClientThread = new Thread(handleClient); 
      handleClientThread.Start(newClient); 
     } 
    } 


    public void HandleClient(object newClient) 
    { 
     NetworkStream clientStream = ((TcpClient)newClient).GetStream(); 
     clientList.Add(clientStream); 

     BinaryFormatter formatter = new BinaryFormatter(); 
     string message; 

     while (true) 
     { 
      message = (string)formatter.Deserialize(clientStream); 
      ref((string)message); 
     } 
    } 
+3

ओह मेरी ... यह एक उचित सवाल प्रतीत होता है। डाउनवोट क्यों? इसे बंद क्यों कर रहा है? –

उत्तर

5

event कीवर्ड आप घोषणा के साथ इनलाइन add और remove संचालन निर्दिष्ट कर सकते हैं।

private Action _myEvent; 

public event Action MyEvent 
{ 
    add 
    { 
     Console.WriteLine("Listener added!"); 
     _myEvent += value; 
    } 
    remove 
    { 
     Console.WriteLine("Listener removed!"); 
     _myEvent -= value; 
    } 
} 
3

उद्देश्य यह सुनिश्चित करना है कि कोई घटना क्या है, और केवल कॉलबैक क्या है।

दोनों एक ही बात प्रतीत होते हैं, लेकिन इसका अर्थ अलग है।

इसके अलावा विजुअल स्टूडियो घटनाओं को इंगित करने के लिए अलग-अलग आइकन रखता है।

अगर मैं अच्छी तरह से याद है, यह सी # के शुरुआती दिनों, प्रतिनिधियों इसका समर्थन नहीं किया:

this.mydelegatefield += somethingHere; 

केवल घटनाओं ... लेकिन यह केवल मेरी कल्पना है हो सकता है।

संपादित

बस missleading होने की नहीं ... वहाँ जोड़ें/तरीकों को दूर का अंतर है। मैं इसे अन्य उत्तरों के बाद रखता हूं (क्योंकि मैं इसके बारे में भूल गया था)। तो, क्रेडिट मेरा नहीं है।

8

C# events vs. delegates

घटना कीवर्ड पर एक नज़र डालें वर्ग कि वाणी के भीतर से एक प्रतिनिधि घोषणा कि की अनुमति देता है यह एक अंतरफलक में शामिल किए जाने, बाधाओं यह मंगलाचरण के लिए एक आपरिवर्तक है यह, कस्टमाइज करने योग्य एक्सेसर्स (जोड़ें और हटाएं) की एक जोड़ी प्रदान करता है और प्रतिनिधि (जब .NET ढांचे के भीतर उपयोग किया जाता है) के हस्ताक्षर को बल देता है।

+0

ओह, हाँ! जोड़ें/निकालें विधियां। इसके बारे में भूल गए! –

0

इवेंट सिर्फ एक शक्कर है। जब आप किसी ईवेंट को परिभाषित करते हैं तो 3 चीजें होती हैं।

सरल ईजी:

public event EventHandler alarm; 

नमूना संकलक उत्पादन

private EventHandler alarm 

public void add_alarm(EventHandler value) 
{ 
} 

public void remove_alarm(EventHandler value) 
{ 
} 

सूचना private अपने public del me; लोक accessors के विपरीत समस्याएँ हो सकती हैं। इसके अलावा, get और set का उपयोग एक बेहतर पैटर्न

0

ईवेंट की तुलना आपकी कक्षा के गुणों से की जा सकती है।

  • गुण आपके सदस्य फ़ील्ड/ऑब्जेक्ट स्टेट्स में इंटरफेस हैं।
  • इसी प्रकार घटना अंतर्निहित प्रतिनिधि के लिए एक इंटरफ़ेस है।

आप अभी भी घटना के बिना अंतराल प्राप्त कर सकते हैं। लेकिन आप घटनाओं के बिना encapsulation खो देते हैं।

एक गैर संरक्षित प्रतिनिधि दुर्व्यवहार के लिए प्रवण हो सकता है।

संबंधित मुद्दे