程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C# Tips

C# Tips

編輯:關於C#

1.值類型和引用類型

對於C#的變量來說,有兩種類型,值類型(Value Type)和引用類型(Reverence Type)。兩者不同點:

值類型繼承自ValueType

如下圖:

兩者存儲方式不同:

值類型變量存儲在棧當中。引用類型內存數據結構表示分有兩部分構成,一部分引用,存儲在在棧中, 一部為實際變量成員,存儲在在堆中。

如圖:

注意:以上情況是指值類型和引用類型不是作為引用類型的成員,如果作為引用類型變量成員,值類型的數據和引用類型的引用都存儲在棧中。

2.方法的參數修飾符 ref ,out ,params:

默認情況下,對於值類型參數的傳遞,其形參(Formal parameter)是實參(Formal parameter)的拷貝。在方法中對於形參所作的任何更改不會影響到實參。 對於引用類型的參數的傳遞,其形參(Formal parameter)是實參(Formal parameter)的部分拷貝(shallow clone),通常也叫淺拷貝。 形參只拷貝了的引用部分(即:在棧中存儲的部分),這個引用同樣指向實參的在堆(Heap)中的對象數據。 在這種情況下,方法內部對於形參的引用指向的成員數據改變將反映到實參,而對於形參的引用本身的更改不會影響到實參。

例:

class MyClass
{ 
    public int Val = 20;
}

class Program
{
    static void MyMethod(MyClass f1, int f2)
    {
        f1.Val = f1.Val + 5;
        f2 = f2 + 5;
        f1 = new MyClass();
    }
    static void Main()
    {
        MyClass A1 = new MyClass();
        int A2 = 10;
        MyMethod(A1, A2); // Call the method.
    }
}

對於Ref參數修飾符號,對於值類型參數的傳遞,其形參(Formal parameter)和實參(Formal parameter)是棧中同一個數據塊。在方法中對於形參所作的更改在控制回調時會反映到實參。對於引用類型的參數的傳遞,其形參(Formal parameter)是實參(Formal parameter)是指同一個變量(棧中Reverence引用部分和堆中object數據部分),在方法中對於形參所作的更改在控制回調時當然會反映到實參 。例:

class MyClass
{ public int Val = 20; } // Initialize field to 20.
class Program
{
    static void MyMethod(ref MyClass f1, ref int f2)
    {
        f1.Val = f1.Val + 5; // Add 5 to field of f1 param.
        f2 = f2 + 5; // Add 5 to second param.
    }
    static void Main()
    {
        MyClass A1 = new MyClass();
        int A2 = 10;
        MyMethod(ref A1, ref A2); // Call the method.
    }
}

Out參數修飾符Ref功能類似,如果兩個方法簽名僅僅在ref或者out方面使用不同,都會引起重載(overload),

例如:

class MyClass
{
    public void MyMethod(int i){ i = 10;}

    public void MyMethod(ref int i){ i = 10;}
}

但是在OUT和ref之間無法定義重栽。如以下例子是無效的重載(但是編譯可以通過):

class MyClass
{
    public void MyMethod(out int i){ i = 10;}

    public void MyMethod(ref int i){ i = 10;}
}

區別如下:

Out在控制回調前,必須在方法體內進行形參賦值。

Ref在方法調用前,必須對實參進行顯式的賦值。

params 關鍵字指定在參數數目可變,具體經典用法例子在微軟PetShop的數據訪問層的SQLHelper中可見。

3.類,對象,引用

類(class)是在內存中看得到摸得著的類型實例的一個藍圖,是對象的特性的抽象和行為的概括。通常,類在擴展文件名為.CS的代碼文件中被定義。

通常一旦類被定義,你可以用使用New關鍵字生成任何對象(object),對象是類的一個實例(instance)。

但是,new關鍵字返回堆(heap)的引用(references),並不是這個實際的對象(object)本身,而你在應用程序當中使用的這個引用(references)變量是存在於棧(Stack),如果調用用這個對象的(Object)的屬性和方法,使用.(Dot)操作符號。對於引用(references)的定義和解釋,你可以借助圖來理解。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved