格物致知 《Effective C#》讀書筆記--驗證型別轉換
as看起來很好用的樣子,不會丟擲異常,只要根據返回值是否為 null 來做不同的處理就可以了。但是它也不是萬金油,以下的情況 as 就不適用:
①值型別
比如:
double d = 100.0;
int valueType = d as int ;
這兩句程式碼就直接通不過編譯,給出的原因是: as 運算子必須用於引用型別或可以為 null 型別 (“int” 是一種不可以為 null 值的型別 )
想一下也合理,as 在失敗時會返回 null ,而值型別是不可以為 null 的( INullable 除外)。
由上面的出錯資訊也可以看出來,as
但是也並非所有值型別都適用,存在於一條繼承鏈上的自不必說。但是自定義型別轉換呢?
②自定義型別轉換
假設有兩個類定義如下:
class ClassOne
{
private int filedOne;
public int FiledOne
{
get { return filedOne; }
set { filedOne = value ; }
}
public static explicit operator ClassTwo
{
return new ClassTwo { FiledTwo = co.FiledOne };
}
}
class ClassTwo
{
private int filedtwo;
public int FiledTwo
{
get { return filedtwo; }
set { filedtwo = value ; }
}
}
ClassOne中定義了向
ClassTwo
試用一下:
ClassOne co = new ClassOne { FiledOne=10};
ClassTwo ct = ( ClassTwo )co;
這樣是沒問題的,但是再寫下面一句:
ct = co as ClassTwo ;
就會報告: 無法通過引用轉換、裝箱轉換、取消裝箱轉換、包裝轉換或 Null 型別轉換將型別 “CastAsIs.ClassOne” 轉換為 “CastAsIs.ClassTwo”
由此可見as 對於自定義型別轉換不感冒。
實際上,foreach 內部也是使用的強制型別轉換的,看下面:
ClassOne [] arr =
{ new ClassOne { FiledOne = 1 },
new ClassOne { FiledOne = 2 } };
foreach ( ClassTwo item in arr)
{
Console .WriteLine(item.FiledTwo.ToString());
}
這段程式碼編譯和執行都沒問題(把arr 中的 ClassOne 強制轉換為 ClassTwo 自然沒問題),但是如果改寫成下面這樣:
foreach ( ClassTwo item in arr as IEnumerable )
{
Console .WriteLine(item.FiledTwo.ToString());
}
就會報告一個InvalidCastException ,原因就是 IEnumerator.Current ()返回的是 Object 型別,而在 foreach 中試圖將 Object 轉化為 ClassTwo 就會出錯。
相關推薦
格物致知 《Effective C#》讀書筆記--驗證型別轉換
as看起來很好用的樣子,不會丟擲異常,只要根據返回值是否為 null 來做不同的處理就可以了。但是它也不是萬金油,以下的情況 as 就不適用: ①值型別 比如: double d = 100.0; int valueType = d as int ; 這兩句程式碼就
effective C++ 讀書筆記 條款14 以對象管理資源
effect virt 什麽 con pin 構造 ostream pos sha 如果我們使用一個投資行為的程序庫: #include "stdafx.h" #include <iostream> #include <memory> using
effective C++ 讀書筆記 條款11
col tor 變量 pre amp 副本 swap 基本 目標 條款11: 在operator= 中處理“自我賦值” 在實現operator=時考慮自我賦值是必要的就像 x=y 。我們不知道變量x與y代表的值是否為同一個值(把x和y說成是一個指針更恰當一點)。例如
effective c++讀書筆記——用內聯模板函式替換類似函式的巨集定義
我們來看下面巨集定義: #define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b)) 這般長的巨集有著太多缺點,光是想到它們就讓人痛苦不堪。無論何時當你寫出這種
【知行合一】厚積薄發,格物致知。簡單點,做事的動機簡單點。
關於博主 目前主要學習機器人導航與定位演算法: 基本掌握filter-slam,graph-slam框架,熟悉單目tracking部分的direct method 和 feature method. 熟悉單目mapping部分的深度估計,正在努力學習semi-dense
Effective C++讀書筆記---複製物件時勿忘每一個成員
核心點有兩個: 1、如果你堅持自己重寫拷貝建構函式,請記住:編譯器是不會提醒你是否少複製了某一個成員。 2、如果你重寫派生類的拷貝建構函式和拷貝操作符時,請記住:他們不會自動呼叫積累的拷貝建構函式和拷貝操作符。 以下為例子,注意手動呼叫基類的建構函式: class Pri
Effective C++讀書筆記之十二:複製物件時勿忘其每一個成分
class Date{...}; class Customer { public: ... private: std::string name; Date lastTransaction; }; class PriorityCustomer:public Customer { public: Pri
Effective C++ 讀書筆記----介面和類的設計
新型別的物件怎麼建立和銷燬。這關乎到建構函式和解構函式以及記憶體分配函式和釋放函式。 物件的初始化和物件的賦值有什麼樣的差別。這是建構函式和賦值函式需要考慮的問題。 新型別的物件如果被值傳遞,意味著什麼。拷貝建構函式用來定義設計的型別的值傳遞該如何實現。 什麼是新型別的合法值。在建構函式和賦值操作符中必須對值
Effective C++讀書筆記----資源管理
C++中,我們自己申請的資源,需要我們手動的釋放。 有時候我們給了顯示釋放資源的語句,但是存在有些意外情況導致釋放語句沒能成功被執行。比如說在執行釋放語句前函式提前返回;假如釋放語句在一個迴圈內部,迴圈因為continue或者break提前結束;執行釋放語句之前程式拋異常了。 為了防止資源洩漏,請使用RAI
Effective C++讀書筆記----構造/析構/賦值運算
對於一個空類,編譯器會自動建立建構函式、拷貝建構函式、賦值運算子過載以及解構函式。(當然只有在這些函式在被呼叫的時候才會被編譯器創建出來)如果我們在類中顯示的聲明瞭這些函式,編譯器將不再自動生成這些函式。 當類的成員變數中有引用型別或者有const修飾,編譯器不會為該類生成賦值運算子過載函式,儘管該類並沒有
Effective C++讀書筆記----自定義型別的傳參和返回值問題
對於自定義型別,傳參的時候儘可能的使用傳引用來代替傳值。 看如下這個例子: #include <iostream> using namespace std; #include <string> class Person {
Effective C++讀書筆記---讓自己習慣C++
宣告式是告訴編譯器某個東西的名稱和型別。 簽名式是指引數和返回值。一個函式的簽名等同於該函式的型別(C++對簽名式的官方認定不包括返回值) 將函式宣告為 explicit ,可以阻止他們被用來執行隱式轉換,但他們仍可以用來進行顯式型別轉換 其他靜態成員只能在類裡邊進行宣告,類外進行初始化。格式為: 類域::
Effective C++讀書筆記(九)實現部分(下)
Item29 為“異常安全”而努力是值得的 “異常安全”有兩個條件 1)不洩露任何資源。 2)不允許資料敗壞。 例如下列程式碼: void PrettyMenu::changeBackground(std::istream& imgSr
AI時代,人類該如何學習?格物致知
在看完,李開復寫的“人工智慧”後,我認為,之前花一些時間,去了解Neural Network的背後的數學原理,是值得的。除了本人喜歡探究事物的本質之外,還有現實的考量。對AI有興趣的人,強力推薦李開復的“人工智慧”(非廣告) 據我所知,目前AI的發展,不管是Machin
Effective C++讀書筆記(七)設計與宣告部分(下)
Item22 將成員變數宣告為private 如果public介面內的每樣東西都是函式,客戶就不需要在打算訪問class成員時迷惑地試著記住是否該使用小括號。 細微的劃分訪問控制破有必要,因為許多成員變數應該被隱藏起來。 如果你通過函式訪問成員變數,日
Effective C++讀書筆記
但是,我們不該令拷貝賦值操作符呼叫拷貝建構函式,也不該令拷貝建構函式呼叫拷貝賦值操作符。想想,一個是拷貝(建立物件),一個是賦值(物件已經存在)。 請記住: Copying函式應該確保複製“物件內的所有成員變數”及“所有基類成員”; 不要嘗試以某個copying函式實現另一個copying函式
【C++學習筆記】型別轉換和跳轉語句
一、型別轉換 在C++語言中,如果兩種型別由關聯,那麼當程式需要其中一種型別的運算物件時,可以用另一種型別的物件或值來替代,即如果如果兩種型別可以相互轉換(conversion),那麼它們就是關聯的。下面的例子中會先根據型別轉換規則設法將運算物件的型別統一
連通性問題--Algorithms IN C讀書筆記
基礎 英文版 efi sni 數組元素 否則 每次 -m 添加 近期在看《Algorithms IN C》這本書。剛開始看,讀的是英文版的。感覺作者的敘述有點不太easy理解。就找了一本中文版的來看,發現還是看英文版的比較好。先看了第一章的大部分,後面的總
CLR via C#讀書筆記 CLR寄宿和AppDomain
利用 create 控制 jmp 代理 情況 note 系統目錄 exce 寄宿 寄宿是指讓其他應用程序(非托管代碼)使用CLR的能力,比如自己用C++開發的窗體能創建CLR實例。 托管代碼也能調用非托管代碼 [DllImport("kernel32.d
effective c++學習筆記
c++ effective 編程技術 --------------------1讓自己習慣c++-----------------------------------------Rule 1 : 把c++看做一個語言聯邦,共有4個次語言:c(區塊、語句、預處理器、內置數據類型、數組、指針);面向對