C# 特性(Attribute)學習

特性(attribute)是被指定給某壹聲明的壹則附加的聲明性信息。
    在C#中,有壹個小的預定義特性集合。在學習如何建立我們自己的定制特性(custom attributes)之前,我們先來看看在我們的代碼中如何使用預定義特性。
    using System;
    public class AnyClass
    {
    [Obsolete(”Don’t use Old method, use New method”, true)]
    static void Old( ) { }
    static void New( ) { }
    public static void Main( )
    {
    Old( );
    }
    }
    我們先來看壹下上面這個例子,在這個例子中我們使用了Obsolete特性,它標記了壹個不應該再被使用的程序實體。第壹個參數是壹個字符串,它解釋了為什麽該實體是過時的以及應該用什麽實體來代替它。實際上,妳可以在這裏寫任何文本。第二個參數告訴編譯器應該把使用這個過時的程序實體當作壹種錯誤。它的默認值是false,也就是說編譯器對此會產生壹個警告。
    當我們嘗試編譯上面這段程序的時候,我們將會得到壹個錯誤:
    AnyClass.Old()’ is obsolete: ‘Don’t use Old method, use New method’
    開發定制特性(custom attributes)
    現在讓我們來看看如何開發我們自己的特性。
    首先我們要從System.Attribute派生出我們自己的特性類(壹個從System.Attribute抽象類繼承而來的類,不管是直接還是間接繼承,都會成為壹個特性類。特性類的聲明定義了壹種可以被放置在聲明之上新的特性)。
    using System;
    public class HelpAttribute : Attribute
    {
    }
    不管妳是否相信,我們已經建立了壹個定制特性,現在我們可以用它來裝飾現有的類就好像上面我們使用Obsolete attribute壹樣。
    [Help()]
    public class AnyClass
    {
    }
    註意:對壹個特性類名使用Attribute後綴是壹個慣例。然而,當我們把特性添加到壹個程序實體,是否包括Attribute後綴是我們的自由。編譯器會首先在System.Attribute的派生類中查找被添加的特性類。如果沒有找到,那麽編譯器會添加Attribute後綴繼續查找。
    到目前為止,這個特性還沒有起到什麽作用。下面我們來添加些東西給它使它更有用些。
    using System;
    public class HelpAttribute : Attribute
    {
    public HelpAttribute(String Descrition_in)
    {
    this.description = Description_in;
    }
    protected String description;
    public String Description
    {
    get
    {
    return this.description;
    }
    }
    }
    [Help(”this is a do-nothing class”)]
    public class AnyClass
    {
    }
    在上面的例子中,我們給HelpAttribute特性類添加了壹個屬性並且在後續的部分中我們會在運行時環境中查尋它。
    定義或控制特性的使用
    AttributeUsage類是另外壹個預定義特性類,它幫助我們控制我們自己的定制特性的使用。它描述了壹個定制特性如和被使用。
    AttributeUsage有三個屬性,我們可以把它放置在定制屬性前面。第壹個屬性是:
    ValidOn
    通過這個屬性,我們能夠定義定制特性應該在何種程序實體前放置。壹個屬性可以被放置的所有程序實體在AttributeTargets enumerator中列出。通過OR操作我們可以把若幹個AttributeTargets值組合起來。
    AllowMultiple
    這個屬性標記了我們的定制特性能否被重復放置在同壹個程序實體前多次。
    Inherited
    我們可以使用這個屬性來控制定制特性的繼承規則。它標記了我們的特性能否被繼承。
    下面讓我們來做壹些實際的東西。我們將會在剛才的Help特性前放置AttributeUsage特性以期待在它的幫助下控制Help特性的使用。
    using System;
    [AttributeUsage(AttributeTargets.Class), AllowMultiple = false,
    Inherited = false ]
    public class HelpAttribute : Attribute
    {
    public HelpAttribute(String Description_in)
    {
    this.description = Description_in;
    }
    protected String description;
    public String Description
    {
    get
    {
    return this.description;
    }
    }
    }
    先讓我們來看壹下AttributeTargets.Class。它規定了Help特性只能被放在class的前面。這也就意味著下面的代碼將會產生錯誤:
    [Help(”this is a do-nothing class”)]
    public class AnyClass
    {
    [Help(”this is a do-nothing method”)] //error
    public void AnyMethod()
    {
    }
    }
    編譯器報告錯誤如下:
    AnyClass.cs: Attribute ‘Help’ is not valid on this declaration type.
    It is valid on ‘class’ declarations only.
    我們可以使用AttributeTargets.All來允許Help特性被放置在任何程序實體前。可能的值是:
    Assembly,Module,Class,Struct,Enum,Constructor,Method,Property,Field,Event,Interface,
    Parameter,Delegate。
    All = Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate,
    ClassMembers = Class | Struct | Enum | Constructor | Method | Property | Field | Event | Delegate | Interface )
    下面考慮壹下AllowMultiple = false。它規定了特性不能被重復放置多次。
    [Help(”this is a do-nothing class”)]
    [Help(”it contains a do-nothing method”)]
    public class AnyClass
    {
    [Help(”this is a do-nothing method”)] //error
    public void AnyMethod()
    {
    }
    }
    它產生了壹個編譯期錯誤。
    AnyClass.cs: Duplicate ‘Help’ attribute
    Ok,現在我們來討論壹下最後的這個屬性。Inherited, 表明當特性被放置在壹個基類上時,它能否被派生類所繼承。
    [Help(”BaseClass”)]
    public class Base
    {
    }
    public class Derive : Base
    {
    }
    這裏會有四種可能的組合:
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ]
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ]
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ]
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ]
    第壹種情況:
    如果我們查詢(Query)(稍後我們會看到如何在運行期查詢壹個類的特性)Derive類,我們將會發現Help特性並不存在,因為inherited屬性被設置為false。
    第二種情況:
    和第壹種情況相同,因為inherited也被設置為false。
    第三種情況:
    為了解釋第三種和第四種情況,我們先來給派生類添加點代碼:
    [Help(”BaseClass”)]
    public class Base
    {
    }
    [Help(”DeriveClass”)]
    public class Derive : Base
    {
    }
    現在我們來查詢壹下Help特性,我們只能得到派生類的屬性,因為inherited被設置為true,但是AllowMultiple卻被設置為false。因此基類的Help特性被派生類Help特性覆蓋了。
    第四種情況:
    在這裏,我們將會發現派生類既有基類的Help特性,也有自己的Help特性,因為AllowMultiple被設置為true。
    定義或控制特性的使用
    AttributeUsage類是另外壹個預定義特性類,它幫助我們控制我們自己的定制特性的使用。它描述了壹個定制特性如和被使用。
    AttributeUsage有三個屬性,我們可以把它放置在定制屬性前面。第壹個屬性是:
    ValidOn
    通過這個屬性,我們能夠定義定制特性應該在何種程序實體前放置。壹個屬性可以被放置的所有程序實體在AttributeTargets enumerator中列出。通過OR操作我們可以把若幹個AttributeTargets值組合起來。
    AllowMultiple
    這個屬性標記了我們的定制特性能否被重復放置在同壹個程序實體前多次。
    Inherited

Killtest NS0-502 Exam

NS0-502 Questions and Answers prepared by Killtest help candidates to have a clear picture regarding the examination pattern and get prepared. Available in PDF format these NS0-502 questions, with answers, make your preparation precise and comprehensive. Complicated problems related to NS0-502 exam are made lucid with the explanations by industry experts. Unique features of our NS0-502 PDF are:

We also provide DEMO download

2. What would you use to share a data LUN among multiple servers where each server has simultaneous
write access?
A. host-based BootBIOS
B. host-based multipathing
C. host-based volume manager
D. host-based clustered file system
Answer: D 
7. Which utility on Solaris 10 can be used to collect information about firmware and driver versions for an Emulex LP1xxxx/LPe1xxxx HBA?
A. EMutil
B. SANutil
C. hbainfo
D. SANsurfer
E. HBAnywhere
Answer: E 
8. Which utility on Solaris 10 can be used to collect information about firmware and driver versions for a Qlogic QLAxxx/QLExxxx HBA?
A. EMutil
B. SANutil
C. cfgadmin
D. SANsurfer
E. HBAnywhere
Answer: D

解決Cisco路由器嚴重丟包現象

部門(下稱部門A)中有人反映不能訪問上級部門(部門B)的網絡。我從該人所用的計算機A1(IP地址為10.20.12.11/24)上用ping命令向部門B網絡中的計算機B1(IP地址為10.20.30.110/24)和B2(IP地址為10.20.30.111/ 24)發送測試數據包,丟包率達100%,ping本部門的其它計算機則顯示連接正常。檢查其計算機IP設置,發現網關設置正確(正確網關為10.20.12.1),於是懷疑路由器不能正常工作。用本辦公室計算機A2、A3測試,發現以下奇怪現象:

(1)在計算機A2(IP為10.20.12.12/24)上用ping命令分別ping部門B網絡中計算機B1和B2,發現B1有正常回應,B2的回應率在20%~50%之間;在計算機A3(IP為10.20.12.13/24)中用ping命令分別ping計算機B1和B2,回應顯示連接正常,丟包率為0。

(2)將計算機A3的IP地址改為10.20.12.12/24後測試,ping得的結果同(1)中的計算機A2測試情況。

(3)將計算機A2的IP地址改為尚未使用過的IP地址:10.20.12.22/24,測試與B1和B2的連接,結果顯示正常,丟包率為0。

(4)將計算機A1的IP地址改為尚未使用過的IP地址:10.20.12.23/24,測試與B1和B2的連接,結果顯示正常,丟包率為0。

故障分析

考慮到網絡連通情況與本機IP地址有關,參考本單位網絡拓撲結構圖,於是懷疑可能是由於部門B網絡的防火牆設置引發該故障。由於部門B與本部門分別位於城市中兩個不同地方,不方便查看其防火牆設置,於是打電話詢問。但該部門網絡管理員告之其防火牆是針對網絡IP段設置的,也就是說,該防火牆對於部門A的整個網絡IP段都是允許訪問的。

分析以上原因,可能是本部門中某些計算機向部門B網絡發送過非法訪問信息,部門B的防火牆自動將該IP列入侵計算機名單,屏蔽了其發送的IP數據包,從而引發網絡連接不正常的現象。調查本部門中所有計算機,將不能正常訪問外部網絡(部門B網絡)的計算機的IP更換為新的IP地址,問題暫時解決。
但一個星期後,網絡又出現故障,有幾個原來能正常訪問部門B計算機出現丟包現象,而有幾個原來不能正常訪問外部網絡的IP地址卻可以正常訪問外部網絡,看來問題可能不在防火牆上。

在計算機上A2(IP地址為10.20.12.12/24)用Tracert命令跟踪測試,現像如下:

c:\>Tracert 10.20.30.110

Tracing route to 10.20.30.110 over a maximum of 30 hops

1 <1 ms <1 ms <1 ms 10.20.12.1

2 1 ms <1 ms 1 ms 192.168.10.2

3 1 ms 1 ms 1 ms 10.20.30.1

4 2 ms 1 ms 2 ms 10.20.30.110

Trace complete

將計算機上A2的IP地址改為10.20.12.22/24,用Tracert命令跟踪測試,現像如下:

Tracing route to 10.20.30.110 over a maximum of 30 hops

1 <1 ms <1 ms <1 ms 10.20.12.1

2 1 ms * * 192.168.10.2

3 * 2 ms * 10.20.30.1

4 * * * Request timed out

5 * * * Request timed out

6 * * 2 ms 10.20.30.110

Trace complete

Trace complete

有時用Tracert跟踪測試得到4、5行及以後顯示的都是Request timed out。

回顧近期網絡結構變動情況,原來本部門中網關的位置用的是一個三層交換機(只使用其路由功能),當時內網能正常訪問外部網絡,在一星期前換為Cisco 3640路由器,將按三層交換機中的配置重新配置3640路由器,換後不久就出現以上網絡故障。檢查Cisco 3640的端口配置和路由配置,發現端口IP地址配置正常,而在路由列表中有兩條路由:

ip route 0.0.0.0 0.0.0.0 192.168.10.2

ip route 0.0.0.0 0.0.0.0 10.20.12.254

因本部門網絡是單位廣域網中最下層子網,根據業務需要訪問本單位整個廣域網,而本部門網絡只通過一台Cisco 3640路由器Router A接入部門B網絡中,再通過部門B的路由器Router B接入單位廣域網(見前面網絡拓樸圖)。為方便設置,我們只需要在Cisco 3640加入一條缺省路由“ip route 0.0.0.0 0.0.0.0 192.168.10.2”就可以將本部門對外部網絡的的訪問都轉發到部門B的路由器Router B,從而實現網絡的互聯。可能由於設置人員的失誤,在路由表中多加了一條並不存在的下一跳節點“ip route 0.0.0.0 0.0.0.0 10.20.12.254”。以致當內網中的計算機訪問外部網絡時,路由器有時不能將IP數據包正確地發送到192.168.10.2中,由於路由器加電工作後,內存中保存了內網對外網的訪問路由列表,使得一些計算機一直能正常訪問外網,而另一些計算機不能正常訪問,當路由器重新啟動(如第二個星期一早上重啟路由器)後,訪問路由列表重新建立,使得內部計算機訪問外網的現象發現變化。

故障排除

在路由器特權模式下刪除無用的路由列表:

# no ip route 0.0.0.0 0.0.0.0 10.20.12.254

#wr

重啟路由器後,本部門所有計算機都能正常訪問部門B的網絡及單位廣域網,故障得到徹底解決。

指的是路由器或者其他互聯網網絡設備上存儲的表,該表中存有到達特定網絡終端的路徑,在某些情況下,還有一些與這些路徑相關的度量。

路由表的一般形式為:

Destination Gateway Flag Refs Use Inerface

其中,Destination目標網絡或主機的IP地址;Gateway到達指定目地的使用網關;Flag標誌字段,描述這一路由的一些特性;Refcnt表示為了建一次連接,該路由使用的次數;Use表示通過該路由傳輸的分組報文數;Interface表示該路由使用的網絡接口名。

一個典型的路由表的例子

Destination Gateway Flags Refs Use Interface

default 26.112.191.98 UGS 0 0 net0

default 26.112.191.98 UGS 0 18 net0

26.112.191 26.112.191.2 UC 1 0 net0

26.112.191.2 127.0.0.1 UGHS 3 92 lo0

127.0.0.1 127.0.0.1 UH 3 9786480 lo0

224 26.112.191.2 UCS 0 0 net0