久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

C#個人總結(jié)5則范文

時間:2019-05-12 08:24:43下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《C#個人總結(jié)》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《C#個人總結(jié)》。

第一篇:C#個人總結(jié)

C#調(diào)用瀏覽器的功能實現(xiàn)淺析

2009-11-13 來自:網(wǎng)上整理

字體大小:【大中小】

摘要:C#調(diào)用瀏覽器的功能實現(xiàn)使用了什么方法?C#調(diào)用瀏覽器的功能實現(xiàn)的步驟是什么呢?那么本文就向你介紹C#調(diào)用瀏覽器包括默認(rèn)和非默認(rèn)瀏覽器的基本情況。

C#調(diào)用瀏覽器是如何實現(xiàn)的呢?我們在實際的開發(fā)過程中會遇到這樣的需求,那么來實現(xiàn)C#調(diào)用瀏覽器會用到什么方法呢?這里向你介紹了調(diào)用IE以及默認(rèn)瀏覽器的具體操作。C#調(diào)用瀏覽器之調(diào)用IE:

? System.Diagnostics.Process myProcess = new System.Diagnostics.Process();? myProcess.StartInfo.FileName = “iexplore.exe”;? myProcess.StartInfo.Arguments = “ http://”;?

?? try ?? { ?? System.Diagnostics.Process.Start(target);?? } ?? catch ??(?? System.ComponentModel.Win32Exception noBrowser)?? { ?? if(noBrowser.ErrorCode==-2147467259)?? MessageBox.Show(noBrowser.Message);?? } ?? catch(System.Exception other)?? { ?? MessageBox.Show(other.Message);?? } C#調(diào)用瀏覽器的操作就向你介紹到這里,希望對你了解和學(xué)習(xí)使用C#調(diào)用瀏覽器有所幫助。

F1.Show();與Application.Run(f1);的區(qū)別?/??? Application.Run()包含消息循環(huán),直至窗口關(guān)閉才返回; Form.Show()將窗體顯示出來,顯示后就返回

在Main()里把默認(rèn)的Application.Run(new Form1());換成new Form1().Show()就知道區(qū)別了。

private void OnClosing(object sender, FormClosingEventArgs e){ if(MessageBox.Show(“確實要退出嗎”, “hello”, MessageBoxButtons.YesNo, MessageBoxIcon.Question)== DialogResult.No)e.Cancel = true;} }

寫一個程序,窗口如同瀏覽器一樣打開指定的網(wǎng)站怎么寫

滿意答案

熱心問友 2012-04-24 在主窗體添加一個Textbox,Button,webBrowser,其中TextBox用來輸入網(wǎng)址,Button來執(zhí)行瀏覽網(wǎng)頁操作,WebBrowser用來顯示瀏覽的頁面 一個按鈕單擊事件,一個對話框的KeyPress事件

namespace ie {

public partial class Form1 : Form {

public Form1(){

InitializeComponent();}

private void button1_Click(object sender, EventArgs e){

Uri address = new Uri(textBox1.Text);//創(chuàng)建一個Uri變量,用來存儲瀏覽的網(wǎng)頁地址

webBrowser1.Url = address;//在WebBrowser種顯示制定的網(wǎng)頁

} private void textBox1_KeyPress(object sender, KeyPressEventArgs e){

if(e.KeyChar == 13)//按下Enter

{

if(textBox1.Text!= “")

{

button1_Click(sender,e);

}

} }

} }

有些沒有完善,你自己完善一下,主要功能實現(xiàn)了

產(chǎn)生隨機數(shù):

Random.next(int32,int32)這個方法里面的兩個參數(shù)分別寫最小值和最大值,得到的隨機數(shù)就是這兩個參數(shù)范圍內(nèi)的值

這是我剛才試的代碼 Random r = new Random();int a = r.Next(1, 10);int b = r.Next(1, 10);int c = r.Next(1, 10);int d = r.Next(1, 10);

結(jié)果并不是一樣的,雖然有時會一樣,隨機數(shù)嘛

類型轉(zhuǎn)換

C 貨幣 2.5.ToString(”C“)

¥2.50

D 十進制數(shù) 25.ToString(”D5“)00025

E科學(xué)型25000.ToString(”E“)

2.500000E+005

F固定點25.ToString(”F2“)

25.00

G 常規(guī) 2.5.ToString(”G“)

2.5

N 數(shù)字 2500000.ToString(”N“)

2,500,000.00 X 十六進制 255.ToString(”X“)

FF

http://www.tmdps.cnponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;using System.IO;

namespace 速度賽跑 { publicpartialclassForm1 : Form

{ public Form1()

{

InitializeComponent();

CheckForIllegalCrossThreadCalls = false;

} privateThread thread1 = null;privateThread thread2 = null;privateThread thread3 = null;bool wanbi;privatevoid thread1Show()

{ while(true)

{

double n = 1;Random r = newRandom();int a = r.Next(1, 100);

progressBar1.Maximum = 1000;

progressBar1.Minimum = 0;

progressBar1.Value = 0;

progressBar1.Step = a;if(wanbi == true)

{ for(int m = 0;m <(1000 / a);m++)

{

progressBar1.Value += progressBar1.Step;

System.Threading.Thread.Sleep(500);

}

textBox1.Text = n.ToString();

textBox1.Enabled =false

;//

如次???????????????????????

}

wanbi = false;

}

} privatevoid thread2Show()

{ while(true)

{ double n = 2;Random r = newRandom();int a = r.Next(1, 100);

progressBar2.Maximum = 1000;

progressBar2.Minimum = 0;

progressBar2.Value = 0;

progressBar2.Step = a;if(wanbi == true)

{ for(int m = 0;m <(1000 / a);m++)

{

progressBar2.Value += progressBar2.Step;

System.Threading.Thread.Sleep(500);

}

textBox1.Text = n.ToString();

textBox1.Enabled =false

;//

如次???????????????????????

}

wanbi = false;

}

} privatevoid thread3Show()

{ while(true)

{ double n = 3;Random r = newRandom();int a = r.Next(1, 100);

progressBar3.Maximum = 1000;

progressBar3.Minimum = 0;

progressBar3.Value = 0;

progressBar3.Step = a;if(wanbi == true)

{ for(int m = 0;m <(1000 / a);m++)

{

progressBar3.Value += progressBar3.Step;

System.Threading.Thread.Sleep(500);

}

textBox1.Text = n.ToString();

textBox1.Enabled =false

;//次???????????????????????

}

wanbi = false;

}

}

privatevoid label2_Click(object sender, EventArgs e)

{

}

privatevoid Form1_Load(object sender, EventArgs e)

{

}

privatevoid progressBar1_Click(object sender, EventArgs e)

{ Random r = newRandom();int a = r.Next(1, 100);

progressBar1.Maximum = 1000;

progressBar1.Minimum = 0;

progressBar1.Step = a;

}

privatevoid progressBar2_Click(object sender, EventArgs e)

{ Random r = newRandom();int a = r.Next(1, 100);

progressBar1.Maximum = 1000;

progressBar1.Minimum = 0;

progressBar1.Step = a;

}

privatevoid progressBar3_Click(object sender, EventArgs e)

{ Random r = newRandom();int a = r.Next(1, 100);

progressBar1.Maximum = 1000;

progressBar1.Minimum = 0;

progressBar1.Step = a;

}

privatevoid button1_Click(object sender, EventArgs e)

{

thread1 = newThread(newThreadStart(thread1Show));

thread2 = newThread(newThreadStart(thread2Show));

thread3 = newThread(newThreadStart(thread3Show));

thread1.Start();

thread2.Start();

thread3.Start();

button1.Enabled = false;

button2.Enabled = true;

wanbi = true;

textBox1.Enabled =false;

}

privatevoid button2_Click(object sender, EventArgs e)

{

thread1.Abort();

thread2.Abort();

thread3.Abort();

button1.Enabled = true;

button2.Enabled = false;

textBox1.Text = null;

} privatevoid Form1_Closing(object sender, FormClosedEventArgs e)

{ if(thread1!= null)thread1.Abort();if(thread2!= null)thread2.Abort();if(thread3!= null)thread3.Abort();

}

privatevoid textBox1_TextChanged(object sender, EventArgs e)

{

}

} } FileDialog.FileName 屬性

文件名既包含文件路徑也包含擴展名。如果未選定文件,該方法將返回空字符串(”“)。

在 SaveFileDialog 類中使用該屬性時,它表示所保存的文件;在 OpenFileDialog 類中使用該屬性時,它表示正打開的文件。

該屬性只能是一個選定文件的名稱。如果希望返回包含多重選擇對話框中所有選定文件名稱的數(shù)組,請使用 FileNames。

關(guān)于OpenFileDialog的使用 2011-07-07 20:59

1、OpenFileDialog控件有以下基本屬性

可以用以下代碼來實現(xiàn)上面這個對話框:

private void openFileDialogBTN_Click(object sender, System.EventArgs e){ OpenFileDialog openFileDialog=new OpenFileDialog();openFileDialog.InitialDirectory=”c:“;//注意這里寫路徑時要用c:而不是c: openFileDialog.Filter=”文本文件|*.*|C#文件|*.cs|所有文件|*.*“;openFileDialog.RestoreDirectory=true;openFileDialog.FilterIndex=1;if(openFileDialog.ShowDialog()==DialogResult.OK){ fName=openFileDialog.FileName;File fileOpen=new File(fName);isFileHaveName=true;richTextBox1.Text=fileOpen.ReadFile();richTextBox1.AppendText(”“);} } 路徑的返回用filename是字符串類型 如: openFileDialog1.ShowDialog();_name1= openFileDialog1.FileName;Image imge = Image.FromFile(_name1);

為了方便同事在日常工作中很快速生成大量數(shù)據(jù), 我做了文件拷貝的小工具: 其中用到了OpenFileDialog這個類,下面是關(guān)于這個類的一些用法!OpenFileDialog類是用來選擇文件位置的, FolderBrowserDialog 類用來選擇文件夾位置.具體代碼如下: 程序源碼: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;namespace copyFile { public partial class Form1 : Form { String fileName;String folderName;String extendedName;String fileName1;

public Form1(){ InitializeComponent();} private void browse_Click(object sender,EventArgs e){ OpenFileDialog ofd = new OpenFileDialog();//new一個方法 ofd.InitialDirectory = Environment.GetFolderPath_r(Environment.SpecialFolder.MyDocuments);//定義打開的默認(rèn)文件夾位置 ofd.ShowDialog();//顯示打開文件的窗口

fileName = ofd.FileName;//獲得選擇的文件路徑 textBox1.Text = fileName;extendedName = Path.GetExtension_r(fileName);//獲得文件擴展名 fileName1 = Path.GetFileName_r(fileName);//獲得文件名 } private void folder_Click(object sender, EventArgs e){ FolderBrowserDialog fbd = new FolderBrowserDialog();fbd.ShowDialog();folderName = fbd.SelectedPath;//獲得選擇的文件夾路徑

textBox3.Text = folderName;} private void ok_Click(object sender, EventArgs e){ ? if(textBox1.Text.Trim().Length == 0){ MessageBox.Show(”文件路徑不能為空!“);return;} if(textBox2.Text.Trim().Length == 0){ MessageBox.Show(”復(fù)制數(shù)量不能為空!“);return;} if(textBox3.Text.Trim().Length == 0){ MessageBox.Show(”目標(biāo)文件夾路徑不能為空!“);return;} String newFile;//定義存儲的位置,和存儲的名稱

for(int i = 1;i <= Convert.ToInt32(textBox2.Text);i++)//從textBox2中獲取要復(fù)制的次數(shù) { newFile = folderName + ”“ + fileName1 +”_“+ i.ToString()+ extendedName;;File.Copy(fileName, newFile, true);//使用Copy復(fù)制文件, Copy(源文件位置,目標(biāo)文件夾位置,是否可以覆蓋同名文件)} MessageBox.Show(”復(fù)制完成!");} } } 補充: //獲取文件名

Path.GetFileName_r(OpenFileDialog.FileName)//獲取文件路徑

Path.GetDirectoryName_r(OpenFileDialog.FileName)//獲取文件擴展名

Path.GetExtension_r(OpenFileDialog.FileName)

第二篇:C#總結(jié)

引用類型是類型安全的指針,它們的內(nèi)存是分配在堆(保存指針地址)上的。String、數(shù)組、類、接口和委托都是引用類型。

強制類型轉(zhuǎn)換與as類型轉(zhuǎn)換的區(qū)別:當(dāng)類型轉(zhuǎn)換非法時,強制類型轉(zhuǎn)換將拋出一System.InvalidCastException異常,而as不會拋出異常,它返回一個null值。用using創(chuàng)建別名:using console = System.Console;訪問限定符:

public 該成員可以被其他任何類訪問 protected 該成員只能被其派生類訪問

private 該成員只能被本類的其他成員訪問 internal 該成員只能在當(dāng)前編譯單元的其他成員訪問 帶參數(shù)列表和返回值的Main方法: class Test {

public static int Main(string[] args)

{

foreach(string arg in args)

{

...}

} } 構(gòu)造函數(shù)(constructor)包括實例構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)。構(gòu)造函數(shù)與類名相同,且不能有返回值。例:

class TestClass {

TestClass()//實例構(gòu)造函數(shù):可以訪問靜態(tài)成員和實例成員,用于初始化實例成員

{

...}

static TestClass()//靜態(tài)構(gòu)造函數(shù):只能訪問靜態(tài)成員,用于初始化靜態(tài)成員

{

...} } 類的靜態(tài)成員屬于類所有,不必生成實例就可以訪問,它是在載入包含類的應(yīng)用程序時創(chuàng)建的,但靜態(tài)方法不能訪問類的實例變量和方法。通常,靜態(tài)變量是在定義時就賦初始值的。類的實例成員屬于類的實例所有,不創(chuàng)建實例對象就無法對其進行訪問,實例成員可以訪問類的

靜態(tài)成員和其它實例成員。調(diào)用基類的析構(gòu)函數(shù): class A {

public A()

{

...} } class B {

public B(): base()//調(diào)用基類的析構(gòu)函數(shù)

{

...} } 常量:其值是在編譯時設(shè)定的,必須是數(shù)值文字。默認(rèn)狀態(tài)下常量是靜態(tài)的。例: class A {

public const double pi = 3.1415;} 常量是編譯時就確定的值,只讀字段是在運行才能確定的值。比如運行時才能確定的屏幕分辨率。

只讀字段只能在類的析構(gòu)函數(shù)中賦值。靜態(tài)只讀字段: class A {

public static readonly int ScreenWidth;//靜態(tài)只讀字段

static A()

//靜態(tài)析構(gòu)函數(shù)

{

ScreenWidth = 1024;//在靜態(tài)析構(gòu)函數(shù)中初始化

} } 在類的繼承中,類的析構(gòu)函數(shù)是不會被繼承的。一個派生類只能從一個基類繼承,不能同時從多個基類繼承,但可以通過繼承多個接口來達(dá)到相同目的。實現(xiàn)多繼承的唯一方法就是使用接口。例:

class MyFancyGrid: Control, ISerializable, IDataBound {...} 密封類是不能繼承的類,抽象類不能被定義為密封類,且密封類的私有成員不能用protected修飾,只能用private。例: sealed class A {...} 關(guān)鍵字ref和out用于指定用引用方式傳遞方法的參數(shù)。

它們的區(qū)別是:ref參數(shù)必須初始化,而out參數(shù)不需要初始化。所以在方法處理代碼依賴參數(shù)的初始化值時使用ref,不依賴初始化值時使用out。對out參數(shù)即使在傳遞前對其進行了初始化,其值也不會傳遞到方法處理函數(shù)內(nèi)部。傳遞時系統(tǒng)會將其設(shè)為未初始化。所以在方法內(nèi)部必須對out參數(shù)進行初始化。

方法重載時,必須參數(shù)數(shù)目和參數(shù)類型其中之一不同,返回值不同不能作為重載。C#不支持方法的默認(rèn)值,只能通過方法重載來實現(xiàn)。例: class A {

int Method(int a)

{

...}

void Method(int a, int b)//參數(shù)數(shù)目不同

{

//返回值不同不能作為重載

...} } params參數(shù)用于一個不定數(shù)目參數(shù)的方法,一般后面跟一個數(shù)組。例: class A {

public void Method(params int[] i)

{

...} } 方法的覆蓋:指派生類覆蓋基類的同名方法,有二種方法

1)第一種是在派生類要覆蓋的方法前面加new修飾,而基類不需要作任何改動。這種方法的缺點是不能實現(xiàn)多態(tài)。例: class A {

public void Method()//無需任何修飾

{

...} } class B: A

//從基類繼承

{

new public void Method()//覆蓋基類的同名方法

{

...} } class TestClass {

A Instance = new B();

Instance.Method();//這時將調(diào)用類A的Method方法,而不是類B的Method方法 } 2)第二種是在派生類要覆蓋的方法前面加override修飾,而基類的同名方法前面加virtual修飾。這樣就能實現(xiàn)多態(tài),例: class A {

virtual public void Method()

//基類定義虛方法

{

//虛擬方法不能定義為private,因為private成員對派生類是無法訪問的...} }

class B: A

//從基類繼承 {

override public void Method()

//派生類覆蓋基類的同名虛方法

{

...} } class TestClass {

protected void Test()

{

A Instance = new B();

//定義一個實例,類型為基類,從派生類創(chuàng)建

//派生類總是能夠向上轉(zhuǎn)換為其基類

Instance.Method();

//將調(diào)用派生類B的Method方法,而不是基類的,這就是多態(tài)

} } 說明:new修飾的方法覆蓋不能實現(xiàn)多態(tài)的原因,是因為使用new時編譯器只會實現(xiàn)早期綁定(early binding)。即調(diào)用的方法在編譯時就決定了:編譯器看到Instance.Method()而Instance的類是A,就會調(diào)用類A的Method()方法。

override修飾的方法覆蓋可以實現(xiàn)多態(tài)的原因,是因為實現(xiàn)了后期綁定(late binding)。使用override時強制編譯器在運行時根據(jù)類的真正類型正確調(diào)用相應(yīng)的方法,而不是在編譯時。

而基類的同名方法必須加virtual修飾。

類的靜態(tài)方法可能通過 類名.靜態(tài)方法名 這種格式來調(diào)用,不能使用 實例名.靜態(tài)方法名 這種方法調(diào)用。

因為類的靜態(tài)方法為類所有(是屬于類本身的),而非實例所有(不是屬于類的實例的)。類的靜態(tài)方法可以訪問類的任何靜態(tài)成員,但不能訪問類的實例成員。C#中類的變量稱為字段。類的public變量稱為類的公共字段。

類的屬性由一個protected(也可以是private)字段和getter和setter方法構(gòu)成: class Address {

protected string zipCode;//protected字段,注意大小寫

public string ZipCode

{

get

//getter方法

{

return zipCode;

}

set

//setter方法

{

zipCode = value;//被傳遞的值自動被在這個value變量中

}

};} 只讀屬性是指省略setter方法的屬性,只讀屬性只能讀取,不能設(shè)置。

屬性也可以用限定符virtual,override和abstract修飾,功能同其他類的方法。

屬性有一個用處稱為懶惰的初始化(lazy initialization)。即在需要類成員時才對它們進行初始化。如果類中包含了很少被引用的成員,而這些成員的初始化又會花費大量的時候和系統(tǒng)資源的話,懶惰的初始化就很有用了。C#中數(shù)組對象共同的基類是System.Array。將數(shù)組聲明為類的一個成員時,聲明數(shù)組與實例化數(shù)組必須分開,這是因為只能在運行時創(chuàng)建了類的實例對象之后,才能實例化數(shù)組元素值。聲明:

int[] intArray;//一維數(shù)組 int[,] int3Array;//三維數(shù)組 初始化:

intArray = new int[3] {1,2,3};int[,] int2Array = new int[2,3] {{1,2,3},{4,5,6}};//聲明時可以初始化 遍歷:

1)一維數(shù)組

for(int i = 0;i < intArray.Length;i++);//Array.Length返回數(shù)組所有元素的個數(shù) foreach(int i in intArray);for(int i = 0;i < intArray.GetLength(0);i++);//Array.GetLength(0)返回數(shù)組第一維的個數(shù) 2)多維數(shù)組

for(int i = 0;i < int3Array.GetLength(0);i++)//遍歷三維數(shù)組

for(int j = 0;j < int3Array.GetLength(1);j++)

for(int k = 0;k < int3Array.GetLength(2);k++)

{

...} 數(shù)組的維數(shù)就是該數(shù)組的秩(Rank)。Array.Rank可以返回數(shù)據(jù)的秩。鋸齒數(shù)組(jagged Array)是元素為數(shù)組的數(shù)組,例:

int[][] jaggedArray = new int[2][];//包含二個元素,每個元素是個數(shù)組 jaggedArray[0] = new int[2];//每個元素必須初始化 jaggedArray[1] = new int[3];for(int i = 0;i < jaggedArray.Length;i++)//遍歷鋸齒數(shù)組

for(int j = 0;j < jaggedArray[i].Length;j++)

{

...} 類的屬性稱為智能字段,類的索引器稱為智能數(shù)組。由于類本身作數(shù)組使用,所以用this作索引器的名稱,索引器有索引參數(shù)值。例: using System;using System.Collections;class MyListBox {

protected ArrayList data = new ArrayList();

public object this[int idx] //this作索引器名稱,idx是索引參數(shù)

{

get

{

if(idx >-1 && idx < data.Count)

{

return data[idx];

}

else

{

return null;

}

}

set

{

if(idx >-1 && idx < data.Count)

{

data[idx] = value;

}

else if(idx = data.Count)

{

data.Add(value);

}

else

{

//拋出一個異常

}

}

} } 接口是二段不同代碼之間約定,通過約定實現(xiàn)彼此之間的相互訪問。C#并不支持多繼承,但通過接口可實現(xiàn)相同功能。當(dāng)在接口中指定了實現(xiàn)這個接口的類時,我們就稱這個類“實現(xiàn)了該接口”或“從接口繼承”。一個接口基本上就是一個抽象類,這個抽象類中除了聲明C#類的其他成員類型——例如屬性、事件和索引器之外,只聲明了純虛擬方法。接口中可以包含方法、屬性、索引器和事件——其中任何一種都不是在接口自身中來實現(xiàn)的。例:

interface IExampleInterface {

//property declaration

int testProperty { get;}

//event declaration

event testEvevnt Changed;

//mothed declaration

function void testMothed();

//indexer declaration

string this[int index] { get;set;} } 說明:定義接口時,在方法、屬性、事件和索引器所有這些接口成員都不能用public之類的訪問限定符,因為所有接口成員都是public類型的。因為接口定義了一個約定,任何實現(xiàn)一個接口的類都必須定義那個接口中每一個成員,否則將編譯失敗。例: using System;public class FancyControl {

protected string data;

public string Data

{

get {return this.data;}

set {data = value;}

} } interface IValidate {

bool Validate();//接口方法

} public class MyControl: FancyControl, IValidate {

public MyControl()

{

data = “my control data”;

}

public bool Validate()//實現(xiàn)接口

{

if(data == “my control data”)

return true;

else

return false;

} } class InterfaceApp {

MyControl myControl = new MyControl();

IValidate val =(IValidate)myControl;//可以將一個實現(xiàn)某接口的類,轉(zhuǎn)換成該接口

bool success = val.Validate();//然后可調(diào)用該接口的方法 } 也可以用:bool success = myControl.Validate();這種方法來調(diào)用Validate方法,因為Validate在類MyControl中是被定義成public的,如果去除public,Validate方法被隱藏,就不能用這種方法調(diào)用了,這樣隱藏接口方法稱為名字隱藏(name hiding)。可以用:類實例 is 接口名 來判斷某個類是否實現(xiàn)了某接口,例: myControl is IValidate //MyControl類的實例myControl是否實現(xiàn)了IValidate接口

當(dāng)然,也可用as來作轉(zhuǎn)換,根據(jù)轉(zhuǎn)換結(jié)果是否為null來判斷某個類是否實現(xiàn)了某接口,例: IValidate val = myControl as IValidate;if(null == val){...//沒有實現(xiàn)IValidate接口 } else {...//實現(xiàn)了IValidate接口

}

如果一個類從多個接口繼承,而這些接口中如果定義的同名的方法,則實現(xiàn)接口的方法時,必須加接口名來區(qū)別,寫成 接口名.方法名。假設(shè)Test類從IDataStore和ISerializable二個接口繼承,而這二個接口都有SaveData()方法,實現(xiàn)SaveData()方法時必須寫成: class Test: ISerializable, IDataStore {

void ISerializable.SaveData()

{

...}

void IDataStore.SaveData()

{

...} } 如果一個類從多個接口繼承,為了方便可以定義一個新的接口,這個接口繼續(xù)多個接口,然后類直接從這個接口繼承就可以了,這個叫合并接口。例: interface ISaveData: ISerializable, IDataStore { //不需要定義任何方法或成員,只是用作合并 } class Test: ISaveData //只要繼承ISaveData就可以了 {...} C# 操作符優(yōu)先級(從高到低)

初級操作符()x.y f(x)a[x] x++ x--new typeof sizeof checked unchecked 一元操作符 +位移操作符 << >> 關(guān)系操作符 < > <= >= is 等于操作符 == 邏輯與

& 邏輯異或 ^ 邏輯或

| 條件與

&& 條件或

|| 條件操作符 ?: 賦值操作符 = *= /= %= +=-= <<= >>= &= ^= |= 所有的二元操作符除賦值符外都是左聯(lián)合的,即從左到右計算。

typeof()運算符可以從一個類名得到一個System.Type對象,而從System.Object對象繼承來的GetType()方法則可從一個類實例來得到一個System.Type對象。例: Type t1 = typeof(Apple);//Apple是一個類名

Apple apple = new Apple();//apple是Apple類的一個實例 Type t2 = apple.GetType();//t1與t2是相同的 通過反射得到一個類的所有成員和方法: Type t = typeof(Apple);string className = t.ToString();//得到類名

MethodInfo[] methods = t.GetMethods();//得到所有方法 foreach(MethodInfo method in methods){ //用method.ToString()得到方法名 } MemberInfo[] members = t.GetMembers();//得到所有成員 foreach(MemberInfo member in members){ //用member.ToString()得到成員名 } sizeof()操作符用來計算值類型變量在內(nèi)存中占用的字節(jié)數(shù)(Bytes),并且它只能在unsafe(非安全)

代碼中使用。例:

static unsafe public void ShowSizes(){

int i, j;

j = sizeof(short);

j = sizeof(i);} 盡可能使用復(fù)合賦值操作符,它比不用復(fù)合賦值操作符的效率高。for語句的語法為:

for(initialization;Boolean-expression;step)

embedded-statement 在initialization和step部份還可以使用逗號操作符,例: for(int i = '0', j = 1;i <= 'xFF';i++, j++)for(int i = 1, j = 1;i < 1000;i += j, j = i!~ ++--true false 二元:+32)/ 9)* 5;

} } 代表的(delegate)目的與C++中的函數(shù)指針相同,代表不是在編譯時被定義的,而是在運行時被定義的。

代表主要有二個用途:回調(diào)(Callback)和事件處理(event)回調(diào)通常用于異步處理和自定義處理。例: class DBManager {

static DBConnection[] activeConnections;

//聲明回調(diào)函數(shù)

public void delegate EnumConnectionCallback(DBConnection connection);

public static void EnumConnections(EnumConnectionCallback callback)

{

foreach(DBConnection connection in activeConnections)

{

callback(connection);//執(zhí)行回調(diào)函數(shù)

}

} } //調(diào)用

class DelegateApp {

public static void ActiveConncetionCallback(DBConnection connection)//處理函數(shù)

{

...}

public void main()

{

//創(chuàng)建指向具體處理函數(shù)的代表實例(新建一個代表,讓它指向具體的處理函數(shù))

DBManager.EmnuConnectionCallback myCallback = new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);

DBManager.EnumConnections(myCallback);

} } //使用靜態(tài)代表,上面的調(diào)用改為 class DelegateApp {

//創(chuàng)建一個指向處理函數(shù)的靜態(tài)代表

public static DBManager.EmnuConnectionCallback myCallback

= new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);

public static void ActiveConncetionCallback(DBConnection connection)

{...} public void main()

{

DBManager.EnumConnections(myCallback);

} } //在需要時才創(chuàng)建代表,上面的調(diào)用改為

class DelegateApp {

//將創(chuàng)建代表放在屬性的getter方法中

public static DBManager.EmnuConnectionCallback myCallback

{

get

{

retun new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);

}

}

public static void ActiveConncetionCallback(DBConnection connection)

{...} public void main()

{

DelegateApp app = new DelegateApp();//創(chuàng)建應(yīng)用程序

DBManager.EnumConnections(myCallback);

} } 可以將多個代表整合成單個代表,例: class CompositeDelegateApp {

public static void LogEvent(Part part)

{

...}

public static void EmailPurchasingMgr(Part part)

{

...}

public static void Main()

{

//定義二個代表

InventoryManager.OutOfStockExceptionMethod LogEventCallback

= new InventoryManager.OutOfStockExceptionMethod(LogEvent);

InventoryManager.OutOfStockExceptionMethod EmailPurchasingMgrCallback

= new InventoryManager.OutOfStockExceptionMethod(EmailPurchasingMgr);

//整合為一個代表,注意后加的代表先執(zhí)行(這里是先執(zhí)行LogEventCallback)

InventoryManager.OutOfStockExceptionMethod onHandExceptionEventsCallback

= EmailPurchasingMgrCallback + LogEventCallback;

//調(diào)用代表

InventoryManager mgr = new InventoryManager();

mgr.ProcessInventory(onHandExceptionEventsCallback);

//InventoryManager類的ProcessInventory方法的原型為:

//public void ProcessInventory(OutOfStockExceptionMethod exception);

} } 可以根據(jù)需要將多個代表自由地組合成單個代表,例: class CompositeDelegateApp {

//代表指向的處理函數(shù)(三個代表三個函數(shù))

public static void LogEvent(Part part)

{

...} public static void EmailPurchasingMgr(Part part){...}

public static void EmailStoreMgr(Part part)

{

...}

public static void Main()

{

//通過數(shù)組定義三個代表

InventoryManager.OutOfStockExceptionMethod[] exceptionMethods

= new InventoryManager.OutOfStockExceptionMethod[3];

exceptionMethods[0] = new InventoryManager.OutOfStockExceptionMethod(LogEvent);

exceptionMethods[1] = new InventoryManager.OutOfStockExceptionMethod(EmailPurchasingMgr);

exceptionMethods[2] = new InventoryManager.OutOfStockExceptionMethod(EmailStoreMgr);

int location = 1;

//再定義一個代表(用于組合成單代表)

InventoryManager.OutOfStockExceptionMethod compositeDelegate;

//根據(jù)需要組合

if(location = 2)

{

compositeDelegate = exceptionMethods[0] + exceptionMethods[1];

}

else

{

compositeDelegate = exceptionMethods[0] + exceptionMethods[2];

}

//調(diào)用代表

InventoryManager mgr = new InventoryManager();

mgr.ProcessInventory(compositeDelegate);

} } C#的事件遵循“發(fā)布——預(yù)訂”的設(shè)計模式。在這種模式中,一個類公布能夠出現(xiàn)的所有事件,然后任何的類都可以預(yù)訂這些事件。一旦事件產(chǎn)生,運行環(huán)境就負(fù)責(zé)通知每個訂戶事件已經(jīng)發(fā)生了。

當(dāng)代表作為事件的處理結(jié)果時(或者說定義具有代表的事件),定義的代表必須指向二個參數(shù)的方法:一個參數(shù)是引發(fā)事件的對象(發(fā)布者),另一個是事件信息對象(這個對象必須從EventArgs類中派生)。例: using System;

class InventoryChangeEventArgs: EventArgs //事件信息對象,從EventArgs類派生 {...//假設(shè)定義二個public屬性string Sku和int Change } class InventoryManager

//事件的發(fā)布者 {

//聲明代表

public delegate void InventoryChangeEventHander(object source, InventoryChangeEventArgs e);

//發(fā)布事件,event關(guān)鍵字可將一個代表指向多個處理函數(shù)

public event InventoryChangeEventHandler onInventoryChangeHander;

public void UpdateInventory(string sku, int change)

{

if(change == 0)

return;

InventoryChangeEventArgs e = new InventoryChangeEventArgs(sku, change);

//觸發(fā)事件

if(onInventoryChangeHandler!= null)//如果有預(yù)訂者就觸發(fā)

onInventoryChangeHandler(this, e);//執(zhí)行代表指向的處理函數(shù)

} } class InventoryWatcher

//事件的預(yù)訂者 {

public InventoryWatcher(InventoryManager mgr)//mgr參數(shù)用于聯(lián)結(jié)發(fā)布者

{

this.inventoryManager = mgr;

//預(yù)訂事件,用 += 調(diào)用多個處理函數(shù)

mgr.onInventroyChangeHandler += new InventoryManager.InventoryChangeEventHandler(onInventoryChange);

//事件處理函數(shù)

void onInventroyChange(object source, InventroyChangeEventArgs e)

{

...}

InventoryManager inventoryManager;

} } class EventsApp

//主程序 {

public static void Main()

{

InventoryManager inventoryManager = new InventoryManager();

InventoryWatcher inventoryWatcher = new InventoryWatcher(inventoryManager);

inventoryManager.UpdateInventory(“111 006 116”,-2);

inventoryManager.UpdateInventory(“111 006 116”, 5);

} } Microsoft Windows NT和IBM OS/2等操作系統(tǒng)都支持占先型多任務(wù)。在占先型多任務(wù)執(zhí)行中,處理器負(fù)責(zé)

給每個線程分配一定量的運行時間——一個時間片(timeslice)。處理器接著在不同的線程之間進行切換,執(zhí)行相應(yīng)的處理。在單處理器的計算機上,并不能真正實現(xiàn)多個線程的同時運行,除非運行在多個處理器 的計算機上。操作系統(tǒng)調(diào)度的多線程只是根據(jù)分配給每個線程時間片進行切換執(zhí)行,感覺上就像同時執(zhí)行。

上下文切換(context switching)是線程運行的一部分,處理器使用一個硬件時間來判斷一個指定線程的時間片何時結(jié)束。當(dāng)這個硬件計時器給出中斷信號時,處理器把當(dāng)前運行的線程所用的所有寄存器(registers)數(shù)據(jù)存儲到堆棧中。然后,處理器把堆棧里那些相同的寄存器信息存放到一種被稱為“上下文結(jié)構(gòu)”的數(shù)據(jù)結(jié)構(gòu)中。當(dāng)處理器要切換回原來執(zhí)行的線程時,它反向執(zhí)行這個過程,利用與該線程相關(guān)的上下文結(jié)構(gòu),在寄存器里重新恢復(fù)與這一線程相關(guān)的信息。這樣的一個完整過程稱為“上下文切換”。多線程允許應(yīng)用程序把任務(wù)分割為多個線程,它們彼此之間可以獨立地工作,最大限度地利用了處理器時間。using System;using System.Threading;class SimpleThreadApp {

public static void WorkerThreadMethod()//線程的執(zhí)行體

{

...//執(zhí)行一些操作

}

public static void Main()

{

//創(chuàng)建一個線程代表指向線程的執(zhí)行體,ThreadStart是創(chuàng)建新線程必須用到的代表

ThreadStart worker = new ThreadStart(WorkerThreadMethod);

Thread t = new Thread(worker);//用線程代表創(chuàng)建線程

t.Start();

//執(zhí)行線程

} } 可以通過兩種方式來得到一個Thread對象:一種是通過創(chuàng)建一個新線程來得到,如上例;另一種在正在執(zhí)行的線程調(diào)用靜態(tài)的Thread.CurrentThread方法。

靜態(tài)方法Thread.Sleep(int ms)可以讓當(dāng)前線程(它自動調(diào)用Thread.CurrentThread)暫停指定毫秒的時間。

如果使用Thread.Sleep(0)那么當(dāng)前線程將一直處于等待中,直到另一個線程調(diào)用這個線程的實例方法Thread.Interrupt方法,等待才會結(jié)束。使用Thread.Suspend方法也能掛起線程,Thread.Suspend方法可以被當(dāng)前線程或其他線程調(diào)用,而Thread.Sleep(0)只能由當(dāng)前線程在執(zhí)行體中調(diào)用。當(dāng)線程用Thread.Suspend掛起時,必須用Thread.Resume方法恢復(fù)。不論Thread.Suspend方法調(diào)用了多少次,只要調(diào)用Thread.Resume方法一次就可以線程恢復(fù)執(zhí)行。用Thread.Suspend方法并不會阻塞線程,調(diào)用立即返回。而Thread.Sleep(0)則會阻塞線程。所以確切地說Thread.Sleep(0)暫停線程,而不是掛起線程。

使用Thread.Abort方法可以終止正在執(zhí)行的線程。當(dāng)Thread.Abort方法被調(diào)用時,線程不會立即終止執(zhí)行。運行環(huán)境將會等待,直到線程到達(dá)文檔中所描述的“安全點”。如果要確保線程已經(jīng)完全停止,可以使用Thread.Join方法。這是一個同步調(diào)用,同步調(diào)用意味著直到線程完全停止,調(diào)用才會返回。

Thread.Priority屬性用于設(shè)置的線程的優(yōu)先級。其值是Thread.ThreadPriority枚舉值,可以設(shè)為Highest, AboveNormal,Normal, BelowNormal, Lowest。缺省值是Thread.ThreadPriority.Normal。

線程的同步是為了解決多個線程同時使用同一對象產(chǎn)生的一些問題。通過同步,可以指定代碼的臨界區(qū)(critical section),一次只有一個線程可以進入臨界區(qū)。使用System.Monitor類(鎖定與信號量)進行線程同步: using System;using System.Threading;public void SaveData(string text)//線程執(zhí)行函數(shù)或線程執(zhí)行函數(shù)調(diào)用的對象的方法 {

...//執(zhí)行其他一些不需要同步的處理

Monitor.Enter(this);//獲取對象的Monitor鎖

...//執(zhí)行需要同步的處理

Monitor.Exit(this);//釋放對象的Monitor鎖

...//執(zhí)行其他一些不需要同步的處理

} 說明:當(dāng)執(zhí)行Monitor.Enter方法時。這個方法會試圖獲取對象上的Monitor鎖,如果另一個線程已經(jīng)擁有了這個鎖,這個方法將會阻塞(block),直到這個鎖被釋放。

也可用C#的lock語句來獲得和釋放一個Monitor鎖。上面同步寫成:public void SaveData(string text)//線程執(zhí)行函數(shù)或線程執(zhí)行函數(shù)調(diào)用的對象的方法 {

...//執(zhí)行其他一些不需要同步的處理

lock(this)//獲取對象的Monitor鎖,代碼塊執(zhí)行完成后釋放Monitor鎖

{

...//執(zhí)行需要同步的處理

}

...//執(zhí)行其他一些不需要同步的處理 } 也可以使用System.Threading名稱空間的Mutex類(互斥類)進行線程同步。與Monitor鎖一樣,一次只有一個線程能獲得一個給定的互斥。但Mutex要慢得多,但它增加了靈活性。例:

using System;using System.Threading;class Database {

Mutex mutex = new Mutex(false);//創(chuàng)建一個互斥,但不立即獲得它

//注意:創(chuàng)建互斥在需要同步的方法之外,實際上它只要創(chuàng)建一個實例

public void SaveData(string text)//需要同步的方法

{

mutex.WaitOne();//等待獲得互斥

...//需要同步的處理

mntex.Close();//釋放互斥

} } Mutex類重載了三個構(gòu)造函數(shù):

Mutex()

//創(chuàng)建并使創(chuàng)建類立即獲得互斥

Mutex(bool initiallyOwned)

//創(chuàng)建時可指定是否要立即獲得互斥 Mutex(bool initiallyOwned, string muterName)//還可以指定互斥的名稱 Mutex.WaitOne方法也重載了三次: Mutex.WaitOne()

//一直等待

Mutex.WaitOne(TimeSpan time, bool exitContext)//等待TimeSpan指定的時間 Mutex.WaitOne(int milliseconds, bool exitContext)//等待指定的毫秒 線程的用法:

1)并發(fā)操作:比如一個程序監(jiān)視多個COM口,當(dāng)每個COM接到信息時執(zhí)行一段處理時。2)復(fù)雜長時間操作:一個長時間的復(fù)雜操作可能會使界面停滯,停止用戶響應(yīng),如果還允許用戶停止它,或者顯示進度條、顯示操作執(zhí)行進程信息時。

反射(Reflection)就是能夠在運行時查找類型信息,這是因為.NET編譯的可執(zhí)行(PE)文件中包括MSIL和元數(shù)據(jù)(metadata)。

反射的中心是類System.Type。System.Type是一個抽象類,代表公用類型系統(tǒng)(Common Type System, CTS)中的一種類型。

using System;using System.Reflection;//反射命名空間,必須引用 public static void Main(string[] args){

int i = 6;

Type t = i.GetType();

//根據(jù)實例得到類型

t = Type.GetType(“System.Int32”);//根據(jù)類型的字符名稱得到類型

} 通過Assembly類可以得到已經(jīng)編譯.NET Framework程序的中所有類型,例: using System;using System.Diagnostics;//為了使用Process類 using System.Reflection;//為了使用Assembly類 class GetTypesApp {

protected static string GetAssemblyName(string[] args)

{

string assemblyName;

if(0 == args.Length)//如果參數(shù)為空,取當(dāng)前進程的名稱

{

Process p = Process.GetCurrentProcess();

assemblyName = p.ProcessName + “.exe”;

}

else

assemblyName = args[0];//取第一個參數(shù),即當(dāng)前運行程序名

return assemblyName;

}

public static void Main(string[] args)

{

string assemblyName = GetAssemblyName(args);

Assembly a = Assembly.LoadFrom(assemblyName);//調(diào)用編譯程序集

Type[] types = a.GetTypes();

//得到多個類型

foreach(Type t in types)

//遍歷類型數(shù)組

{

...//取得t.FullName,t.BaseType.FullName等類型信息

}

} } 一個應(yīng)用程序可以包括多個代碼模塊。若要將一個cs文件編譯一個模塊,只要執(zhí)行下面的命令:

csc /target:module 要編譯的模塊.cs //csc是C Sharp Compiler(C#編譯器)然后在應(yīng)用程序中using編譯的模塊.cs中的NameSpace即可應(yīng)用了。要反射應(yīng)用程序中所有代碼模塊(Module),只要:

Assembly a = Assembly.LoadFrom(assemblyName);//應(yīng)用程序的物理文件名 Module[] modules = a.GetModules();foreach(Module m in modules){...//顯示m.Name等

} 后期綁定(latebinding),例:

string[] fileNames = Directory.GetFiles(Environment.CurrentDirectory, “*.dll”);foreach(string fileName in fileNames){

Assembly a = Assembly.LoadFrom(fileName);

Type[] types = a.GetTypes();

foreach(Type t in types)

{

if(t.IsSubclassOf(typeof(CommProtocol)))//判斷是否有CommProtocol的派生類

{

object o = Activator.CreateInstance(t);//生成實例

MethodInfo mi = t.GetMethod(“DisplayName”);

mi.Invoke(o, null);

//調(diào)用方法

}

} } //帶參數(shù)的例子

namespace Programming_CSharp {

using System;

using System.Reflection;

public class Tester

{

public static void Main()

{

Type t = Type.GetType(“System.Math”);

Object o = Activator.CreateInstance(t);

// 定義參數(shù)類型

Type[] paramTypes = new Type[1];

paramTypes[0]= Type.GetType(“System.Double”);

MethodInfo CosineInfo = t.GetMethod(“Cos”, paramTypes);

//設(shè)置參數(shù)數(shù)據(jù)

Object[] parameters = new Object[1];

parameters[0] = 45;

//執(zhí)行方法

Object returnVal = CosineInfo.Invoke(o, parameters);

Console.WriteLine(“The cosine of a 45 degree angle {0}”, returnVal);

}

} } 動態(tài)生成代碼和動態(tài)調(diào)用的完整例子: //動態(tài)生成代碼的部分 using System;using System.Reflection;using System.Reflection.Emit;//動態(tài)生成代碼必須引用 namespace ILGenServer {

public class CodeGenerator

{

public CodeGenerator()

{

currentDomain = AppDomain.CurrentDomain;//得到當(dāng)前域

assemblyName = new AssemblyName();//從域創(chuàng)建一個程序集

assemblyName.Name = “TempAssembly”;

//得到一個動態(tài)編譯生成器,AssemblyBuilerAccess.Run表示只在內(nèi)存中運行,不能保存

assemblyBuilder = currentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilerAccess.Run);

//從編譯生成器得到一個模塊生成器

moduleBuilder = assemblyBuilder.DefineDynamicModule(“TempModule”);

//模塊生成器得到類生成器

typeBuilder = moduleBuilder.DefineType(“TempClass”, TypeAttributes.Public);

//為類添加一個方法

methodBuilder = typeBuilder.DefineMethod(“HelloWord”, MethodAttributes.Public, null, null);

//為方法寫入代碼,生成代碼必須使用到IL生成器

msil = methodBuilder.GetILGenerator();

msil.EmitWriteLine(“Hello World”);msil.Emit(OpCodes.Ret);//最后還需要編譯(build)一下類 t = typeBuilder.CreateType();

}

AppDomain currentDomain;

AssemblyName assemblyName;

AssemblyBuilder assemblyBuilder;

ModuleBuilder moduleBuilder;

TypeBuilder typeBuilder;

MethodBuilder methodBuilder;

ILGenerator msil;

object o;

Type t;

public Type T

{

get

{

return this.t;

}

}

} } //動態(tài)調(diào)用的部分

using System;using System.Reflection;using ILGenServer;//引用動態(tài)生成代碼的類 public class ILGenClientApp {

public static void Main({

CodeGenerator gen = new CodeGenerator();//創(chuàng)建動態(tài)生成類

Type t = gen.T;

if(null!= t)

{

object o = Activator.CreateInstance(t);

MethodInfo helloWorld = t.GetMethod(“HelloWorld”);//為調(diào)用方法創(chuàng)建一個MethodInfo

if(null!= helloWorld)

{

helloWorld.Invoke(o, null);//調(diào)用方法

}

}

} } 調(diào)用DLL using System;using System.Runtime.InteropServices;//為了使用DLLImport特性

class PInvokeApp {

[DllImport(“user32.dll”, CharSet=CharSet.Ansi)] //CharSet.Ansi指定Ansi版本的函數(shù)(MessageBoxA),CharSet.Unicode指定Unicode版本的函數(shù)(MessageBoxW)

static extern int MessageBox(int hWnd, string msg, string caption, int type);//聲明DLL中的函數(shù)

//[DllImport(“user32.dll”, EntryPoint=“MessageBoxA”)] //用這種方法使用不同的函數(shù)名

//static extern int MsgBox(int hWnd, string msg, string caption, int type);

//[DllImport(“user32.dll”, CharSet=CharSet.Unicode)] //調(diào)用Unicode版的DLL函數(shù)

//static extern int MessageBox(int hWnd, [MarshalAs(UnmanagedType.LPWStr)]string msg,// [MarshalAs(UnmanagedType.LPWStr)]string caption, int type);//將LPWStr翻譯為string型,缺省情況系統(tǒng)只將LPStr翻譯成string

public static void Main()

{

MessageBox(0, “Hello, World!”, “CaptionString”, 0);//調(diào)用DLL中的函數(shù)

} } 例2,使用回調(diào): class CallbackApp {

[DllImport(“user32.dll”)]

static extern int GetWindowText(int hWnd, StringBuilder text, int count);

delegate bool CallbackDef(int hWnd, int lParam);

[DllImport(“user32.dll”)]

static extern int EnumWindows(CallbackDef callback, int lParam);

static bool PrintWindow(int hWnd, int lParam)

{

StringBuilder text = new StringBuilder(255);

GetWindowText(hWnd, text, 255);

Console.WriteLine(“Window Caption: {0}”, text);

return true;

}

static void Main()

{

CallbackDef callback = new CallbackDef(PrintWindow);

EnumWindows(callback, 0);

} } 關(guān)鍵字unsafe指定標(biāo)記塊在非控環(huán)境中運行。該關(guān)鍵字可以用于所有的方法,包括構(gòu)造函數(shù)和屬性,甚至還有方法中的代碼塊。關(guān)鍵字fixed負(fù)責(zé)受控對象的固定(pinning)。Pinning是一種動作,向垃圾收集(Garbage Collector, GC)指定一些不能被移動的對象。為了不在內(nèi)存中產(chǎn)生碎片,.NET運行環(huán)境把對象四處移動,以便于最有效地利用內(nèi)存。使用fixed后指定對象將不會被移動,所以就可以用指針來訪問它。

C#中只能得到值類型、數(shù)組和字符串的指針。在數(shù)組的情況下,第一個元素必須是值類型,因為C#實際上是返回一個指向數(shù)組第一個元素的指針,而不是返回數(shù)組自身。& 取一個變量的內(nèi)存地址(即指向該變量的指針)* 取指針?biāo)缸兞康闹?> 取成員

例:using System;class UnsafeApp {

public static unsafe void GetValues(int* x, int* y)

{

*x = 6;

*y = 42;

}

public static unsafe void Main()

{

int a = 1;

int b = 2;

GetValues(&a, &b);

} } fixed語法為:fixed(type* ptr = expression)statements其中type也可以為非控類型,也可是void;expression是任何產(chǎn)生一個type指針的表達(dá)式;statements是應(yīng)用的代碼塊。例: fixed(int* f = &foo.x)//foo是Foo類的一個實例,x是Foo類的一個int屬性 {

SetFooValue(f);//SetFooValue方法的定義為unsafe static void SetFooValue(int* x)} 傳統(tǒng)的COM組件可以通過互操作層(COM Interop)與.NET運行環(huán)境交互。互操作層處理在托管運行環(huán)境和非托管區(qū)域中的COM組件操作之間傳遞所有的消息。

要使COM組件能在.NET環(huán)境中使用,必須為COM組件生成元數(shù)據(jù)。.NET運行環(huán)境用元數(shù)據(jù)層業(yè)判斷類型信息。在運行時刻使用類型信息,以便生成RCW(Runtime Callable Wrapper,運行時可調(diào)用包裝)。當(dāng).NET應(yīng)用程序與COM對象交互時,RCW處理對COM對象的裝載和調(diào)用。RCW還完成許多其他的工作,如管理對象標(biāo)識、對象生存周期以及接口緩沖區(qū)。對象生存周期管理十分關(guān)鍵,因為.NET GC把對象到處移動,并且當(dāng)對象不再使用時,自動處理這些對象。RCW服務(wù)告訴.NET,應(yīng)用程序正與托管.NET組件交互,同時又使非托管COM組件“覺得”COM對象是被傳統(tǒng)的COM客戶端調(diào)用的。

為了為COM組件生成元數(shù)據(jù)包裝,必須使用tlbimp.exe(TypeLib Importer)工具: tlbimp some_COM.tlb /out:som_COM.dll

第三篇:C#實習(xí)總結(jié)

現(xiàn)在的社會日新月異,科技飛速發(fā)展,但是隨之而來的環(huán)境問題也日益嚴(yán)重,當(dāng)然這也有很多其他諸如人口、能源等因素,不過這些讓人們越來越重視綠色產(chǎn)業(yè),而軟件就是首當(dāng)其沖的一個。我積極參加了學(xué)校組織的軟件實習(xí),主要是對.Net方面的實訓(xùn)和實戰(zhàn),一方面想要繼續(xù)深造之前在大學(xué)里面學(xué)習(xí)的軟件方面的知識,另一方面,也是為了自己的職業(yè)規(guī)劃,說直接點,就是以后找份好工作。雖然實訓(xùn)中時間安排有點緊,但很充實,學(xué)到了很多之前在大學(xué)課堂上沒有學(xué)到的知識,可以說我從這次實訓(xùn)中的收獲很大。

對于計算機編程,我可以說從高中就開始接觸,大學(xué)從專科開始一直學(xué)習(xí)的都是軟件開發(fā)的專業(yè),學(xué)過C#、Java,學(xué)過開發(fā),也學(xué)過測試。但是這次實訓(xùn)讓我體會了和之前完全不同的學(xué)習(xí)感受,不僅是時間安排、或者說效率還是教學(xué)授課的方式上,都是和大學(xué)課堂完全不同的,不是一節(jié)課講一點,也不是一點一點教給你,這個實訓(xùn)中更多的是培養(yǎng)我們獨立動手解決實際問題的能力,分析考慮問題的方法思路,讓我們真正成長起來。

學(xué)校為我們提供了良好的學(xué)習(xí)的平臺,提供了好工作的面試機會。我們覺得我們更應(yīng)該充分利用資源,珍惜機會,努力學(xué)習(xí),不斷地給自己“充電”,這樣才能不斷的開拓進取,勇于創(chuàng)新,才不至于被社會淘汰。

這次實習(xí)中,我們主要有S0、S1、S2三個階段,S0階段主要是自學(xué)C#基礎(chǔ)知識,S1階段是在老師的指導(dǎo)下學(xué)習(xí)C#基礎(chǔ)編程、C#桌面應(yīng)用開發(fā)、C#數(shù)據(jù)庫應(yīng)用開發(fā)、C#網(wǎng)絡(luò)應(yīng)用開發(fā)、軟件測試和軟件工程幾個方面的技術(shù)方面的課程,S2階段則是進入項目實戰(zhàn),做實際項目來進行鞏固和總結(jié)。整個過程中,還有穿插了職業(yè)素養(yǎng)課和英語口語課,學(xué)技術(shù)的同時,我們也注重職業(yè)素養(yǎng)的培養(yǎng)和英語口語的鍛煉。

到目前為止,我們實習(xí)的主要成果有(按時間順序):Point24(24點游戲求解小程序)、HandsUp(舉手游戲模擬小程序)、SimpleCalculator(簡單計算器)、GottaU(捕捉鼠標(biāo)小游戲)、TypeGame(打字小游戲)、WebBrowser(簡易網(wǎng)絡(luò)瀏覽器)、Checker(單機對戰(zhàn)跳棋小游戲)、MDITextEditor(多文檔界面文本編輯器)、FileManager(文件管理器)、SimpleMediaPlayer(簡單媒體播放器)等,這些小程序或是項目,雖然和市面的那些軟件比起來,在功能強大、界面美觀、Bug稀少等方面都有欠缺,但是都是實打?qū)嵉模覀冏约簞幽X、動手做出來的,當(dāng)然在做的過程中遇到了不少困難、挫折,但是正因為這些困難和挫折,我們才真正學(xué)到了知識和技術(shù)。更值得注意的則是,在老師帶領(lǐng)我們做項目的過程中,我們從老師的言傳身教中學(xué)到了很多很多編程思想、解決問題的方法思路等各種“無形”的知識。

眾多收獲之中,讓我感觸頗深的,則是老師給我們介紹的“10-90”原則和“Quality-Client-Cost”原則。“10-90”原則的意思是,我們通常都是花10%的代價就可以完成一件事或者一個項目的90%,而剩下的10%,卻需要我們花費90%的金錢、精力等各種代價,能不能做到這最后的10%,往往是衡量一個人或者一家公司很重要的一個原則。而且這個原則還是可以嵌套的,最后10%的部分中,也可以再分成90%和10%,同樣是開始的90%需要10%的代價,最后的10%需要90%的代價。這個原則不僅適用于做軟件、做項目、做公司,其實人生中做人也是如此,很多時候最后的10%是很重要的一把標(biāo)尺。雖然不能說這個原則放之四海而皆準(zhǔn),但是確實是適用于很多地方、很多方面,讓我獲益良多。“Quality-Client-Cost”原則講的則是做軟件或是做軟件公司的一個原則,就是質(zhì)量一定要放在第一位,客戶在第二位。我自己原本心目中對這三項的排序是Client-Quality-Cost”,但是老師的講解點醒了我,最具有說服力的例子,就是像微軟這樣的大公司,都是Quality第一的,他們寧可花費多一些,價格貴一些,但是一定把產(chǎn)品盡善盡美。這個原則同樣可以用在人生中,Quality就是人品、品德、素質(zhì),Client是朋友、客戶、親人,我們當(dāng)然應(yīng)該把個人的品格放在第一位。這些都屬于這次實習(xí)中,我在技術(shù)以外的收獲。

另外在實習(xí)還有職業(yè)素養(yǎng)課中,也學(xué)到了很多其他在今后的工作中,要注意的東西,首先要有團隊合作精神,現(xiàn)金的大中型軟件的編寫,分工越來越細(xì),這樣在開發(fā)、測試的過程中,團隊的合作、成員間的交流就變得尤為重要,是決定效率的重要因素;要學(xué)會獨立解決問題,工作不比在學(xué)校學(xué)習(xí),遇到的各種實際問題不會有老師專門幫助解決,自己獨立分析、解決問題的能力就變得極其重要;要有創(chuàng)新精神,在工作和學(xué)習(xí)中,如果只是一味的模仿、學(xué)習(xí),那就永遠(yuǎn)不會真正得學(xué)得得心應(yīng)手、融會貫通,必須自己去實踐,在實踐中創(chuàng)新,這樣才能把學(xué)來的,變成自己的;要有耐心,學(xué)會自我規(guī)劃和管控,耐心自是不必多說,有耐心才能把事情仔細(xì)做好,而公司的管理制度和學(xué)校根本上的不同,使得自我規(guī)劃和管控就成了能否按時圓滿完成任務(wù)的很重要的條件。

通過這次實習(xí),我在個人素質(zhì)方面有較大的提高,不僅是在C#的技術(shù)方面,還包括面對、分析和處理問題的思路、能力,思維的創(chuàng)造性和全面性,交流和溝通能力,英語口語水平,同時也克服了一些自己的缺點,獲得很大進步。

總的來說,這次實習(xí)對我有很大意義,不僅鞏固和實踐了之前在大學(xué)課堂上學(xué)到的各種知識,擴充了自己對軟件技術(shù)方面的知識儲備,同時也給了我很大的成就感,增強了我的自信。并不是說因為我做成的很難的程序,或者做出來的軟件很強很完善,但都是自己認(rèn)真完成的,過程中有遇到各種困難和挫折,但是經(jīng)

過網(wǎng)上查資料、小組討論、向老師請教等幾種途徑,最終都克服了,當(dāng)最終自己完成時,總會有一些成就感。

此外,我還人知到在以后的工作和學(xué)習(xí)中,不僅要努力學(xué)習(xí)和鍛煉專業(yè)技能知識,包括C#技術(shù)、算法技巧、MVC模式框架的開發(fā)、中間技術(shù)等等,而且也要注意讓自己興趣廣泛起來,拓寬自己的知識面,多積累各種知識,這不僅對以后的軟件開發(fā)工作有一定好處,對自身的個人修養(yǎng)的提升也是大有裨益。

社會的競爭是激烈的,我想我們應(yīng)該好好把握住大學(xué)學(xué)習(xí)的時間,充實、完善自我,掌握更多的專業(yè)知識,加強實踐和設(shè)計能力,同時也注意全面發(fā)展,這樣更有利于將來的發(fā)展,在自己的專業(yè)領(lǐng)域有所作為。

第四篇:c#基礎(chǔ)總結(jié)

【1】面向?qū)ο蟪绦蛟O(shè)計語言的三大特點是什么?答:【23】Main函數(shù)特點?答:1)Main方法是C#程序的限定,默認(rèn)的為private【2】三種命名法則的特點?答:匈牙利命名法:在變限定符,返回類型為void或int類型,Main方法必須是靜態(tài)方法;3)一個類或結(jié)構(gòu)只能有一個有效的入駝表示法:一個標(biāo)示符用若干個有意義的英語單詞或口點函數(shù);4)main方法必須定義在某一個類中。縮寫組成,第一個單詞首字母小寫,后邊的首字母大【24】多態(tài)(重寫、隱藏)

寫;Pascal表示法:與駱駝表示法類似,但是第一個 單詞的首字母也需要大寫。【3】C#注釋的三種形式特點?答1)單行注釋:// 2)class A /// {public virtual void F()【4】引用類型和值類型的數(shù)據(jù)類型? {Console.WriteLine(“A.F”);}} abstract class B:A(1)int valOne = 0;{public abstract override void F();}int valTwo = valOne;答:abstract override 是不可以一起修飾 int valThree = 333;例:在下面的例子里 valTwo = 333;TestValueRefRef1 = new TestValueRef();class A TestValueRefRef2 = Ref1;{public A(){PrintFields();} Ref2.value = 444;public virtual void PrintFields(){} } Console.WriteLine(“values:{0},{1}”, Ref1.value, class B:A Ref2.value);{int x=1;int y;public B(){y=-1;} Console.WriteLine(“values:{0}, {1},{2}”,valOne, public override void valTwo,valThree);PrintFields(){Console.WriteLine(“x={0},y={1}”,答:輸出結(jié)果:values:444,444 x,y);} 當(dāng)使用new B()創(chuàng)建B的實例時,產(chǎn)生什么輸出?(2)public class EnumTest答:x=1,y=0 { enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};分析:執(zhí)行new B()時,由于B繼承自A,所以會調(diào)用static void Main()A的構(gòu)造函數(shù),并執(zhí)行其中的PrintFields()方法,由{int x=(int)Days.Sun;inty=(int)Days.Fri;于該方法為虛方法,在繼承類中被重寫,所以,將執(zhí)Console.WriteLine(“Sun = {0}”, x);行B中的PrintFields()方法。此時,將在DOS界面Console.WriteLine(“Fri = {0}”, y);}} 上輸出“x=1,y=0”,然后,在運行B的構(gòu)造函數(shù)中的答:輸出結(jié)果:Sun = 2Fri = 7 y=-1。(建議同學(xué)們將此程序放入到代碼中,設(shè)置斷點【5】枚舉類型的字段和關(guān)聯(lián)值?枚舉類型有三個要看執(zhí)行過程。)

【25】什么是多態(tài)對象?答:用基類類名聲明,但是特性 修飾符 enum 枚舉名 : 基礎(chǔ)類型 {枚舉成員聲明,枚舉成員聲明,??,枚舉成員聲明}默認(rèn)的基礎(chǔ)函數(shù)來實例化的對象。這類對象的主要用途是引發(fā)多類型為int;關(guān)聯(lián)值:如果沒有被聲明,默認(rèn)為0。態(tài),為了將它們和一般的對象(聲明和創(chuàng)建都使用同【6】強制類型轉(zhuǎn)換(例:若有double f=2.7;int 一個類型名的對象)加以區(qū)別、揭示它們的特點和用2)將源類型的對象途,這種形態(tài)的對象稱為多態(tài)對象。轉(zhuǎn)換成為目的類型的對象 【26】接口的特點。答:接口只能包含抽象方法,不【7】運算符&和&&的區(qū)別?答:條件“與”運算符(&&)沒有訪問修飾符,接口成員必須是方法屬性事件或者時才計算第二個操作數(shù)。而&需要計算所有操作數(shù),索引器不能包含常數(shù)字段運算符也不能有靜態(tài)成員。并且優(yōu)先級高于&& 【27】委托和事件,【8】裝箱和拆箱的概念?答:裝箱就是把一個值類型委托的定義修飾符 delegate 返回類型 委托類型名(參數(shù)列表); 【9】for循環(huán)和if語句聯(lián)合使用的程序分析,for(;;)eg: public delegate int DelegateClass(stringinfo);

和continue的區(qū)別?答:break跳出循委托的創(chuàng)建(實例化)委托對象 = new 委托名(關(guān)聯(lián)方法); 【11】命名空間的特點答:它提供一種命名機制,是eg: DelegateClass obj=new DelegateClass(MethodA);

合方式無關(guān),不能表明源文件的存取方式,命名空間DelegateClass obj=MethodA;//隱式創(chuàng)建和初是按層次組織的。始化(不用new)【12】數(shù)組元素的的復(fù)制和讀值 例:分析下列語句: int[3]{5,6,2},new int[5]{6,9,7,8,3},new Hello(string target);} int[2]{3,2}};myArray3[2][2]的值是(D)A)9;B)2;該語句的作用是:在TestCS 命名空間中定義了了一C)6;D)越界 個名為Hello 的委托類型;

【13】類和對象的關(guān)系?答:類是對象的抽象,對象【28】Windows窗體中Button按鈕觸發(fā)的事件是什【14】關(guān)鍵字this和base的區(qū)別?答:base指代基【29】Windows窗體中控件的標(biāo)識符如何修改?答:【15】關(guān)鍵字new、using的多種用法?答:new修飾【30】如何修改Windows窗體的啟動窗體?答:修改被重寫,但new修飾符可終止這一特性;向下傳播; 實例化一個對象。Using:導(dǎo)入命名空間;自動釋放【31】要使用SQL Server需要使用哪兩個命名空間? Using代碼框里的資源。【16】索引器的特點?答:索引器允許重載;字符串Using System.Date.SqlClient: 【32】什么是DataSet、DataAdapter?兩者聯(lián)系?答:過簽名標(biāo)識;通過元素訪問來訪問;必須為實例成員;索引器的get訪問器具有與索引器相同的形參表;除DataAdapter:數(shù)據(jù)適配器,數(shù)據(jù)庫與DataSet間的橋value參數(shù)外,索引器的set訪問器還具有與索引器梁,把數(shù)據(jù)庫中數(shù)據(jù)下載到DataSet或回傳回去。相同的形參表。【33】用戶登錄和密碼修改(帶數(shù)據(jù)庫)【17】靜態(tài)數(shù)據(jù)成員特點?答:為所有類所共享,區(qū)用戶登錄 【18】構(gòu)造函數(shù)的特點?答:(1)構(gòu)造函數(shù)名與類名UserName='“ + txtUsername.Text.Trim().ToLower()+ ”' and UserPwd='“ + txtPassword.Text.Trim()+ 【19】析構(gòu)函數(shù)的特點?答:(1)析構(gòu)函數(shù)名是在類”'“;if(OperateDB.ExecuteReader(sql))型(默認(rèn)為空)和修飾符;(3)析構(gòu)函數(shù)不能被重載。{username = txtUsername.Text.Trim().ToLower();【20】什么是方法的重載?重載的特點是什么?答: frmMain frm = new frmMain();frm.Show();this.Hide();} 定義一組方法。重載的特點:1)位于同一類中;2)else

方法名相同;3)方法參考列表不同,包括參數(shù)個數(shù)不{MessageBox.Show(”用戶名或密碼錯誤“, ”出錯了“, 同和參數(shù)類型不同;4)與方法返回值和修飾符沒關(guān)系。MessageBoxButtons.OK, MessageBoxIcon.Error);} 【21】虛函數(shù)的特點?答:1)虛方法前不允許有修改密碼: 修飾符;2)虛方法不能是私有的,因此不能使用private修飾符; where UserName='” + frmLogin.username + “' and 【22】抽象類和抽象方法的主要特點?答:抽象類:UserPwd='” + txtOldPwd.Text.Trim()+ “'”;(或者if(OperateDB.ExecuteReader(sqlCheckPwd))說,不能產(chǎn)生對象。但是,它可以有構(gòu)造函數(shù)。(2){string sql = “update UserInfo set UserPwd='” 設(shè)計abstract類的目的是為了被繼承。抽象方法:是+ txtNewPwd.Text.Trim()+ “' where UserName='” + 不完整的,不能執(zhí)行的。frmLogin.username + “'”;

if(OperateDB.ExecuteNonQuery(sql)== 1)

{MessageBox.Show(“密碼修改成功!”);}else

{ MessageBox.Show(“密碼修改失敗!”);}}

else{MessageBox.Show(“舊密碼不正確!”);}

【34】抽象類定義和繼承使用

特點:1.沒有被完整定義,因而它不能用來實例化,或者說,不能產(chǎn)生對象。(但是,它可以有構(gòu)造函數(shù)。)2.設(shè)計abstract類的目的是為了被繼承。public abstract class Employee{public virtual void Pay(){ }

public abstract void CalculatePay();} public class HourlyEmployee: Employee

{public override void Pay(){CalculatePay();}public override void CalculatePay(){ }} 【35】接口及繼承類的使用

特定功能的抽象成員的集合。一個類可以繼承多個接口,從而獲得多個行為的描述,將它們組合成新的功能并在類中實現(xiàn)。繼承類中必須實現(xiàn)接口中的所有抽象成員。

定義接口的格式:修飾符 interface 接口名:基接口列表 {接口體} 其中,接口體的聲明可以包括:接口方法聲明;接口屬性聲明;接口事件聲明;接口索引器聲明

public delegate void

StringListEvent(IStringList sender);public interface IStringList{ void Add(string s);//方法int Count{get;}//屬性event StringListEvent Changed;//事件string this[int index]{get;set;}//索引器} 【編程題例題】

定義一MobilePhone類,包括屬性成員——網(wǎng)絡(luò)類型(NetworkType),字段成員——屏幕尺寸(screenSize)、手機品牌(brand),手機型號

(brandModel),公共方法成員——Open、Close。其中screenSize為單位是英寸的雙精度數(shù),brand為字符串,NetworkType只能是“GSM”或“CDMA”字符串。要求:(1)在此類中包含構(gòu)造函數(shù),構(gòu)造函數(shù)用于對數(shù)據(jù)(屏幕尺寸、手機品牌和手機型號)進行初始化。(2)公共成員方法中輸出相應(yīng)提示信息(參見(3)中的輸出結(jié)果格式)。(3)寫一測試類,在類中實例化一MobilePhone對象,最后能在DOS界面下顯示如下結(jié)果:諾基亞N81(屏幕尺寸2.0英寸),是一款GSM手機。手機關(guān)機了。using System;

public enum NetworkType {GSM,CDMA,}

public class MobilePhone {public double screenSize;public string brand;

public string brandModel;

public NetworkType networkType;public NetworkType NetworkType{get { return networkType;}}

public MobilePhone(double ss, string bra, string bm, NetworkType nt){screenSize = ss;brand = bra;brandModel = bm;networkType = nt;}public void Open()

{Console.WriteLine(“{0}{1}(屏幕尺寸{2}英寸),是一款{3}手機.”,brand,brandModel,screenSize.ToString(“.0”), networkType);}

public void Close()

{Console.WriteLine(“手機關(guān)機了。”);} }

public class Test

{public static void Main()

{MobilePhone mp = new MobilePhone(2.0, “諾基亞”, “N81”, NetworkType.GSM);mp.Open();mp.Close();

System.Console.ReadLine();} }

【例】寫一名為Desk的類,包含兩個字段Length(雙精度類型)、Height(雙精度類型)。再寫一繼承類ComputerDesk類。ComputerDesk類除了有Length和Height外,還有KeyboardTray(字符串類型)。Public class desk {double length;double height;}

Public class computerdesk:desk {string keyboardtray}

第五篇:C#期末總結(jié)

C#期末總結(jié)

接觸C#已經(jīng)有半學(xué)期時間,對C#感觸頗多。C#作為邏輯性極強,功能強大的程序編程語言,僅僅學(xué)習(xí)半學(xué)期是遠(yuǎn)遠(yuǎn)不夠的,希望自己能在這條路上不斷前行,能夠活到老學(xué)到老。

跟絕大部分的初學(xué)者一樣,當(dāng)看見密密麻麻的代碼,就覺得這會是一門枯燥無味的課程。但在平時生活中使用各種功能強大的app,應(yīng)用程序等時,我又會對程序背后的代碼感到好奇。就是在這樣矛盾的心情中,我一點點初步掌握了C#。

C#中最難理解也是最有意思的莫過于類的使用了。總的來說類是屬性相同的方法或?qū)ο蟮募稀>幊陶Z言中的類較為抽象,難以理解。編程語言中類的思想在現(xiàn)實生活有許多體現(xiàn)。比如我們通常會把馬路上所有的四輪交通工具歸為一類----汽車,在生物學(xué)中也使用界、門、綱、目、科、屬、種把所有生物分級分類。似乎這樣想,類很好理解。但在具體編程中會遇到許多問題,比如類成員中各個成員變量的訪問權(quán)限問題以及類與類之間的邏輯關(guān)系問題,等等。解決這些問題,需要對事物和目標(biāo)有準(zhǔn)確的理解和把握,當(dāng)然扎實的C#功底基礎(chǔ)也是必不可缺的。如果能夠充分使用類,那么代碼的編寫會變得井井有條,至少代碼會看上去富有生命力。

編程的過程自然枯燥無味,但當(dāng)看見自己編寫的程序運行成功,那種滿足感不言而喻。例如本學(xué)期的貪吃蛇游戲編程過程,就讓我感觸頗深。(首先必須承認(rèn)的一點就是貪吃蛇游戲的主體代碼是我借鑒網(wǎng)上大神,光是看懂捋清大神的代碼就花了我一星期的時間,接下來就是添加完善代碼)首先想要在游戲開始之前添加一個難度選擇功能界面,這就必須解決兩個問題:一個是怎樣控制兩個界面(難度選擇界面和游戲界面)出現(xiàn)先后次序問題,另一個是如何保存已經(jīng)選好的難度選擇并在游戲中體現(xiàn)出來。對于第一個問題我的解決方案如下:先在speed.cs(難度選擇代碼區(qū))文件中加入”this.Close();”語句;再在program.cs(程序的主入口)文件中加入”Application.Run(new Speed());”和”Application.Run(new form());”語句。加入”this.Close();”語句的目的是當(dāng)難度選擇完成后讓難度選擇界面自行關(guān)閉;加入”Application.Run(new Speed());”和”Application.Run(new form())”的目的是控制兩個界面先后出現(xiàn)的次序。這個問題的解決過程還算順利,它主要涉及函數(shù)調(diào)用。第二個問題的解決就比較難,大概耗費我兩星期的時間。第二個問題屬于在類與類之間調(diào)用變量問題。這一類問題在各種編程中會常常遇到。通過查各種資料和不斷試驗,我的解決方案如下:先添加一個新類PublicClass,然后在PublicClass定義一個靜態(tài)變量z,再在主代碼區(qū)調(diào)用z。添加新類的目的是使代碼簡潔明了并方便后期修改,定義變量z的目的是將難度選擇值賦給z。這兩個問題解決使得貪吃蛇程序能夠順利運行。但順利運行并不代表這是一個合格的程序,同學(xué)反映說這個程序看上去并不是很美觀,我意識到還需要在用戶體驗方面下工夫,沒想到這給我?guī)聿恍〉穆闊N业挠媱澥怯脠D片代替方塊來顯示蛇身,但我錯誤以為只要將定義方塊的函數(shù)修改成繪畫圖片的函數(shù)就可以了,導(dǎo)致的結(jié)果就是程序運行崩潰。我不斷翻看所有的代碼,一遍又一遍試驗,但都找不到解決的辦法。就這樣過了三四天的時間,我甚至有了放棄的打算。但或許是印證了那句話“山重水復(fù)疑無路,柳暗花明又一村”,主代碼中有段注釋引起了我的注意------”//畫出方塊并顯示在畫板上”,這時我才恍然大悟:原來不管是方塊還是圖片都要定義并使用draw()才能在界面上顯示出來,定義方塊的函數(shù)只不過定義了最基本的方塊屬性(形狀,顏色,大小等)。如果需要更換蛇身圖片,只需要在”draw()”中更改就可以了(因為圖片是從網(wǎng)上下載,圖片的各個屬性已固定無需再定義)。最終成功的給蛇換上了一件”新衣服”,程序的用戶體驗性大大提升。

完成貪吃蛇的編程后,我深深體會到C#是一款面向?qū)ο蟮木幊陶Z言。把解決問題的各個因素分門別類,實現(xiàn)分工合作以達(dá)到高效率的解決問題。就像現(xiàn)實中的社會分工一樣,每個人都在各自的崗位上辛勤勞動,無論工作大小,國家社會離不開每個人的奉獻(xiàn)付出。C#中還有其他有趣的控件,比如timer,picturebox,textbox等。靈活組合這些控件,能夠編寫出很多有意思的小程序。曾經(jīng)看見網(wǎng)上有C#計算器,C#計時器的教程,覺得很有意思并嘗試了一下,但發(fā)現(xiàn)很難實現(xiàn)程序,究其原因是因為作者的思維與我的思維有著很大的不同,這說明每個人解決問題的方式不同,而程序便是程序員思維的體現(xiàn)。每個自己編寫的程序都是與自己的思維相通的,這么理解的話可以把程序看成自己思維在其他事物上的拓展,其樂無窮,樂此不疲。或許這就是為什么世界上有那么多的天才編程員愿意夜以繼日的編寫程序,或許這也就是為什么好萊塢每每拍出人工智能統(tǒng)治世界的科幻片總能席卷全球票房。名偵探柯南劇場版《貝克街的亡靈》中的超級人工智能諾亞方舟在天才計算機少年澤田弘樹死后代替其意志繼續(xù)在日本存活下去。想想確實可怕,人工智能究竟會改變?nèi)硕嗌佟S嬎銠C注定改變每個人的生活。因此掌握計算機無疑就是掌握了未來。

由于半學(xué)期的學(xué)習(xí)時間實在太少,想要深刻理解并靈活運用C#是需要多年的實踐學(xué)習(xí)的。光是上課時間認(rèn)真聽講是遠(yuǎn)遠(yuǎn)不夠的,還需要課下不斷的練習(xí)鉆研。學(xué)習(xí)c#語言不能停留在學(xué)習(xí)它的語法規(guī)則,而是利用學(xué)到的知識編寫c#語言程序,解決實際問題。即把c#語言作為工具,描述解決實際問題的步驟,由計算機幫助我們解題。只有通過上機才能檢驗自己是否掌握c#語言、自己編寫的程序是否能夠正確地解題。語法是學(xué)習(xí)編程語言的關(guān)鍵,光靠背語法,是遠(yuǎn)遠(yuǎn)不夠的(其他語言學(xué)習(xí)也是如此)。記筆記是上課時候必須要做的一件事,但不能認(rèn)為做了筆記就不用上課認(rèn)真聽講了。C#作為一名理科學(xué)科是需要不斷深入理解實踐才能掌握的。有幾點學(xué)習(xí)心得想分享一下:.不要妄自菲薄。不能因為遇到困難就不相信自己,每個人都是從零開始。2.堅持不懈。學(xué)習(xí)C#是件漫長的過程,需要不斷激勵自己鼓勵自己。

3.多和他人交流。一個人的力量是渺小的,多個人相互交流不斷切磋才能不斷進步。4.不要偷懶,經(jīng)常思考。C#中有許多思想是和現(xiàn)實生活相通的,不斷對生活感悟?qū)ι钸M行反思,從生活中尋找靈感,這樣能提高對C#的興趣以及學(xué)習(xí)的主動性和趣味性。

5.經(jīng)常上機實驗,動手操作。實踐出真知,在實踐中理解那些深奧晦澀難懂的專業(yè)知識。6.在編程時除了要認(rèn)真謹(jǐn)慎之外,更重要的是掌握基本的知識,比如if語句和while語句的區(qū)別。初學(xué)者常常會被這兩個語句搞得暈頭轉(zhuǎn)向,在編程過程也不會太在意兩個語句的使用范圍。再比如C#中命名空間,這是常常忽略的方面,初學(xué)者一開始編程時會發(fā)現(xiàn)定義一個變量或者函數(shù)常常會遇到系統(tǒng)提醒錯誤,開始認(rèn)真檢查下來,卻怎么也找不到錯在哪,這很有可能就是命名空間錯誤。

大學(xué)之前從未接觸編程語言,對于C#的學(xué)習(xí)也是在一時興起和懷疑自己中不斷轉(zhuǎn)換。平時會去圖書館借些C#書籍,但總有種意猶未盡的感覺。這種感覺或許來自對編程語言的興趣,希望自己能學(xué)到更多關(guān)于編程語言的知識。

下載C#個人總結(jié)5則范文word格式文檔
下載C#個人總結(jié)5則范文.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

相關(guān)范文推薦

    C# .net學(xué)習(xí)進程(個人總結(jié))

    第一步 掌握一門.NET面向?qū)ο笳Z言,C#。 絕不提倡在沒系統(tǒng)學(xué)過一門面向?qū)ο螅∣O)語言的前提下去學(xué)ASP.NET。 ASP.NET是一個全面向?qū)ο蟮募夹g(shù),不懂OO,那絕對學(xué)不下去!第二步 對.NET......

    C#實訓(xùn)總結(jié)

    C#實訓(xùn)總結(jié) 經(jīng)過兩周的課程實訓(xùn),讓我感觸很深。雖然C#已經(jīng)學(xué)了一個學(xué)期,但是到真正寫代碼的時候?qū)σ郧八鶎W(xué)的知識還是有點陌生,不知道該從哪里著手。還有以前總是以為寫需求分......

    C#實訓(xùn)總結(jié)

    C#實訓(xùn)總結(jié) 實訓(xùn)期間讓我學(xué)到很多東西,不僅在理論上讓我對it領(lǐng)域有了全新的認(rèn)識,在實踐能力上也得到了很大的提高,真正的學(xué)到了學(xué)以致用,更學(xué)到很多做人的道理,對我來說受益匪淺......

    c#進銷存實習(xí)總結(jié)

    實習(xí)總結(jié) 一、實習(xí)目的: 掌握進銷存的基本業(yè)務(wù)軟件流程及C/S結(jié)構(gòu)應(yīng)用開發(fā)技術(shù)。通過本次學(xué)習(xí),加深對軟件行業(yè)的了解。掌握軟件開發(fā)的流程,體系。把所學(xué)習(xí)的理論知識和實踐項目......

    C#實訓(xùn)個人小結(jié)

    經(jīng)過4個禮拜的實訓(xùn),讓我受益匪淺,給我收獲最大的是我覺得很多工作需要我去摸索和探討,要不怕吃苦,勇于激流勇進,有的工作雖然單挑又重復(fù),但這是磨練意志最有效的方法,我告誡自己要......

    C#學(xué)習(xí)心得

    集合聲明:類B可以換成任意object對象1、CollectionBase類A繼承CollectionBase類,通過CollectionBase的成員List實現(xiàn)類A的Add(類B )、Remove(類B )和RemoveAt(類B )方法:public......

    c#讀書筆記

    1、.NET平臺包括.NET框架和.NET開發(fā)工具等組成部分。.NET框架是整個開發(fā)平臺的基礎(chǔ),包括公共語言運行庫和.NET類庫。.NET開發(fā)工具包括Visual Studio.NET集成開發(fā)環(huán)境和.NET編......

    C#實訓(xùn)總結(jié)(精選五篇)

    C#實訓(xùn)總結(jié) 系:計算機系實訓(xùn)班級: 學(xué)生姓名:實訓(xùn)地點 時間:指導(dǎo)教師: 一、通過本次實訓(xùn),你有哪些收獲? 對C#了解更深,從最初的理論知識升華到基本技能,運用到一定現(xiàn)實生活和學(xué)習(xí)中,領(lǐng)......

主站蜘蛛池模板: 成人性生交大片免费看中文| 日木强大喷奶水av片| 国产男女爽爽爽免费视频| 国产欧美成aⅴ人高清| 18女下面流水不遮图| 狠狠躁夜夜躁人人爽天天天天| 黑人巨大精品欧美一区二区免费| 极品少妇被黑人白浆直流| 欧美 偷窥 清纯 综合图区| 亚洲中文字幕无码爆乳av| 中国老太卖婬hd播放| 精品国产污污免费网站| 久久一本加勒比波多野结衣| 国产av精品一区二区三| 丰满人妻熟妇乱又仑精品| 国产妇女馒头高清泬20p多| 国产电影一区二区三区| 亚洲日韩国产欧美一区二区三区| 无码中文资源在线播放| 国产小受呻吟gv视频在线观看| 无码人妻一区二区三区在线| 蜜臀av无码精品人妻色欲| 无码人妻精品一区二区三区不卡| 亚洲熟妇色xxxxx亚洲| 特黄特色大片免费播放| 亚洲综合无码一区二区三区| 人人妻人人澡人人爽人人dvd| 国产亚洲精品久久久999| 亚洲精品亚洲人成在线| 久久九色综合九色99伊人| 国产成人高清在线播放| 亚洲人成网站18禁止久久影院| 亚洲自国产拍揄拍| 日本高清视频在线www色| 国产精品aⅴ视频在线播放| 精品亚洲成a人在线看片| 成人性做爰aaa片免费看不忠| 日韩 亚洲 制服 欧美 综合| 午夜三级a三级三点| 天堂va视频一区二区| 无码人妻精品中文字幕免费东京热|