Как использовать частные объявления в общей функции в классе?

Я пытаюсь использовать объявленную в частном порядке переменную/объект внутри класса из общей функции в том же классе.

Моя главная цель - иметь доступ к общей функции вне класса, но не к переменным, поскольку они являются частными. Я не думаю, что установка всех объявлений переменных/объектов как «общих» была бы элегантным решением.

Вот фрагмент для лучшего изучения:

Module main
    Sub Main()
        MsgBox(xTest.xMain)
    End Sub
End Module

Class xTest
    Private WC As New Net.WebClient()
    Shared Function xMain() As String
        Return WC.DownloadString("http://example.com")
    End Function
End Class

Как бы я это сделал, правильно, конечно.


person Josh Line    schedule 04.12.2012    source источник


Ответы (2)


Я подозреваю, что вы не понимаете значения Shared. Это ортогонально Private/Public/и т. д.

Shared означает "относится к типу, а не к любому экземпляру типа". Ваша функция Shared не может использовать WC, поскольку у нее нет экземпляра xTest, для которого можно найти конкретную переменную WC. Представьте, что вместо этого это была переменная name — это все равно, что спросить класс Person «Как тебя зовут?» когда вместо этого у каждого отдельного Person экземпляра есть имя.

Вы должны тщательно продумать каждый член (будь то функция или переменная), является ли он логически Shared или нет.

Дополнительные сведения см. на странице MSDN, посвященной общим участникам. использованное там описание. "... общий для всех экземпляров класса..." звучит так, будто в первую очередь должен быть экземпляр. Нет - просто член связан с самим типом. Общая переменная может использоваться, даже если экземпляры класса никогда не создавались.

(Кроме того, я, вероятно, не стал бы держать WebClient в качестве поля в первую очередь. WebClient предназначено для создания, использования, а затем отбрасывания. Я также предлагаю изменить ваши имена, чтобы они соответствовали соглашениям об именах .NET. )

person Jon Skeet    schedule 04.12.2012
comment
Спасибо, я понял это после вашего ответа. - person Josh Line; 04.12.2012

Переменная должна быть общей, чтобы быть доступной из общей функции. Кстати, с тем, что вы пытаетесь сделать, я думаю, что общий метод не рекомендуется.

person Dale M    schedule 04.12.2012
comment
Что бы вы посоветовали. Пожалуйста, дополните. Спасибо. - person Josh Line; 04.12.2012