水如烟

                 顺其自然,水到渠成 LzmTW

文或代码皆是面向初学者.我是爱好者,也是初学者.那些"文章",只按自己理解写,我是不知术语名词的.所以只供参考,也仅供参考.

导航

认识一下Attribute

Posted on 2007-02-05 20:27  水如烟(LzmTW)  阅读(453)  评论(0编辑  收藏  举报

Author:水如烟

1、CustomAttribute何时实例化?仅当查询时。

Public Class Author
    
Private gUser As String
    
Private gCanRead As Boolean
    
Public Property CanRead() As Boolean
        
Get
            
Return gCanRead
        
End Get
        
Set(ByVal value As Boolean)
            gCanRead 
= value
        
End Set
    
End Property

    
Public Property User() As String
        
Get
            
Return gUser
        
End Get
        
Set(ByVal value As String)
            gUser 
= value
        
End Set
    
End Property
End Class

Public Module EnvironmentVars
    
Public CurrentUser As New Author
End Module

<AttributeUsage(AttributeTargets.Method)> _
Public Class ReadPermissionAttribute
    
Inherits Attribute
    
Sub New()
        Console.WriteLine(
"Attribute .ctor AT {0}", Now)

        
If EnvironmentVars.CurrentUser.CanRead Then
            Console.WriteLine(
"Please!")
        
Else
            Console.WriteLine(
"Sorry!")
            
Throw New Exception("Sorry!")
        
End If
    
End Sub

    
Protected Overrides Sub Finalize()
        Console.WriteLine(
"Attribute Finalize AT {0}", Now)
    
End Sub
End Class

Public Class ReadInformations

    
Private Function GetDriversCount() As Integer
        
Dim mCount As Integer = IO.DriveInfo.GetDrives.Length
        
Return mCount
    
End Function

    
<ReadPermission()> _
    
Public Function GetDriversLenth() As Integer
        
Return GetDriversCount()
    
End Function

End Class


Public Class Programs
    
<MTAThread()> _
    
Public Shared Sub Main()
        Run()
    
End Sub

    
Private Shared Sub Run()
        EnvironmentVars.CurrentUser.User 
= "LzmTW"
        
Dim Read As New ReadInformations
        
Dim mCount As Integer = Nothing


        EnvironmentVars.CurrentUser.CanRead 
= True
        
Try
            mCount 
= Read.GetDriversLenth
        
Catch ex As Exception
        
End Try
        Console.WriteLine(
"Read Drivers: {0}", mCount)

        EnvironmentVars.CurrentUser.CanRead 
= False
        mCount 
= Nothing
        
Try
            mCount 
= Read.GetDriversLenth
        
Catch ex As Exception
        
End Try
        Console.WriteLine(
"Read Drivers: {0}", mCount)

        Console.ReadLine()
    
End Sub
End Class

结果是:

Read Drivers: 7
Read Drivers: 7

    <ReadPermission()> _
    
Public Function GetDriversLenth() As Integer
        
Return GetDriversCount()
    
End Function

改为

 

    <ReadPermission()> _
    
Public Function GetDriversLenth() As Integer
        Reflection.MethodBase.GetCurrentMethod.GetCustomAttributes(
False)
        
Return GetDriversCount()
    
End Function

结果是:

Attribute .ctor AT 2007-2-5 17:48:16
Please!
Read Drivers: 7
Attribute .ctor AT 2007-2-5 17:48:16
Sorry!
Read Drivers: 0

2、CustomAttribute实例何时释放?仅当GC回收时。

    Private Shared Sub Run()
       
'...

        GC.Collect()
        Console.ReadLine()
    
End Sub

结果是:

Attribute .ctor AT 2007-2-5 17:53:41
Please!
Read Drivers: 7
Attribute .ctor AT 2007-2-5 17:53:42
Sorry!
Read Drivers: 0
Attribute Finalize AT 2007-2-5 17:53:42
Attribute Finalize AT 2007-2-5 17:53:42

3、引入CodeAccessSecurityAttribute呢?效果又不一样。简单的:

Imports System.Security
Imports System.Security.Permissions

Public Class Author
    
Private gUser As String
    
Private gCanRead As Boolean
    
Public Property CanRead() As Boolean
        
Get
            
Return gCanRead
        
End Get
        
Set(ByVal value As Boolean)
            gCanRead 
= value
        
End Set
    
End Property

    
Public Property User() As String
        
Get
            
Return gUser
        
End Get
        
Set(ByVal value As String)
            gUser 
= value
        
End Set
    
End Property
End Class

Public Module EnvironmentVars
    
Public CurrentUser As New Author
End Module

<AttributeUsage(AttributeTargets.Method)> _
Public Class ReadPermissionAttribute
    
Inherits CodeAccessSecurityAttribute

    
Public Sub New(ByVal action As SecurityAction)
        
MyBase.New(action)
    
End Sub

    
Public Overrides Function CreatePermission() As System.Security.IPermission
        
If Not EnvironmentVars.CurrentUser.CanRead Then
            
Throw New Exception
        
End If
        
Return Nothing
    
End Function
End Class


Public Class ReadInformations

    
Private Function GetDriversCount() As Integer
        
Dim mCount As Integer = IO.DriveInfo.GetDrives.Length
        
Return mCount
    
End Function

    
<ReadPermissionAttribute(SecurityAction.Deny)> _
    
Public Function GetDriversLenth() As Integer
        
Return GetDriversCount()
    
End Function

End Class


Public Class Programs
    
<MTAThread()> _
    
Public Shared Sub Main()
        Run()
    
End Sub

    
Private Shared Sub Run()
        EnvironmentVars.CurrentUser.User 
= "LzmTW"
        
Dim Read As New ReadInformations
        
Dim mCount As Integer


        EnvironmentVars.CurrentUser.CanRead 
= True
        mCount 
= Nothing
        
Try
            mCount 
= Read.GetDriversLenth
        
Catch ex As Exception
        
Finally
            Console.WriteLine(
"Read Drivers: {0}", mCount)
        
End Try


        EnvironmentVars.CurrentUser.CanRead 
= False
        mCount 
= Nothing
        
Try
            mCount 
= Read.GetDriversLenth
        
Catch ex As Exception
        
Finally
            Console.WriteLine(
"Read Drivers: {0}", mCount)
        
End Try

        Console.ReadLine()
    
End Sub
End Class

结果:

Read Drivers: 7
Read Drivers: 0