Vb.net Как я могу скрыть эту переменную от остальной части класса? - PullRequest
1 голос
/ 22 мая 2009
Public Class frmMain
    Private p_dlgAdd As frmAdd = Nothing
    Public ReadOnly Property _dlgAdd As frmAdd
        Get
            If p_dlgAdd Is Nothing Then
                p_dlgAdd = New frmAdd()
            End If
            Return p_dlgAdd
        End Get
    End Property

    Public Sub DoStuff()
       ''// Should not touch p_dlgAdd
    End Sub
End Class

Для нескольких типов объектов я бы предпочел инициализировать их только при необходимости (соединение sql, соединения с мэйнфреймами, большие формы), потому что некоторые пользователи используют только очень специфичные части программы (менеджеры могут использовать один мэйнфрейм для выполнения своих задач. хочу, обычные пользователи в первую очередь используют другой ресурс).

Почему р_? Я думаю, что использование p_ поможет мне не использовать или легко найти в intellisense переменную вместо свойства локально в этом классе. Затем используется _ один перед частными свойствами или частными переменными, которые не требуют локального доступа со стороны свойства.

Как можно предотвратить случайный доступ к p_dlgAdd напрямую? Это хорошее использование для анонимных переменных в 2008 году? (У меня еще нет 2008 года на работе, но они думают, что он скоро будет у нас)

Ответы [ 4 ]

2 голосов
/ 02 июня 2009

Вы можете использовать EditorBrowseableAttribute , чтобы скрыть члена класса от Intellisense.

<EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Private p_dlgAdd As frmAdd = Nothing

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

0 голосов
/ 05 августа 2011

Это то, для чего Статический .

Public Class frmMain
    Public ReadOnly Property _dlgAdd As frmAdd
        Get
            Static dlgAdd As frmAdd = Nothing
            If dlgAdd Is Nothing Then
                dlgAdd = New frmAdd()
            End If
            Return dlgAdd
        End Get
    End Property

    Public Sub DoStuff()
       ' cannot touch dlgAdd
    End Sub
End Class

https://msdn.microsoft.com/en-us/library/z2cty7t8.aspx

0 голосов
/ 22 мая 2009

То, что вы всегда МОЖЕТЕ сделать (но в вашем случае это может быть перебором), будет следующим:

public class Base
{
    private frmAdd p_dlgAdd = null;
    protected frmAdd _dlgAdd 
    {
        get
        {
            if(p_dlgAdd == null)
                p_dlgAdd = new frmAdd();
            return p_dlgAdd;
        }
    }
}

Таким образом, ваш «p_dlgAdd» не будет доступен и _dlgAdd только в производном классе. Но это работает, только если вы можете определить / изменить базовый тип.

0 голосов
/ 22 мая 2009

Честно говоря, я не знаком с анонимными переменными. С учетом сказанного, на самом деле я не знаю механизма, который бы помешал вам писать код для доступа к закрытой переменной из того же класса. Просто обратите внимание на ваш код. Если вы хотите поместить какой-то префикс в переменную, чтобы напомнить себе, это приемлемо.

...