801
技術社區[雲棲]
C#讀書筆記
最近因為Unity,所以較詳細的看了一遍原版的《Thingking in C#》,對於一些容易和c++混淆的地方,做下記錄:
1.Object type和value type:
1.1Object 在c#裏麵主要有兩種大的數據類型,一種叫做Object,c#裏麵的所有的自定義class都繼承自這個類型,所有的Object實際上都是一個reference,指向某個內存(包括數組,string類型)。Object必須通過new來早堆上分配分配(string 可以直接用引號)。
1.2value :int float char enum struct 這些類型是value type,是再棧上分配的,不用new,是聲明就有值的,握著的不是指針。
對於賦值操作,value type是拷貝傳值 object隻是傳遞引用
1.3boxing 和unboxing操作,將value 類型轉換為Object 類型是可以的,這個操作叫boxing,有性能損失,但是這是C#統一所有類型的方法
1.4c#永遠不再static內存上分配數據,但是有static關鍵字
1.5.生存周期,value type出了作用域就銷毀了,Object 類型默認要等待gc
1.6struct是不能有繼承的
2.可以如下定義枚舉類型,是隻支持邏輯操作
[Flags]
enum Flavor{
Vanilla = 1, Chocolate = 2,
Strawberry = 4, Coffee = 8}
Flavor conePref = Flavor.Vanilla | Flavor.Coffee;
3.namespace可以嵌套
namespace ThinkingIn{
namespace CSharp{
namespace Chap3{
//class and other type declarations go here
}
}
}
namespace ThinkingIn.CSharp.Chap4{ … }
4.數組類型
c對於多維數組c#有兩種數組類型:
rectangular array
string[,] names;
int[,,] buttons = new int[4,5,3];
即矩形的數組
jagged array
非矩形
byte[][] scores;
混合矩形和非矩形
int[][,,][,] numbers;
矩形數組的性能要更好
5.訪問屬性
privae internal(package內部是friendly的) protected public
class 隻能是internal或者public
默認屬性:class mem(private)
class(internal)
6.對於那些不希望讓c#管理資源的對象(自動的gc),通常是一些珍貴的資源,或者是一些你需要明確知道他析構的對象,需要繼承Idsiposal接口,自己釋放
https://dearymz.blog.163.com/blog/static/20565742009102745358396/
7.const 與readonly
c#的const 和c++完全不同,它是編譯器常量,即在編譯後會把const的地方自動用值替換(很像c++的宏),類中的const自帶static,const隻能修飾value type(編譯器常量)
readonly 更像c++裏麵的const,是運行期的常量,對於object type,隻是引用不可變,但是引用的那個對象是可變的
8.sealed class:不能被繼承的class,所有的virtual 函數會被替換成可直接調用
9.as 操作符:類型轉換 is 操作符,判斷是否為某個類型
10.接口是可以被繼承的
11.反射機製
https://www.dotnetperls.com/reflection
12.講更多c#技術的書
最後更新:2017-04-03 05:38:55