學習了一下c# 感覺和java很相似 如果不使用C#獨有的一些關鍵字 感覺直接可以按照java來寫,上手很快,最近開始學習Unity3D… 簡單總結下本次C#的學習。
1.out關鍵字:java中一個方法只能夠返回一個對象 C#中提供了out關鍵字來返回多個變量,本質就是直接將對象的引用傳入進行操作 而不是使用形參再另外開內存空間。要注意的是out關鍵字即使被初始化過了傳入到方法中也會被重新初始化一次,所以使用out關鍵字只需要聲明就行了。
int max;
int min;
int avg;
test.outDemo(out max, out min, out avg);
private void outDemo(out int max, out int min, out int avg)
{
max = 4;
min = 2;
avg = 3;
}
打印出來就是max爲4 min=2 avg=3.
2.ref關鍵字:與out類似也是傳入一個變量 與out不同的是傳入的不僅是引用也是內存中分配的空間,將會直接對該內存進行修改
int value = 2;
test.refDemo(ref value);
private void refDemo(ref int value)
{
value = value + 1;
}
打印value值爲3
3.struct關鍵字 與class關鍵字很相似 用來一次聲明多個變量同時又不需要創建一個類來進行存儲比創建一個類內存消耗少,是值類型而不是Object,如果想要更細緻瞭解區別可以看看別人的詳細介紹的博客
public struct TestStruct
{
public int age;
public String name;
}
private TestStruct structDemo()
{
TestStruct testStruct = new TestStruct();
testStruct.age = 10;
testStruct.name = "小明";
return testStruct;
}
TestStruct testStruct = test.structDemo();
Console.Write(testStruct.name + " age:" + testStruct.age);
4.delegate 對委託我的理解是:將方法傳入通用代碼塊減少代碼的重複,直接將方法名作爲變量傳入委託類型中 說實話剛開始還是有些難不太能夠接受需要時間適應下...
public delegate void sayHello(String name); //委託的方法必須簽名相同,即返回值類型和形參類型相同
public void say(String name, sayHello del)
{
del(name);
}
public void sayChinese(String name)
{
Console.WriteLine("你好:" + name);
}
public void sayEnglish(String name)
{
Console.WriteLine("nice to meet you " + name);
}
public void testDelegate()
{
say("小張", sayChinese);
say("mike", sayEnglish);
say("小李", delegate (String name)
{
Console.WriteLine(name + "使用了匿名方法");//匿名方法
});
say("小王", (String name) =>{ Console.WriteLine(name + "同學"); }); //lamda表達式
}
這裏我只想吐槽一點那就是使用匿名函數時必須使用delegate關鍵字聲明是委託方法,一時沒有繞過彎子,一直認爲應該使用委託聲明的方法名稱也就是例子中的sayHello,一時無法接受這種格式,所以以後我就直接使用lamda來使用匿名委託了,反正如果只是要知道委託聲明時的形參還是很容易的。
5.vitural 與override
在父類中如果一個方法想讓子類重寫必須使用vitural來聲明,同時子類重寫時必須使用override關鍵字聲明,也算是有些好處吧,這樣可能代碼看起來跟清晰的知道哪些方法被重寫了。
6. : 這個關鍵字類似了java中extends關鍵字與implements關鍵字 我記得c++中也是這個C#直接保留了下來,但是這時就不太能夠區分類和接口,因此接口的命名可能就必須更規範一些。
7.sealed關鍵字 相當於java中的final.
8.集合與多線程也有些許不同大部分是格式上的,用的時候再查,有一些需要注意的:
1).設置線程爲後臺線程 IsBackground
2).c#默認不能跨線程操作
3).CheckForIllegalCrossThreadCalls=false; 設置是否對線程的異常進行檢查
4).abort() 結束線程