1. 程式人生 > >關於C#的一些知識(一)

關於C#的一些知識(一)

      前幾個月圖一時爽快辭了職,自認為做了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模式。也算一個新的開始吧。