關於C#的一些知識(一)
阿新 • • 發佈:2018-12-19
前幾個月圖一時爽快辭了職,自認為做了2年.net開發,對C#可算是輕車熟路,然而出去面試卻坑的要死~被別人問的一臉懵逼。突然意識到自己這倆年就是一個程式碼搬運工,只知道日復一日的寫程式碼,卻從來沒問過為什麼這樣寫?為什麼這樣寫就能實現這樣的問題。之後準備開一個系列,總結下平時遇到的一些C#知識,算作記錄吧,希望堅持下去!
今天寫寫我遇到的第一個問題吧:C#的中方法引數的傳遞方式。
簡單裡講,其實有倆種,一種是值傳遞,一種是引用傳遞
public void Demo(int a, DateTime date) { Console.WriteLine("值傳遞"); } public void Demo(ref string a,out string b,StudentInfo obj) { b = "Hello World"; Console.WriteLine("引用傳遞"); }
先說下我值和引用,看了下網上大佬的研究,值型別都是來自於System.ValueType派生類,而System.ValueType又是直接繼承自System.Object,列舉型別來自System.Enum,System.Enum又是來派生於System.Object。而且值型別都是隱式密封的(sealed)。值型別包括了系統定義的型別,使用者自定義的和列舉。這裡說下,DateTime是個結構體,不是類,所以它是值型別。
值型別也叫輕量級型別,大多數情況下,都是分配線上程棧上面的,不受GC影響。引用型別,基本上類,介面,都是引用,引用型別分配在託管堆上面,會產生GC。
至於傳遞方式,值型別是對值的拷貝,等於再拷貝一份到執行緒堆上面,而引用型別只是傳遞一個地址。
我們判斷一個型別是值型別還是引用型別,可以根據傳遞來看出,比如傳遞datetime型別
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Demo { class Program { static void Main(string[] args) { DateTime date1 = DateTime.Now; DateTime date2 = date1; Console.WriteLine(date1); Console.WriteLine(date2); date1 = date1.AddHours(12); Console.WriteLine(date1); Console.WriteLine(date2); Console.ReadLine(); } } }
執行後結果:
這裡看出,我改變了date1的值後,date2並未改變。這就是值型別。
先寫到這裡吧~這個系列隨緣寫~還能說很多,堆和棧,GC,ref和out等等。
留個記錄吧。後面會寫寫.net MVC。之前公司一直用webfrom,換了工作換了MVC模式。也算一個新的開始吧。