Como eu já suspeitava, as classes My (disponíveis na versão 2005 do Visual Basic .NET), que são responsáveis por criar uma espécie de atalho para recursos utilizados com muita frequencia e evitar a escrita de “muito” código para uma determinada funcionalidade, na verdade apenas encapsulam códigos que já são de nosso conhecimento, como por exemplo o método ReadAllText da classe FileSystemProxy (que é na verdade um proxy para a classe FileSystem do Namespace System.IO). Para ler o conteúdo de um arquivo qualquer, podemos agora fazer simplesmente:
Dim s As String = My.Computer.FileSystem.ReadAllText(“TextFile1.txt”)
Quando compilamos o projeto VB.NET, ele embute um Namespace chamado TeuProjeto.My, onde dentro dele, é criado classes do tipo Friend, que são vistas somente dentro daquele Assembly e uma delas chama-se MyProject. Dentro desta classe, voce terá objetos estáticos que representam os teus recursos, como por exemplo: MyApplication, MyComputer, MyForms, etc. O código é semelhante à este:
Public Shared ReadOnly Property Application As MyApplication
Public Shared ReadOnly Property Computer As MyComputer
Public Shared ReadOnly Property Forms As MyForms
Public Shared ReadOnly Property WebServices As MyWebServices
Onde para cada um desses objetos, existem também um objeto estático Read-Only, que é uma classe genérica do tipo ThreadSafeObjectProvider, que recebe qualquer um dos objetos (por isso é genérica) acima e tem a finalidade de recuperar ou criar a instância do objeto que lhe é passada:
Private Shared ReadOnly m_AppObjectProvider As ThreadSafeObjectProvider(Of MyApplication)
Private Shared ReadOnly m_ComputerObjectProvider As ThreadSafeObjectProvider(Of MyComputer)
Private Shared m_MyFormsObjectProvider As ThreadSafeObjectProvider(Of MyForms)
Private Shared ReadOnly m_MyWebServicesObjectProvider As ThreadSafeObjectProvider(Of MyWebServices)
Dentro da classe Friend MyProject, temos uma propriedade estática Read-Only para cada um de nossos recursos, que chamam a propriedade GetInstance (e se não estou enganado, usa-se a pattern Singleton para ter apenas uma única instância deste objeto) do ThreadSafeObjectProvider para o objeto em questão, no nosso caso, do MyComputer.
Public Shared ReadOnly Property Computer As MyComputer
Get
Return MyProject.m_ComputerObjectProvider.GetInstance
End Get
End Property
Depois da instância do objeto que queremos foi recuperada (ou criada), voltamos um pouco, ao nosso método ReadAllText da classe FileSystem, e se visualizarmos o código deste método, teremos algo bem familiar:
Public Shared Function ReadAllText(ByVal file As String, ByVal encoding As Encoding) As String
Dim text1 As String
Dim reader1 As StreamReader = Nothing
Try
reader1 = New StreamReader(file, encoding, True)
text1 = reader1.ReadToEnd
Finally
If (Not reader1 Is Nothing) Then
reader1.Close
End If
End Try
Return text1
End Function
Só não consigo entender, porque um recurso tão interessante como este, não poderia também ser incorporado no C#. Talvez porque os C# developers são “gurus” demais, e ao invés de utilizar o My, criam um wrapper próprio. 😛
Update:
Há sim agora uma opção para as classes My no C#. Eis aqui a explicação.