六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

.Net邊學邊講

[摘要]經過一段時間的使用,覺得自己對.net的基礎知識掌握的不太夠,可能許多朋友也有這種感覺,再加上beta2在許多方面進行了調整和更改,因此我想現在用beta1做開發是不太適合,倒不如大家一起探討一些基礎知識、原理,這些東西是不會變的,而且掌握了這些,以后編程會更加得心應手。我這里下的一些類似結論性的...

經過一段時間的使用,覺得自己對.net的基礎知識掌握的不太夠,可能許多朋友也有這種感覺,再加上beta2在許多方面進行了調整和更改,因此我想現在用beta1做開發是不太適合,倒不如大家一起探討一些基礎知識、原理,這些東西是不會變的,而且掌握了這些,以后編程會更加得心應手。我這里下的一些類似結論性的文字,不一定對,個人感覺加上看一些文章的體會,希望大家能一起探討。
1.類型(Type):
類型是.Net的基本單位。.Net中的classes, interfaces, enumerations, structures都是類型,.net中的大多數類型都是類,在.net中即使你寫一個再簡單的程序(如:hello world)也需要一個類,以winform來說,main函數需要一個類,他是這個類的成員函數。那么類究竟是什么?Dr.Net 上給了一個定義:他是一個創建包含數據和操作這些數據的方法的對象的模版。有點拗口,簡單地說,他是一個模版,這個模版中封裝了數據和操作這些數據的方法。這樣,你創建了一個類就創建了一個新的數據類型、定義了操作這些數據的術語。類型是一些概念的抽象。在一個好的OO設計當中,類型是由一系列的操作定義的,而不是內在的數據格式決定的。而我們一般應將數據聲明成私有,這樣就避免了程序的其它部分破壞掉這個封裝。比如說,我們創建一個類
public class auto{
private double speed;
public double Speed{
get{
return(speed);
}
set{
speed = value;
}
}
}
以這個類為例,我詳細的說明以上的觀點,類auto可以看成一個新的數據類型,你可以聲明其他的成員為這種數據類型:public auto car(){},這樣,car返回的是一個auto類型。這跟public int car(){}沒什么區別,在.net中int, string...等時類而不僅僅是 其他編程語言中的"數據類型", 實際上C#中的int是.Net Runtime中的Int32類的別名。更深一步說你要是想做一個跨語言的組件,你聲明的所有的類型 必須是.Net Runtime的標準類,也就是說用String 代替string,Int32代替int等。那么對于封裝,我們如何理解呢?比如說Single 和 Double 他們都代表真實數字的抽象封裝。那么數據格式呢?我們往往不需要知道,也不想知道。Single 和 Double有一定的范圍和精度,因為他們都是抽象的, 而不是真實的數字。你可以對他們實現一些操作,包括加減乘除。但卻不能進行位運算,這是因為這些操作不是封裝內的部分,所以他們也不是類型的一部分。類是模版,但我們怎樣才能得到真實的對象呢?auto d= new auto();這樣我們就明白了,為什么我們在使用類前,為什么要實例化。

我們繼續來談一談類
與其他面向對象的編程語言不同,.Net中類有四個基本成員,data members(fields), function members(methods), properties, events。其他編程語言只有前兩項。這里需注意,data members(fields)永遠不要聲明成public,因為這樣會使使用者無需知道你的類就可以改變你的數據。
public class test{
private int i;
}
這里i 就是一個data members(fields),需要提及一點,properties提供了方便、安全的數據訪問封裝。下面來談談function members(methods),他有兩種存在方式,instance和static。Instance隱含的接受了指向他所在的對象的指針,在C#中你可以用對象名或this得到。如:SomeObject.Method(), 或this.Method()。靜態的(Static)Method不能接收到this指針。因此他們不能直接訪問類里的任何實例化數據。他的調用方式是SomeClassName.StaticMethod()。他無需例示。function members(methods)默認是private的,即只能在聲明他們的類中訪問,我們需要聲明他們為public以便可以在任何類中訪問。function members(methods)可以被重載,也就是說你可以創建多個就有相同名字的方法,比如說test(int i), test(double i), test(), test(string i, bool b).....。.Net編譯器會依據你傳遞的參數決定你在調用哪個方法。當然還有一些其它的修飾符如extern,他的用途是如果你想在.Net Framework中聲明你的方法而在.Net Framework之外實現你的方法,比如說在C# 中聲明你的方法而在windows本地dll中實現你的方法,你就要在C#中這樣聲明,public extern yourmethod(){}
接下來我們要談談Constructors和Finalize,每個類都至少有一個Constructor的方法,如果你沒有提供,C#將自動為你生成一個沒有任何參數的Constructor。Constructor是一個與你的類的名字相同且沒有任何返回值的的方法。每個Constructor都會調用一個你基類的Constructor(如果沒有顯性的基類,就調用對象的),這個調用會在你的Constructor主體執行之前調用,這樣,你就知道你的基類有沒有正確的初始化了。Constructor只在每個對象被創建時調用一次,它的作用是初始化對象的實例,以便于調用。Destructors已不再需要,因為C#會自動提供一個清理對象的方法(叫Finalize)。垃圾自動清理,這也是C#的區別于其他編程語言的特性之一。接下來,我們該談談屬性了。首先為什么要用屬性?來看一個例子,如果你有一個類Person,有一個data members(fields)叫Age 是Int32型的被聲明成public,(前面我們講過不能聲明成public,這里就是舉例說明為什么不能):
Person Jim = new Person(); // create object; pointed to by Jim
Jim.Age = 23;
Int32 JimsAge = Jim.Age;
Jim.Age = -5; // invalid, but unchecked if you use a field
這段代碼會造成兩個問題
1.你的用戶知道了內部數據的細節,他們可能會做一些你不希望發生的操作
2.你的用戶可能會更改數據為一個不合法的值,如將Age設為零或負數
現在大家可以知道屬性的優勢了,相對應予上面提的
1.用戶不會知道你的內部數據結構
2.屬性方法會保護數據
下面的例程顯示了屬性的優越。
public class Person
{
Int32 age; // 注意默認是private
public Person(Int32 age) { // constructor
this.age = age; // this消除歧義!
}
public Int32 Age { // property
get {
return age;
}
set { // validating value
if (value > 0 && value < 150) {
age = value;
}
else { // throw exception if invalid value
throw new ArgumentException("Age must be between 1
and 150");
}
}
}
}
這段程序有幾個值的關注的地方
1.在constructor中,我們定義了一個參數也叫age,這會與private age產生歧義。我們用this來消除歧義。
2.get方法用于讀取屬性set方法用于存取屬性 。關鍵字value代表屬性被設置的值
3.在set方法中我們檢查了value的值,并在數據不合法時拋出了異常

談到event,就不能不先說一下callback和delegate
如果你使用過C的話,你應該知道有一個函數叫qsort,是用來給數組排序的。但這個函數顯然不能承擔廣泛意義上的比較,因此你需要傳遞一個指針,他指向具有比較功能的函數。qsort在每次要比較數組元素時都要調用這個函數。這就是callback的概念,在.Net里也可以實現回調,方法是創建一個接口,實現他,傳遞一個實現此接口的對象的引用。delegate呢,你可以將他理解成一個安全的函數指針。
Notifications跟callback有點類似,但比簡單的回調要復雜的多。callback意味著要調用的callback方法被調用的同時要調用的建立callback的方法。這是一個很緊密的耦合。而Notification則要松散一些,你可以注冊將來某段時間會或者不會發生的Notification,只當他們發生時處理,否則不用。
你也許想讓你寫的組件當一些事情發生時通知其他組件,例如,你想寫一個按鈕組件,當你Click的時候你可能想通知其他組件,而其他組件將不得不準備向你請求Notification,你就要提供一個方法告訴他們你已經有一個可用的Notification。另一方面,你可能也是當其它組件的一些事情發生時希望被通知的人。這時你就需要找到那個特定組件可以提供什么Notification。
在.Net中event是一個你用來廣播、引發、處理Notification的機制。大致是這樣的,可以引發事件的組件聲明這一事件。而希望處理某一特定組件的某一特定事件的組件通過傳遞一個方法的delegate向引發事件的組件注冊。這樣,當事件發生時引發事件的組件就會調用每個已注冊的方法。通過delegate和event我們可以實現異步調用的功能。在C#中是這樣聲明一個代理的:public delegate void LogHandler(String message);代理在處理這種回調時已經是很強大了。但是當我們需要代理被存儲以便以后的Notification,就有一點麻煩了。比如說我們有一個對象Button,有一個Click事件。我們可以聲明一個ClickHandler 的代理類型用于處理Click事件,在我們的Button的Class中聲明一個ClickHandler的public實例,這樣其他組件希望Click發生時被通知,就可以簡單的把他的代理加到Click代理中去。myButton.Click += new ClickHandler(MyMethod);
看上去著好像沒什么問題。但是這里卻存在一個大問題,我們聲明Click代理是public,這違反了我們以前說過的data fields永遠不要聲明成public,這會有一系列麻煩。解決的辦法是聲明成private或protected,然后用屬性解決讀寫。這樣我們可以private聲明Click,在寫一對public方法去增加一個listener及減少一個listener。當然在.Net中,當你聲明一個event時,.Net已經為你做好這一切了。聲明一個事件:
class AlarmTimer {
public event EventHandler Alarm;
// ...
}
這段代碼說明AlarmTimer可以向所有其它對象廣播它可以引發一個叫Alarm的事件。Alarm事件用的是EventHandler代理類型。EventHandler:無返回值、接受兩個參數(Object:指向事件的發送者,EventArgs:包含關于事件的數據)
看一個例子:
class AlarmTimer {
public event EventHandler Alarm;
private Timer myTimer;
public AlarmTimer() {
myTimer = new Timer();
myTimer.Tick += new EventHandler(OnTick);
}
public void Set(Double seconds) {
myTimer.Interval = (Int32)(seconds * 1000);
myTimer.Start();
}
protected void OnTick(Object sender, EventArgs e) {
myTimer.Stop();
if (Alarm != null) Alarm(this, EventArgs.Empty);
}
public void ReEnable() {
myTimer.Enabled = true;
}
}
注意AlarmTimer既引發事件(Alarm)又處理事件(Timer中的Tick事件)
static AlarmTimer myAlarm = new AlarmTimer();
public static void TestEvent() {
myAlarm.Alarm += new EventHandler(TimerEventProcessor);
myAlarm.Set(2);
Console.WriteLine("Timer is set; alarm will go off in two seconds");
Application.Run();
}
//處理事件
private static void TimerEventProcessor(
Object myObject, EventArgs myEventArgs) {
if (MessageBox.Show("Wake up! Continue ringing?",
"Count is: " + alarmCounter,
MessageBox.YesNo) == DialogResult.Yes) {
alarmCounter += 1;
myAlarm.ReEnable();
}
else {
Application.Exit();
}
}
注意:Object和EventArgs不是必需的參數,只是這是一個好的寫法模式而已
關于event還有好多沒有說,留著以后慢慢說吧。


標簽:.Net邊學邊講 
主站蜘蛛池模板: 特别黄的免费视频大片 | 最近更新免费中文字幕大全 | 中国女人一级做受免费视频 | 亚州黄网 | 欧美影院在线观看在线观看看 | 亚洲一级片在线播放 | 夜夜艹日日艹 | 性欧美大战久久久久久久久 | 欧洲美女高清一级毛片 | 青青草色| 欧美一区二区激情三区 | 日韩三级免费 | 欧美一区二区三区日韩免费播 | 午夜影院在线免费观看 | 日本卡一卡2卡3卡4精品卡无人区 | 天天狠狠弄夜夜狠狠躁·太爽了 | 日韩高清毛片 | 婷婷丁香久久 | 中文字幕在线精品视频站app | 香蕉福利久久福利久久香蕉 | 日本一区二区视频在线 | 伊人狠狠 | 最新韩国伦理片大全手机在线播放 | 在线观看 a国v | 日一日射一射 | 日本福利片在线观看 | 欧美性活生活视频 | 日日夜夜爱 | 青草青在线免费视频 | 一级做a爱片特黄在线观看 一级做a爱片久久蜜桃 | 在线免费视频国产 | 天天干天天操天天射 | 污污视频在线播放 | 亚洲国产乱码在线精品 | 天天色踪合合 | 性荡视频播放器在线视频播放 | 欧美中文娱乐网 | 日韩色区 | 亚洲日韩在线视频 | 亚洲人免费 | 婷婷综合缴情亚洲狠狠图片 |