4.1沒有值時怎麼辦
想為datetime變數設為null,但編譯器不允許 (乙個商品還沒有賣出,則沒有購買日期)
4.1.1為什麼值型別的變數不能為null
對於引用型別的變數來說,其值是乙個引用,而值型別變數的值是它本身的真實資料。可以認為,乙個非空引用值提供了訪問乙個物件的途徑。然而,null相當於乙個特殊的值,它意味著我不引用任何物件。
4.1.2 c#1.0中表示空值的模式
4.2 system.nullable和system.nullable
靜態類system.nuallable提供了一些工具方法,可以簡化可空型別的使用。
4.2.1nullable簡介
classnullablemembers
", x.hasvalue);
if(x.hasvalue)
", x.value);
console.writeline(
"explicit conversion:
", (int
)x);
}console.writeline(
"getvalueordefault(): ",
x.getvalueordefault());
console.writeline(
"getvalueordefault(10): ",
x.getvalueordefault(
10));//
如果這個nullable本身hasvalue,就返回這個value,如果沒有value就返回default 此處為10
console.writeline("
tostring(): \"\"
", x.tostring());
console.writeline(
"gethashcode():
", x.gethashcode());
console.writeline();
}static
void
main()
}
4.2.2 nullable裝箱和拆箱
已裝箱的值可以拆箱成普通型別,或拆箱成對應的可空型別。(要麼拆箱成t,要麼拆箱成nullable。拆箱乙個空引用時,如果拆箱成普通型別,會丟擲乙個nullreferenceexception;但如果拆箱成恰當的可空型別,就會拆箱成沒有值的乙個例項
classboxingandunboxing
}
4.2.3 nullable例項的相等性
nullable覆蓋了object.equals(object),但沒有引入任何相等性操作符,也沒有提供equals(nullable)方法
呼叫first.equals(second)的具體規劃如下。
4.2.4來自非泛型nullable類的支援
4.3 c#2.0為可空型別提供的語法糖
4.3.1 ?修飾符
classsyntacticsugar
}
4.3.2使用null進行賦值和比較
classagecalculation
else}}
public person(string
name,
datetime birth,
datetime?death)
}static
void
main()
}
4.3.3 可空轉換和操作符
null到t?的隱式轉換;
t到t?的隱式轉換;
t?到t的顯示轉換。
4.3.4 可空邏輯 (p108 表4-2)
4.3.5 對可空型別使用as操作符
在c#2.0之前,as操作符只能用於引用型別。而在c#2.0中,它也可以用於可空型別。 其結果為可空型別的某個值或空值(如果原始引用為錯誤型別或空)或有意義的值。
staticvoid printvalueasint32(objecto)
printvalueasint32(5);
printvalueasint32(
"some string
");
使用is和強制轉換要比使用as操作符快20倍!!!
4.3.6 空合併操作符
first ?? second
對first進行求值
如果結果非空,則該結果就是整個表示式的結果;
否則求second的值,其結果作為整個表示式的結果。
並非只能用於可空型別,還能應用於引用型別。
4.4 可空型別的新奇用法
4.4.1嘗試乙個不使用輸出引數的操作
classnullabletryparse
else
}static
void
main()
", parsed.value);
}else
}}
4.4.2 空合併操作符讓比較不再痛苦
C IN Depth 第四章 可空型別
乙個byte可以儲存256個值,無法再新增乙個null來表示。如果用2個byte來表示,則會大大增加開銷。所以修好用新建一種型別來表示。1.魔數 犧牲乙個值來表示空值 2.引用型別包裝 使用object作為變數型別,並根據需要進行裝箱和拆箱。自定義乙個引用型別b,裡面包含值型別a,並宣告各種轉換。3...
第四章 復合型別
第一題 按示例請求顯示資訊。第二題 修改程式4.4,使用c string類 include include using namespace std int main 第三題 使用char陣列,和cstring中的函式,按示例格式顯示輸出 include include using namespace...
第四章 型別基礎
這章不好理解,我是連抄帶找的。一 system.object 所有型別的基類,也就是所有型別從它派生。公開了幾個方法 equals 判定兩個物件是否具有相同的值 相等性和同一性後續討論 gethashcode tostring 預設返回型別的完整名稱,但是經常會重寫返回表示物件狀態的 string ...