何时使用共享变量

时间:2014-08-04 13:07:18

标签: asp.net .net asp.net-mvc vb.net oop

我已经构建了一个使用vb.net在列表中多次实例化的类。我希望在我班级的所有实例中保留一个ID。这是一个问题清单,所有问题都有一个问卷ID。所以我可以在为列表中的每个问题分配id时执行此操作。理想情况下,我只想分配一次ID,并在所有列表对象中使用它。

所以这是我的一个类的共享成员以及accessibilty的属性过程。

 Public Class Questions
     Private Shared _questionnaireUID As Integer

    Public Shared Property QuestionnaireUID() As Integer
    Get
        Return _questionnaireUid
    End Get
    Set(ByVal value As Integer)
        _questionnaireUid = value
    End Set
    End Property
End Class

我开始使用vb.net共享类级变量并通过属性过程分配。这似乎是正确的方法,虽然现在我构建了它,但我可以看到共享变量可以在整个应用程序中访问。

就像实例化和赋值一样。

    Questions.QuestionnaireUID = CInt(questionnaireUID)

我甚至不需要实例化该类。所以我现在只有一个全局变量。为了解决这个问题,我会使用类级变量而不是。我想知道是否还有另一种方法可以让变量在类中共享,并且它是实例化的对象,而无需分配给每个对象,也不会使整个应用程序都可用。有没有我缺少的一步。

感谢您的任何建议。

3 个答案:

答案 0 :(得分:5)

我是C#,但这不是我怎么做的。 有问卷的课程

public class Questionnaire
{
   public Int ID { get; private set; }
   public List<Question> Questions  { get; set; }
}

答案 1 :(得分:0)

如果您想在整个应用程序中共享某些内容,我认为共享(静态)非常有用。 如果我理解你的话,你确实有一个班级,并希望分享一个ID,但这个ID对整个应用程序来说并不重要,但仅适用于调查问卷(问题列表)。为此,使用共享是不好的,因为一旦你完成,你将不得不负责清理这个值。

我的问题是,为什么每次有新问题时都会实例化问题列表?为什么不把问题列表作为单身人士?

答案 2 :(得分:0)

仅仅因为私有字段是Shared,这并不意味着访问它的属性也必须是Shared。例如,你可以这样做:

Public Class Questions
    Private Shared _questionnaireUID As Integer

    Public Property QuestionnaireUID() As Integer  ' Note, this is not Shared
        Get
            Return _questionnaireUid
        End Get
        Set(ByVal value As Integer)
            _questionnaireUid = value
        End Set
    End Property
End Class

当您这样做时,所有Questions对象将始终共享该属性的相同值,但该值将无法通过类访问(不实例化对象)。

然而,值得指出的是,虽然就范围而言,它确实将价值封装得更好,但它仍然是全球状态。它并没有真正避免因全局变量引起的大多数问题。与任何其他类型的全局状态一样,该类的对象仍将以潜在的不可预测的方式运行。它还使得Questions个对象不能同时处理两个不同的ID。

作为替代方案,您可能需要考虑在Questions类'构造函数中注入ID。如果在每次创建它时传递它太痛苦了,你可以使工厂更容易,例如:

Public Class QuestionsFactory
    Public Sub New(questionnaireId As Integer)
        _questionnaireId = questionnaireId 
    End Sub

    Private _questionnaireId As Integer

    Public Function NewQuestions() As Questions
        Return New Questions(_questionnaireId)
    End Function
End Class