C# .net asp學習筆記

1 瞭解我的開發平臺。
1.1 什麼是 .NET 框架?
    Microsoft .NET 框架是生成、部署和運行 Web 服務及應用程序的多語言環境平臺。.NET 框架由三個主要部分組成:公共語言運行庫、統一類庫的分層集合和稱爲 ASP.NET 的 Active Server Pages 組件化版本。
1.2 什麼是公共語言運行庫 (CLR)?
公共語言運行庫,[Common Language Runtime (CLR)]。
1.3 什麼是通用類型系統 (CTS)?
通用類型系統,[Common Type System(CTS)]是一個內置在公共語言運行庫中的豐富的類型系統;比如C#的int對應CTS中的System.Int32;
1.4 什麼是 Microsoft 中間語言 (MSIL)?
MSIL 是與 CPU 無關的指令集,其中編譯進了 .NET 框架程序。它包含在對象上加載、存儲、初始化和調用方法的指令。  

在類中定義的變量,暫時稱爲字段吧,其作用域爲類實例的生命週期;函數內的聲名的變量爲私有變量,作用域僅函數內有效。C#充許類變量與私有變量同名,同名時函數缺省引用私有變量,而使用類變量時,請在變量前加上類實例或類名(靜態變量)
如:class abc
{
  static int j=20
  int i=20//未靜態變量,要實例化類才能引用
  public static void Main()
 {
    int j=30;
    console.writeline(j);//私有變量,30
    console.writeline(abc.j);//類的靜態變量,不用實例化類,即可引用,20
    return;
 }
}
C#的變量定義不需要關鍵字var,不過常量需要const;所有帶有static關鍵字的方法與變量都可以在類實例化前使用。  

 
 2005-9-22 14:06:36    using與uses的區別?

uses,首先在項目單元中直接引用單元具體文件(指定單元文件路徑);單元文件中,uses引用單元名稱,並充許單元內使用引用單元的資源(方法,變量等)。
using 只需要指定命名空間名稱,然而它是如何找到具體的代碼文件的呢?
難道說每個文件都自動託管,託管時CLR自動註冊名稱與具體的託管文件關聯?使用者只需要引用命名空間,使用時由CLR定位調用就行了嗎? 那文件是在什麼時候被交給CLR託管的呢?
一個程序集(DLL)可以定義引用多個命名空間,一個命名空間可以分佈在多少程序集內。

using只是用來引用命名空間,同單元中的USES一樣,因爲命名空間是邏輯組合,至於邏輯名稱與實體文件之間的關聯則不由using處理.這還是CLR在裝入DLL程序集時註冊的吧。
using可以指定別名,如using hongyuandata=system.data

 
 2005-9-22 14:52:58    值引用和引用類型

值類型,直接存儲值;引用類型,僅保存對引用類型引用。值類型存儲在堆棧中,引用類型則在託管堆上。
注意:這裏的引用類型和pascal不一樣,在pascal中,值類型存在棧中,引用類型的引用存在棧中,被引用的值存在堆中;另一個區別就是C#引用類型,它和pascal不一樣,因爲pascal引用是指針,而C#僅僅是引用。引用類型可以賦值爲null,即不引用任何對象。相當於pascal中的Nil

枚舉是值引用,字符串,類,數組是引用類型,注意,C#沒有可變類型。

 
 2005-9-22 15:01:20    bool與char

bool:pascal裏是boolean,並且c#中只能存true或false,不可以存0,1是不可以與數值互換的;
char,不在是8位,而是16位,即Unicode字符,可以保存一箇中文漢字;值可以是'a',16進制unicode碼/u0041,(char)65,16進制數'/x0041',轉義字符/'

 
 2005-9-22 15:04:22    string

string a ='c://abc//a.cs'--->c:/abc/a.cs即注意轉義字符,如果不使用轉義字符,可以在如下操作
string a=@'c:/abc/a.cs'

 
 2005-9-22 15:08:57    語法

if {} else {} 注意{}代替了pascal中的begin...end;而且還省去了;
switch(變量)
{
case 1:
...
break;//每個case結束必需加break否則直接執行下面case,直到遇到break或到尾部
case 2:
...
break;
default:
...
break;
else
...
break;
}

 
 2005-9-22 15:13:08    foreach

foreach 語句爲數組或對象集合中的每個元素重複一個嵌入語句組。foreach 語句用於循環訪問集合以獲取所需信息,但不應用於更改集合內容以避免產生不可預知的副作用。此語句的形式如下:

foreach (type identifier in expression) statement
其中:

type
identifier 的類型。
identifier 表示集合元素的迭代變量。如果迭代變量爲值類型,則無法修改的只讀變量也是有效的。
expression 對象集合或數組表達式。集合元素的類型必須可以轉換爲 identifier 類型。請不要使用計算爲 null 的表達式。
而應計算爲實現 IEnumerable 的類型或聲明 GetEnumerator 方法的類型。在後一種情況中,GetEnumerator 應該要麼返回實現 IEnumerator 的類型,要麼聲明 IEnumerator 中定義的所有方法。

statement
要執行的嵌入語句。

 
 2005-9-22 15:16:22    break,continue,return

break退出case,for,foreach,while,do ..while
continue直接進入下一循環
return 退出類方法,直接返回調用者,如果方法有返回值,必需指定返回值,相當於pascal的exit+返回值

 
 2005-9-22 15:22:18    枚舉

pascal:
type aa=(1,2,3,4)

c# 除了值,還可以指定別名
public enum aa
{
a1=0,
a2=1,
a3=3
}
aa faa//定義faa爲枚舉aa類型
Faa.ToString()取得當前值的別名
(int) (aa)Enum.Parse(typeof(Faa),'a1',true);找到別名爲faa的值,取出值轉換成int
typeof()取出引用變量的類型,parse根據指定的枚舉類型查找指定別名,並且指定是否管大小寫

 
 2005-9-22 15:42:46    C#函數和過程直接支持動態數組參數

public static Main(string[] args)//字符串動態數組
{
for (int i=0;i<args.length;i++)
{}
return;
}
但不知道支不支持開放數組中的array of const,即不確定類型動態數組,C#不支持可變類型

 
 2005-9-22 16:07:48    C#預處理器指令,由編譯器處理,即在程序編譯時處理。

#define HongYuan ///定義一個符號HongYuan
#undef HongYuan ///取消一個符號定義HongYuan
#if HongYuan ///檢查符號HongYuan是否定義
Console.WriteLene("Test");
#else ///沒有找到符號HongYuan時
#endif ///結束符號檢查

#warning "你出錯了" 編譯器產生一個警告,顯示指定提示,並繼續編譯
#error 編譯器產生一個錯誤,並退出編譯
#region,#endregion標記一個代碼塊,但不影響編譯,只對程序編輯器有用
#line用於改變編譯器在警告和錯誤信息中顯示的文件名和行號信息。
#line 164 "Core.cs"//出錯就提示在文件core.cs,164行出錯

 
 2005-9-22 16:16:40    C#除了類,還是結構?

類是存儲在堆(heap)上的引用類型,結構是存儲在堆棧(stack)上的值類型,結構不支持繼承;定義時類用關鍵字class,結構用struct
類與結構都使用new實例化並初始化.
類中可以使用static聲名一個靜態變量或方法,這樣可以在類未實例化前調用。
類實例的方法調用必需帶(),pascal有時過程可以不指定。

 
 2005-9-22 16:30:18    類方法

方法重載
1、不需要指定overload關鍵字
2、不能僅以返回類型不同做爲重載區別
3、也不能以ref,out來區分重載
4、但可以通過參數的個數,參數類型不同來重載方法。
5、類方法的參數,ref相當於pascal的var
6、#也有out關鍵字
7、不支持默認參數.
8、過程,函數不需要procedure / function關鍵字

 
 2005-9-22 16:37:42    屬性

public string ServerName
{
  get
 {
  return fservername //返回一個字段,變更
 }
 set
{
 Fservername=value//設置一個變量值
}
}
和pascal不同的地方就是在定義屬性同時定義get,set方法的實現,即不像pascal將定義和實現分開。同是沒有set就是隻讀,沒有get就是隻寫。如果屬性需要內存或派生類中充許操作,就另寫一個方法對屬性對應的字段變量進行操作即可。因爲屬性的訪問修飾符決定了get,set訪問權限。

 
 2005-9-22 16:46:34    構造函數

類沒有創建構造函數時,編譯器會在後臺自動創建一個默認的構造函數,並會爲所有成員字段初始化,並提供默認值,如數值爲0,bool爲false,引用類型爲null。這和pascal不同,在pascal中所有類都是tobjects子類,如果沒有create就調用父類的create。同樣也是初始化類成員,只是引用類型初始值爲nil;
但要注意,只有在沒有提供任何構造函數時,編譯器才提供默認構造函數。
C#的類的構造函數必需使用與類同名的構造函數,而不是pascal必需的create
this=self,引用當前實例的成員

 
 2005-9-22 16:58:26    靜態構造函數

在構造函數前,使用static;用於初始化類的靜態字段或屬性,這些值不可以在普通構造函數或其它方法修改,同時它也不能訪問實例成員。靜態構造函數不由用戶調用,由.net運行庫加載類時調用它。一個類只有一個靜態構造函數。

 
 2005-9-22 17:04:37    同一個類的構造函數相互調用

class test
{
  public test(i:int)
  {}
  public test(i:int;s:string):this(i)//通過this調用同名函數,並將輸入參數i傳給被調用函數
  {
  }
}
這樣可以將相同的初始化工作入在一個構造函數內,其它構造函數調用它之後再完成本職工作。

 
 2005-9-22 17:33:33    類繼承與接口實現

和pascal沒什麼區別,只是把=換成了:,如
delphi
type
   tabc=class(tobjects,inf1,inf2)
    public
   end;
c#
class TAbc:object,inf1,inf2;
缺省類爲system.object
虛方法或屬性,使用virtual
隱藏或覆蓋,使用override,同時可能通過base.方法名,繼承基類的方法。
sealed類,即密封類,不可以繼承

public interface inf1
{
}

 
 2005-9-23 9:30:41    根類與根接口

// from module 'c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll'
public class object
{

    // Constructors
    public Object();

    // Methods
    public virtual bool Equals(object obj);
    public static bool Equals(object objA, object objB);
    public virtual int GetHashCode();
    public Type GetType();
    public static bool ReferenceEquals(object objA, object objB);
    public virtual string ToString();
} // end of

// from module 'c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll'
public interface IDisposable
{

    // Methods
    void Dispose();
} // end of System

 
 2005-9-23 9:40:07    運算符

%求餘,求模
new 實例化對象
?: 條件運算符

checked unchecked 溢出異常控制運算符
byte b=255
checked //進行溢出檢查,如果此處爲unchecked下面語名不出錯,但b=0
{
 b++//byte最大值255,B+1會溢出,所以運行代碼出錯
}

sizeof 取出變量佔用內存的字節數
取出<b>堆棧中值類型</b>需要的長度,單位是字節

is 類型檢查,用於檢索是否屬於某個類或子類
as 類型轉換,失敗返回null
typeof 根據指定類型返回實例對象

 
 2005-9-23 14:05:23    類型顯示轉換

int i=(int)(0.5)前面是要轉換的類型,後面是轉換的值;
int i=int.Parse("100")將100轉換成整數

C# 的數據類型都對應CTS中一種類型,應該是繼承自CTS,比如bool對應system.boolean,而boolean是一個類型,即擁有字段,屬性,方法,過程等
bool b=system.boolean b
bool b=bool.Parse("TRUE")這裏就是調用類方法將TRUE轉換成bool型
即除了可以使用 目標值=(目標類型)源值 轉換外,還可以通過目錄類型的方法進行轉換,前題是所屬類提示這個方法,一般是Parse;可通過wincv查看。

 
 2005-9-23 14:08:29    要對象提供了對象的比較,引用比較,值比較?

// from module 'c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll'
public class object
{

    // Constructors
    public Object();

    // Methods
    public virtual bool Equals(object obj);//值比較,比較類實例所有字段值是否一致。
    public static bool Equals(object objA, object objB);
    public virtual int GetHashCode();
    public Type GetType();
    public static bool ReferenceEquals(object objA, object objB);//引用比較,即指向的內存地址是否一致,大多數==同此方法一樣的操作,但可以重載實現值比較。
    public virtual string ToString();
} // end of System.Object

 
 2005-9-23 14:13:17    運算符重載

public static 類名 operator 運算符(參數)//這三個關鍵字都是必需的
public static Vector operator +(Vector lhs,Vector rhs)
{
Vector result=new Vector(lhs);
result.x=rhs.x+result.x;
....
}  

 
 2005-9-23 14:23:59    用戶定義的數據類型轉換

P137
用於結構向其它類型轉換
public static implicit operator 目標類型(參數)
{
}
用於不同類之間轉換
public static explicit operator 目標類型(參數)
{
}
基類與派生類,與接口
目標=(目標類型)源

多重數據轉換
long amount=(long)(float)balance;先轉換成float,再轉換成long
裝箱,即將對象從棧裝載到堆,比如結構類型是存在棧上,如果要轉換成system.object就是;取消裝箱,即將對象轉換成string或結構之類的值類型

 
 2005-9-23 14:49:27    裝箱與取消裝箱

結構,值類型轉換到system.object ->裝箱,由棧到堆
類轉換到值類型(如string),結構 ->取消裝箱,從堆到棧

 
 2005-9-23 15:29:56    定義一個特殊的類,並且這個類的參數能以方法做爲參數傳遞,這就是委託。

方法做爲參數傳遞,只是傳遞方法的指針;但.net不充許的。
委託,只是一個對象類型,其特別的就是沒有包含任務數據,只有方法細節;
delegate 返回值類型 委託名稱(參數);
//感覺像定義方法一樣,只是多個delegate,並且定義的是類

因爲委託是類,所以需要實現,就如同定義了接口一樣,委託的類派生於System.MulticastDelegate類;

接口也可以做爲參數傳遞,即可以用接口代替委託
被定義成委託類後,就可以做爲參數傳遞,在調用過程中不需要再實例化,看起來像是以前的指針調用。

 
 2005-9-23 15:46:56   

C# 中的委託類似於 C 或 C++ 中的函數指針。使用委託使程序員可以將方法引用封裝在委託對象內。然後可以將該委託對象傳遞給可調用所引用方法的代碼,而不必在編譯時知道將調用哪個方法。與 C 或 C++ 中的函數指針不同,委託是面向對象、類型安全的,並且是安全的。

委託聲明定義一種類型,它用一組特定的參數以及返回類型封裝方法。對於靜態方法,委託對象封裝要調用的方法。對於實例方法,委託對象同時封裝一個實例和該實例上的一個方法。如果您有一個委託對象和一組適當的參數,則可以用這些參數調用該委託。

委託的一個有趣且有用的屬性是,它不知道或不關心自己引用的對象的類。任何對象都可以;只是方法的參數類型和返回類型必須與委託的參數類型和返回類型相匹配。這使得委託完全適合“匿名”調用。

注意   委託是在調用方的安全權限下運行而不是聲明方的權限下運行。

 
 2005-9-23 16:01:51   

定義一個委託類型,相當於定義一個類
delegate string test();

實例化委託,並把方法i.ToString做爲參數傳遞給委託對象
int i:=40
test testobj=new test(i.ToString)
調用委託
testobj

調用委託實例testobj就等於調用i.ToString(),相當於在testobj存有指向方法的指針
包含多個方法的委託,就是多播委託。

 
 2005-9-23 16:20:58    事件

EventHandler這是一個事件委託,定義在system.EventHandler;
btnOne.Click+=new EventHandler(Button_Click);
btnTwo.Click+=new EventHandler(Button_Click);

EventHandler委託沒有返回值,參數必需是object和EventArgs
private void Button_Click(object sender,Eventargs e)
{
}
上面定義的是一個接收器

調用click(this,eventargs)

 
 2005-9-23 16:33:56   

操作系統對每個輸入設備產生的操作,如按下MOUSE或鍵盤,就會發送一條消息,應用程序就得捕獲消息,並根據消息調用委託,通過委託調用相應的過程處理消息,沒有處理的消息再發送給操作系統,由操作系統處理。
發送消息:按下MOUSE左鍵,首先由操作系統捕獲交給當前應用程序,再由當前應用程序交給當前窗口,如果當前窗口處理完就告訴應用程序由應用程序告訴操作系統。如果當前程序沒的處理也告訴操作系統,由它處理。如果當前窗口處理就根據當前窗口的情況及狀態通知委託,由委託調用用定義的處理過程,或者交回操作系統。  

 
 2005-9-23 17:36:28    手工調用垃圾回收器 System.GC.Collect()

注意,並不保證每次垃圾收集過程都能將未引用對象從堆中刪除

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章