[譯]分辨差別 -- 第二部分: 作用域, 定義空間和 生存期
譯自Eric Lippert's Blog, 原文: http://blogs.msdn.com/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope-vs-declaration-space-vs-lifetime.aspx
在程式語言設計中,作用域(scope)通常是最容易混淆的概念。
人們似乎不經意間就使用這個概念,我經常看到它被當做生存期(lifetime)或定義空間(declaration space)使用,例如"當這個變數超出作用域時,對應的記憶體空間將被釋放"。當然在非正式場合,只要聽眾能清楚地理解你所指的意思,使用"作用域"來表示是完全可以接受的。但是在更正式的場合,比如書中或語言標準中,就需要更精確地使用這些概念。
C#中作用域和定義空間的區別是微妙的。
一個命名實體(entity)的作用域是原始碼中可以合法使用它的非限定名(unqualified name)來引用它的範圍。
這裡有些微妙的東西, 這個定義並沒有別的隱含的意思 -- 它並非表示如果你可以合法使用一個實體的非限定名,則通過這個非限定名就可以引用這個實體。因為作用域是允許重疊(overlap)的。例如,如果有以下程式碼:
class C
{
int x;
void M()
{
int x;
}
}
欄位x(field)的作用域是原始碼中類C(class)的整個定義部分,包括方法M(method)的整個定義;區域性變數x(local variable)的作用域是方法M的主體部分。所以這兩個實體的作用域有重疊的部分。當你在不同的位置使用非限定名"x",將得到不同的實體(欄位x或者區域性變數x)。
相反, 定義空間是一段其中不允許存在具有相同名稱實體的原始碼範圍。例如,在類C的定義部分,除了方法M的主體部分,不允許別的實體也命名為x。一旦定義了個欄位x, 就不能再定義別的稱為x的欄位,屬性(property), 內嵌型別(nested type)或事件(event)。
正因為有過載機制(overload), 使得方法有一點特殊。可以特別定義有方法的定義空間為"一個類中所有具有相同名稱的過載方法構成一個實體", 也可以重新定義定義空間為"定義空間中不允許存在具有相同名稱的實體, 除了具有不同簽名(signature)的方法"。
簡短地說,作用域解決了“在哪裡可以使用這個名稱”的問題;名稱空間解決了“這個名稱在哪裡是唯一的”的問題。
生存期和作用域經常在區域性變數上容易混淆,因為在區域性變數上這兩者關係太複雜了。扼要地講,就是隻要當前的執行點(point of execution)在區域性變數的作用域內,至少能保證它的內容可用。但也可能區域性變數的內容在超出它的作用域外也是可用的,比如捕獲變數(capture variable, variable capturing , 在匿名函式中使用外部變數 )將擴充套件這個變數的生存期。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-616444/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [譯]分辨差別 -- 第三部分: fixed 和 fixed
- [譯]分辨差別 -- 第一部分: 泛型不是模板泛型
- Python作用域和名稱空間Python
- python中分辨int和float的差別Python
- C和C++中的名字空間和作用域C++
- Python3 名稱空間和作用域Python
- Python名稱空間和作用域窺探Python
- 深入理解javascript作用域系列第二篇——詞法作用域和動態作用域JavaScript
- 方法的作用和定義
- define巨集定義和const常量定義之間的區別
- js 作用域和作用域鏈JS
- SpringMVC(3)-request域和session域的作用和區別SpringMVCSession
- python基礎 - python名稱空間與作用域Python
- js的作用域和作用域鏈JS
- Guru of the Week 條款23:物件的生存期(第二部分) (轉)物件
- 詞法作用域和動態作用域
- JS學習系列 01 - 編譯原理和作用域JS編譯原理
- 酒店房間和 C++ 區域性變數的作用域C++變數
- javascript資料型別和作用域介紹JavaScript資料型別
- window和nodejs作用域區別(待續)NodeJS
- .NET C#基礎(6):名稱空間 - 有名字的作用域C#
- 深入理解JavaScript作用域和作用域鏈JavaScript
- 【譯】使用 Room 定義物件間的關係OOM物件
- HTML元件(HTMLCOMPONENTS)之二定義標記和名稱空間(轉)HTML元件
- 容差組相關T-code和定義
- (譯)理解javascript中的作用域JavaScript
- C語言中識別符號的作用域、名稱空間、連結屬性、生命週期、儲存型別C語言符號型別
- EXPLAIN PLAN FOR 和 SET AUTOTRACE之間的差別AI
- 【譯】終極指南:變數提升、作用域和閉包變數
- 自定義值型別一定不要忘了重寫Equals,否則效能和空間雙雙堪憂型別
- Linux Shell 自定義函式(定義、返回值、變數作用域)介紹Linux函式變數
- javascript作用域和作用域鏈簡單介紹JavaScript
- 作用域、連結屬性和儲存型別型別
- 領域服務和應用服務的差別?
- JavaScript預編譯原理, 引擎,作用域JavaScript編譯原理
- C++ Gotchas 條款63:Member New和Member Delete之生存期與活動空間的迷惑 (轉)C++Godelete
- JavaScript 深入之詞法作用域和動態作用域JavaScript
- 從自定義一個作用域開始來了解SpringBean的作用域SpringBean