2011-11-13 63 views
1

我正在使用.Net使用VB,刚刚完成了一个网站项目,我正准备推出......但当我经历最后的清理/演练时,我注意到我目前已经使用过公共共享功能62次,公共共享次14次,以及一对公共共享属性。我应该使用Public Shared Sub和Public Shared功能吗?他们是否在用户之间共享数据?

这是一个我从未完全清楚的领域,并且想要正确优化我的代码。

我读过的很多文章似乎表明,公共共享只是让它更容易访问一个函数或子而不用先创建一个实例。

但是之后我读到的其他地方就是否在网站上的用户中共享这个内容。

这是我不确定/困惑的地方。如果2个用户同时打开并且他们都调用相同的公共共享函数或子项,是否可以交叉?

变量/属性的工作原理是否相同或不同?例如,如果我将用户对象存储为公共共享属性仅限于此用户,或者所有用户都可以访问它吗?

+0

请给出一些代码示例。你使用VB.NET的事实让一些读者感到困惑。 –

回答

4

如果你只能挑一个,那么重新运行就是对的。但有一个共同存在的理由,最好理解它,以便您可以适当地使用它。

比方说,你有一个函数返回数据库中的所有记录,那么放入共享类就可以。假设这个函数有一个参数让你指定一个你想返回的记录。在这种情况下,您仍然安全,因为每次调用该函数都会将另一个框架添加到堆栈并分别跟踪该框架的变量。

但是,如果您开始在函数中使用类成员变量,那么这就是您可能遇到麻烦的地方。假设您的类使用包含每页要显示的行数的成员变量。每次用户更改其偏好时,都会影响所有用户。

所以,我希望能为你解决一下。

编辑:休息你的问题......

考虑MessageBox类。正如你所知道的,你不需要创建它的一个实例来使用它的方法。如果对它的Show(string text)方法同时进行两个调用,则不必担心第二次调用会覆盖第一次传递的消息,因为每次调用该方法都会维护自己的一组变量。

然而,考虑下面的类:

public static class MyMessageBox 
{ 
    public static string Message { get; set; } 

    public static void Show() 
    { 
     MessageBox.Show(MyMessageBox.Message); 
    } 
} 

通知有关此类的几件事情: 1)显示具有通过对静态类MyMessageBox参考访问Message属性。它不能引用它作为'this.Message',因为没有实际的类实例,因此没有'this'这样的事情。

2)因为这是一个静态类,所有属性/字段必须声明为静态。但是,请不要误解您也可以使用静态变量和方法来创建非静态类。在功能上,使你的类成为静态并不会改变你的代码行为的方式,这只会导致编译器在你的类中执行某些规则。

制作静态方法允许您将其称为MyClass.SomeMethod()而不是instanceOfMyClass.SomeMethod()。这只是语法上的差异。实际上,所有的方法都是静态的(即没有方法代码的多个实例......它只在一个地方,它是实例化的变量)。除了语法上的差异之外,使静态方法还实施了一些规则,以防止引用任何非静态属性/字段,因为您没有从对象的实际实例调用它。

3)最重要的是,请注意,这将是一个可怕的方式来设计这个类。如果对课程进行两次调用,可能有一个人可能会将Message属性设置为“Hello”,然后其他人可能会在第一个人显示其消息之前将其设置为“World”。然后每个人调用Show()方法,你会得到两个说“世界”的消息框。

有时候需要这种设计,所以你必须使用多线程技术来使后续的调用者排队等待使用特定的资源。但对于这样简单的事情来说,这显然是荒谬的。

+0

感谢您的想法。它帮助我解决问题,并且正在重新设计我的许多功能。 好吧,让我们说我有一个公共共享函数,它接受一个整数的byval并返回一个字符串值。如果整个网站只能传入5个可用整数,并且它们中没有一个是用户特定的,那么这是否会创建5个不同的框架,并在用户之间共享?也就是说,这会很好地利用公共共享功能吗? –

+0

我不完全理解你的意思是你有5个可用的整数...在5参数或静态变量或什么?我添加了很多更多的信息给我的答案,所以检查一下,如果它不回答你的问题,那么也许试着提供一些更多的信息,你到底是什么意思。 –

+0

谢谢,我想你帮我澄清了一下! –

1

公共共享意味着没有相关类的实例,并可能在多线程环境中导致重大问题。共享功能还存在一些其他问题,因为它们会创建难以模拟和测试的非常耦合的环境。一般来说,避免使用共享函数是最好的,而且我会说尽可能少地使用共享属性,如果重新分解它们并不困难,我愿意。

0

这就是Shared要表达的意思,价值是由正在运行的应用程序中的每段代码共享的。这也意味着,如果您有一个网站可以被更多用户同时访问,那么它们将在Shared字段或属性中具有相同的值。

一般来说,Shared方法没有问题,如果你明白它们比实例方法更不灵活。例如,你只能在应用程序的一部分中改变它的功能。

至于Shared字段和属性,你应该在多线程环境中小心。在一个线程上更改它们也会在其他线程中更改它们,但由于缓存的原因,更改可能不会立即显示。

相关问题