Salah satu fitur baru dari Visual Basic 11 yaitu Caller Info atribut. Fitur tersebut berguna untuk melakukan tracing, diagnostic atau debugging. Dengan menggunakan atribut tersebut maka kode program yang memanggil sebuah method dapat diketahui source file yang memanggil method, nomor baris kode yang memanggil method dan nama member yang memanggil method. Implementasi caller info atribut digunakan sebagai optional input parameter pada method yang akan di trace atau di diagnosa.
Beberapa atribut tersebut yaitu :
- CallerFilePathAttribute : Digunakan untuk mengetahui source file yang memanggil method.
- CallerLineNumberAttribute : Digunakan untuk mengetahui nomor baris kode yang memanggil method.
- CallerMemberNameAttribute : Digunakan untuk mengetahui nama member yang memanggil method.
Karena atribut tersebut digunakan sebagai optional input parameter maka aturan penggunaannya juga mengikuti syarat-syarat penggunaan optional parameter pada sebuah method yaitu : Nilai default value harus di definisikan, optional input parameter harus ditempatkan di akhir setelah non optional input parameter. Apabila optional input parameter tersebut tidak diisi pada saat method dipanggil maka nilai yang dihasilkan oleh atribut tersebut akan diisi secara otomatis sesuai dengan source nya. Namun tentunya kita dapat mengisi optional parameter tersebut dengan nilai yang sudah ditentukan pada saat kode program ditulis. Atribut CallerLineNumber akan menghasilkan nilai integer, sedangkan untuk kedua atribut lainnya menghasilkan nilai string.
Output yang dihasilkan oleh atribut CallerMemberName berbeda dengan kedua atribut lainnya. Apabila member yang memanggil method berupa Sub, Function, atau Event maka nilai yang dihasilkan yaitu nama Sub, Function atau Event tersebut. Pemanggilan dari constructor akan menghasilkan nilai “.ctor” dan “.cctor” untuk static atau shared constructor. Sedangkan pemanggilan dari sebuah operator overloading akan menghasilkan nilai “op_Addition”. Untuk menggunakan atribut-atribut tersebut harus dilakukan Imports terlebih dahulu ke namespace System.Runtime.CompilerServices.
Berikut adalah contoh kode program yang digunakan untuk memperlihatkan penggunaan dari ketiga atribut diatas. Pada contoh ini atribut Caller Info di implementasikan pada sebuah Sub dan yang memanggil Sub tersebut dibuat beragam mulai dari Sub, Property, Constructor, Shared Constructor dan Operator Overloading.
Imports System.Runtime.CompilerServices
Public Class NewCallerInfoSample
Private Shared ReadOnly StaticCreatedTime As DateTime
Shared Sub New()
StaticCreatedTime = Now.ToLongTimeString
TestSharedMethod(String.Format("Called from static constructor at : {0}",
StaticCreatedTime.ToLongTimeString))
End Sub
Public Sub New()
TestMethod("Called from constructor")
End Sub
Public Sub TestMethodCaller()
TestMethod("Called from method (Sub).")
End Sub
Private strMessage As String
Public Property MessageInfo As String
Get
Return strMessage
End Get
Set(value As String)
strMessage = value
TestMethod("Called from Property.")
End Set
End Property
Public Shared Operator +(ByVal Class1 As NewCallerInfoSample,
ByVal Class2 As NewCallerInfoSample) As String
TestSharedMethod("Called from Operator Overloading.")
Return Class1.MessageInfo & Class2.MessageInfo
End Operator
Private Shared Sub TestSharedMethod(Info As String,
<CallerFilePath> Optional SourceFile As String = Nothing,
<CallerLineNumber> Optional SourceLineNumber As Integer = 0,
<CallerMemberName> Optional SourceCallerMember As String = Nothing)
Console.WriteLine("TestSharedMethod Called from :")
Console.ForegroundColor = ConsoleColor.Yellow
Console.WriteLine(String.Format("Info : {0}", Info))
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine(String.Format("Source File : {0}", SourceFile))
Console.WriteLine(String.Format("Source Line Number : {0}", SourceLineNumber))
Console.ForegroundColor = ConsoleColor.Yellow
Console.WriteLine(String.Format("Source Caller Member : {0}", SourceCallerMember))
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine(New String(CChar("="), 50))
End Sub
Private Sub TestMethod(Info As String,
<CallerFilePath> Optional SourceFile As String = Nothing,
<CallerLineNumber> Optional SourceLineNumber As Integer = 0,
<CallerMemberName> Optional SourceCallerMember As String = Nothing)
Console.WriteLine("TestMethod Called from :")
Console.ForegroundColor = ConsoleColor.Yellow
Console.WriteLine(String.Format("Info : {0}", Info))
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine(String.Format("Source File : {0}", SourceFile))
Console.WriteLine(String.Format("Source Line Number : {0}", SourceLineNumber))
Console.ForegroundColor = ConsoleColor.Yellow
Console.WriteLine(String.Format("Source Caller Member : {0}", SourceCallerMember))
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine(New String(CChar("="), 50))
End Sub
End Class
Class tersebut dipanggil dari sebuah Console Application dengan kode berikut ini :
Module Module1
Sub Main()
Dim objCallerInfo1 As New NewCallerInfoSample
objCallerInfo1.TestMethodCaller()
Dim objCallerInfo2 As New NewCallerInfoSample With
{.MessageInfo = "Hello from object-1. "}
Dim objCallerInfo3 As New NewCallerInfoSample With
{.MessageInfo = "Hello from object-2. "}
Dim objCallerInfo4 = objCallerInfo2 + objCallerInfo3
Console.Read()
End Sub
End Module
Hasil eksekusi kode program tersebut akan menghasilkan ouput berikut ini :

Perhatikan output dari CallerMemberName atribut yang dipanggil dari constructor, shared constructor dan operator overloading. Output tersebut berbeda dengan hasil dari pemanggilan method dan property.