日期:2008-6-10
學習內容:析構,方法,屬性
遺留問題:
學習總結:
1. 析構
知識一:垃圾回收機制,CLR規定第0代的存儲空間一般爲256k,第一代的存儲空間爲2M ,第三代的存儲空間爲10M
知識點二:一個類只能有一個析構器;析構器不能被繼承和重載;析構器不能被調用,它們被自動調用;析構器不能代修飾
知識點三:C#中的Finalizer(終結器)和C++中的Destructor(析構器)的工作原理是不相同的,建議不要在類中定義析構器,因爲他會延長對象的聲明週期,系統的效率會下降
知識點四:顯示的告訴CLR進行垃圾回收的方法:GC.Collect();微軟強烈建議不要這麼做
知識點五:CLR只能自動釋放託管堆中的資源,對於一些非託管堆中的資源(文件,網絡,SSL等)需要對他手動進行釋放,對象名.Close()或對象名.Dispose()。進行手動釋放後,系統不在執行終結器中的Finalize()方法
知識點六:那些情況下會導致Finalize()方法被調用,第0代對象充滿,代碼顯示的調用System.CG的Collect()方法,Windows報告內存不足,CLR卸載引用程序域,CLR被關閉
2. 方法
知識點一:方法的參數傳遞機制,值參數傳遞,引用參數傳遞,輸出參數傳遞
代碼實例:
using System;
namespace ConsoleApplication2
{
class Program
{
public static void ValueMethod(int i)//值參數傳遞方法
{
i++;
}
public static void RefMethod(ref int i)//引用參數傳遞方法
{
i++;
}
public static void OutMethod(out int i)//輸出參數傳遞方法
{
i = 0;
i++;
}
static void Main (string[] args)
{
int i = 0;
ValueMethod(i);
Console.WriteLine("i="+i);
int j = 0;
RefMethod(ref j);
Console.WriteLine("j=" + j);
int k;
OutMethod(out k);
Console.WriteLine("k=" + k);
}
}
}
知識點二:向方法傳遞可變參數的方法是使用params關鍵字
代碼實例:
using System;
namespace ConsoleApplication2
{
class Program
{
static int addi(params int[] values)//定義向方法傳遞可變參數的方法
{
int sum = 0;
foreach (int i in values)
{
sum += i;
}
return sum;
}
static void Main (string[] args)
{
Console.WriteLine(addi(1,2,3,4,5,6));
}
}
}
知識點三:使用數組作爲參數傳遞他的值會發生改變,因爲他是引用類型。字符串也是引用類型但是它的值不會發生改變,這是由字符串的特性決定的,字符串在聲明之後是不可變的,他在託管堆中創建一個副本進行操作
知識點四:共享變量。如果兩個以上的方法要共享一個變量則要將此變量聲明在類階層。和局部變量不同的地方在於,類級別變量的生命週期是在此類加載到內存時就自動的分配內存空間,要等到此對象被CLR的垃圾回收器回收時,纔會釋放掉所佔用的內存空間。使用共享變量的方法是在成員變量的名稱前面加上static關鍵字
輸出參數和引用參數的區別:
從CLR的角度看,關鍵字out和關鍵字ref是等效的,這就是說,無論使用哪個關鍵字,都會生成相同的元數據和IL代碼。但是,c#編譯器將兩個關鍵字區別對待,在c#中,這兩個關鍵字的區別在於哪個方法負責初始化引用對象。如果方法的參數標記爲out,那麼調用者不希望在調用方法前初始化對象,被調用的方法不能讀取對象的值,而且被調用的方法必須在返回之前爲對象賦值。如果方法的參數標記爲ref,那麼調用者必須在調用方法之前首先初始化參數的值,被調用的方法可以讀取參數或爲參數賦值
值類型和引用類型:
類型區分爲兩大類的主要原因是在於執行性能與內存資源管理的不同。由於值類型變量直接在堆棧(stack)中存儲該類型的值,此類類型在內存的使用上以及訪問的效能上比引用類型更好。因爲引用類型變量存放的是指向實際對象的指針,因此訪問對象時必須多進行一次內存引用的操作方可獲取數據。且引用類型的對象必須分配多餘的內存來存放虛函數指針及線程同步塊,對於內存的需求較大。而引用類型的優點是回收站會自動替您管理分配在託管堆(Managed Heap)當中的內存。
值類型變量和引用類型變量
|
值類型 |
引用類型 |
變量中存放 |
真正的數據 |
指向數據的引用指針 |
內存空間分配 |
堆棧(stack) |
託管堆(Managed Heap) |
內存需求 |
一般來說較少 |
較大 |
執行效能 |
較快 |
較慢 |
內存釋放時間點 |
執行超過定義變量的作用域 |
由回收站負責回收 |
可以爲null |
不可 |
可以 |
3. 屬性
屬性是類,結構和接口的命名成員。它們提供了通過訪問器(accessor)讀或寫或計算私有字段的靈活機制。屬性是這樣的成員:它們提供靈活的機制來讀取,編寫或計算私有字段的值。可以像使用公共數據成員一樣使用屬性,但實際三它們是稱爲“訪問器”的特殊方法。這使得數據在可被輕鬆訪問的同時,仍能提供方法的安全性和靈活性。
屬性使用實例:
using System;
namespace ConsoleApplication2
{
class Property
{
private string m_Name;
private string m_Sex;
public string Name
{
set
{
m_Name = value;
}
get
{
return m_Name;
}
}
public string Sex
{
set
{
if (value=="男"||value=="女")
m_Sex = value;
else
Console.WriteLine("性別只能爲男或女");
}
get
{
return m_Sex;
}
}
}
class Program
{
static void Main (string[] args)
{
Property user = new Property();
user.Name = "張三";
user.Sex = "男";
Console.WriteLine("姓名:{0}"+" "+"性別:{1}",user.Name,user.Sex);
}
}
}
靜態屬性的例子:
using System;
class User
{
private static int logincount;//定義靜態成員變量,用以存儲登陸網站的人數
public User()//User類的構造方法
{
logincount++;
}
public static int Log//定義靜態的屬性Log
{
get
{
return logincount;
}
}
}
class Program
{
static void Main (string[] args)
{
User a = new User();
User b = new User();
User c = new User();
Console.WriteLine(User.Log);
}
}