1. 程式人生 > >格物致知 《Effective C#》讀書筆記--驗證型別轉換

格物致知 《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

( ClassOne  co)

        {

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(區塊、語句、預處理器、內置數據類型、數組、指針);面向對