簡體   English   中英

c#類之間通信的最佳方式

[英]c# Best way to communicate between classes

現在我正在編寫一個應用程序,並且我認為必須有一個更好的解決方案來解決我現在正在做的事情。

我有一個主窗口,它將處理程序的設置。 然后我有更多的課程和窗口。 例如,語言處理程序類和處理“main函數”所需的用戶輸入的表單。

但是,到現在為止,我總是必須將主窗口傳遞給每個類,因為語言處理程序應該能夠更改主窗口的字符串。 另一種形式也應該能夠將數據傳遞給主窗口。

如果我們想象會有更多的類,並且每個類都需要主窗口的副本,這將消耗大量資源,具體取決於主窗口的“大小”。

那么,這些類之間是否有更好/更有效的通信方式。

常見的方法是使用觀察者模式 ,在.NET中是事件系統 簡單地說,您的類訂閱彼此的事件並在事件發生時執行操作。 正如注釋中所指出的,傳遞引用並不是內存繁重,但它會導致代碼的不同部分之間的緊密耦合 - 觀察者模式解決了這個問題。

另一種選擇是將您的類視為服務。 將它們編碼到接口,然后使用依賴注入 (也稱為控制反轉)來構建對象圖(您告訴IoC容器您想要一個frmSomething ,它將確定它需要哪些服務/類並適當地實例化它們)。

這意味着:

  • 你只需要對接口而不是實現進行編碼
  • 您的代碼松散耦合(您可以將OldTranslatorNewTranslator ,只要它們都符合相同的接口,除了容器的配置之外不需要更改任何內容)
  • 您可以開發依賴於尚未編寫的服務並且代碼將編譯的高級功能
  • 通過更改容器中注冊的類/服務,您可以在運行時(如果需要)輕松更改應用程序的工作方式。

看看Unity支持的MS支持的DI容器。 溫莎城堡是一個受歡迎的選擇,但還有更多

值得注意的是,正如你所說的那樣傳遞主窗口的“復制”並不是一件壞事 - 你只是將一個引用(實際上是一個指針 )傳遞給主窗口(因為任何比真實更復雜的東西)原語是引用類型)。 這意味着任何開銷都很小

我建議你使用GalasoftPrism MVVM實現。 在那里,您可以使用非常容易使用的消息服務。 需要信息的類只是向訂閱者發送消息,然后他們可以發送所需的所有數據。 我認為這是處理通信的最簡單方法。

除了IVAN給出的ans之外...如果我們在沒有所有這些術語的情況下查看更高級別的視圖,那么你應該創建一個靜態類,它將作為InMemoryStorage服務器並在其上定義字段以保存信息
這就是您將完全控制共享內容以及多個組件可以更改它的內容
此外,您可以定義getter和setter,並在更改屬性時引發事件,以便不同的窗體或窗口(視圖)可以訂閱更改並相應地執行操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM