麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

正確使用C#中的#region指令來進行代碼的組織

2023-05-18 12:33:06
字體:
來源:轉載
供稿:網友

本文旨在講解如何正確地使用#region指令,以更好地組織代碼。使用#region就是將一些有關聯的代碼組織在一起,然后折疊起來。這樣你就在一個函數中看不到很長很長的代碼段。例如:


 
  1. public void DoSomething()  
  2. {    
  3. bool shouldIDoSomething;     
  4. #region Decide if I should do something   
  5. if(needToDoSomething && haventDoneSomethingThisDay)  
  6. shouldIDoSomething = true;   
  7.  else    
  8. {  
  9. // do some other logic to decide and 
  10. set shouldIDoSomething to some value  
  11.   }    
  12. #endregion     
  13. if(shouldIDoSomething)    
  14. {done++;  }} 

當然這段代碼很簡單。在實際項目中,你可能看到上百行甚至更多的代碼在一個#region中。如果把它折疊起來。看起來就會很整潔。是吧?


 
  1. public void DoSomething()  
  2. {    
  3. bool shouldIDoSomething;     
  4. [Decide if I should do something]     
  5. if(shouldIDoSomething)    
  6. {done++;    
  7. }} 

我們只是把一些代碼和一些變量組合起來放在#region中。如果你在仔細想想,其實我們相當與創(chuàng)建了一個新的函數,只是將這些方法內置到當前方法中。一個函數只做單一的一件事情,這是Clean Code這本書的一個原則。為什么我們不把它提取為一個方法呢,這樣一來,一個函數就只做一件事情了。


 
  1. public void DoSomething(){    
  2. if(ShouldIDoSomething())   
  3.  {done++;  }}   
  4. private bool ShouldIDoSomething(){    
  5. if(needToDoSomething && haventDoneSomethingThisDay)  
  6. shouldIDoSomething = true;    
  7. else   
  8.  {  
  9. // do some other logic to decide   
  10. and set shouldIDoSomething to some value  }} 

這樣看起來就清楚很多,因為我們降低了之前的DoSomething函數的復雜度。兩個函數可以分開測試,確保沒有邏輯錯誤。
小段總結1:  #region 不適合在大方法中使用,當你在一個方法中使用#region 的時候,停下來想想你剛剛寫了什么代碼?大多數時候,你可以將這些代碼段獨立成一個函數。

看看下面這段非常漂亮的代碼:


 
  1. #region Get Customer   
  2. public void GetCustomer(){    
  3. // code to get the customer}   
  4. #endregion   
  5. #region Save Customer   
  6. public void SaveCustomer(){    
  7. // code to save the customer}   
  8. #endregion 

將它折疊之后,變成下面這樣:


 
  1. [Get Customer] [Save Customer] 

這樣做很容易閱讀嗎?這樣做的目的是什么,我不明白?代碼折疊就會變得更好?我覺得這樣做只會讓代碼更難以閱讀,因為你每次要看region中的代碼,你都要展開一次。

小段總結2:不要因為你能,你就使用#region 。

再看下面這個例子


 
  1. public class PriceCalculator{    
  2. public decimal CalculatePrice()    
  3. {decimal price = 100m;decimal discount = CalculateDiscount();  
  4. return price * (1m - discount));   
  5.  }     
  6. #region Discount Calculation     
  7. private void CalculateDiscount()    
  8. {decimal discount = 0m;   
  9. if(CanApplyDiscount())    
  10. discount = 0.05m;   
  11. return discount;   
  12.  }     
  13. private void CanApplyDiscount()  {  
  14. // some logic, other method calls  }     
  15. // some other discount calculation methods  ...     
  16. #endregion} 

如果你將這個例子和本文中的第一個例子做下比較,你可能會看到它們的共同點。他們是相同的,不過一個是在類中,一個是在函數中,層級不同而已。這里在提一個原則:單一職責原則,一個類應該只有一個職責。看上面的類,你可以很容易看出它有兩個職責:價ge計算和折扣計算。折扣計算的方法被放到一個#region中。同樣,可以將它們提取出來做為一個新類。

小段總結3:可以將一組相關的函數提取到一個職責單一的新類中。

那我們到底怎么使用 #region 呢。將東西用它來分組,它是非常有用的。在我寫的類中或多或少有幾個regions,用來對類中不同的結構進行分組。比如: fields, properties, methods, events, types等。如果你打開我寫的類文件,你會看到結構如下:


 
  1. public class SomeClass{  
  2. [Events]  
  3. [Fields]  
  4. [Properties]   
  5. [Methods]} 

總的來說:我將region看成能控制閱讀源代碼的復雜度的一種方式。因為你可以將一些相關的代碼放在一個區(qū)域(region)里面。但是,這不是隨便就創(chuàng)建的新的方法或者新類的借口。其實Region并不能消除復雜度,它只是在你閱讀代碼的時候,隱藏了部分代碼。你必須通過寫出小巧,清晰,重點突出的方法和類,才能控制代碼的復雜度。當你做到這些的時候,你甚至會發(fā)現region是不必要的。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 91网视频| 国产精品视频一区二区三区四区国 | 黄色一级片毛片 | 一区二区三区播放 | 中国美女一级黄色大片 | 污视频在线免费播放 | 极品一级片 | 少妇的肉体的满足毛片 | 久久国产秒 | 久久国产精品久久久久久 | 91精品国产手机 | 精品99在线视频 | 曰韩一二三区 | 欧美a视频在线观看 | 成人9禁啪啪无遮挡免费 | 日本欧美一区二区三区在线观看 | 国产精品自拍99 | av在线直播观看 | 综合网日日天干夜夜久久 | 热99精品视频 | 免费毛片观看 | 精品黑人一区二区三区国语馆 | 国产精品一区二区三区在线播放 | 国产精品一区二区三区在线 | 99影视在线视频免费观看 | 国产精品999在线观看 | hdhdhd79xxxxх | 久草手机在线视频 | 久久精品com | 主人在调教室性调教女仆游戏 | 精品久久久久久国产三级 | 欧美韩国一区 | 亚欧美一区二区 | 大西瓜永久免费av在线 | 久久成年网站 | 欧美日韩在线播放 | 国产日韩一区二区三区在线观看 | 逼片 | 日本欧美一区二区三区视频麻豆 | 久久综合久久综合久久 | 久久综合久久美利坚合众国 |