我正在使用VB工作.Net刚刚完成了一个网站项目,我正准备推出它...但是当我经历最后的清理/演练时,我注意到我目前有使用了62次公共共享功能和14次公共共享功能,以及一些公共共享属性。
这是一个我从未完全清楚过的领域,并希望正确优化我的代码。
我阅读的很多文章似乎表明,Public Shared只是让访问函数或sub更容易,而不首先创建它的实例。
但是我读到的其他地方谈到这是否在网站上的用户之间共享。
这是我不确定/困惑的地方。如果2个用户同时打开并且他们都调用相同的公共共享功能或Sub,那么事情可以跨越吗?
变量/属性的工作方式是相同还是不同?例如,如果我将用户对象存储为公共共享属性仅限于此用户,或者所有用户都能够访问它?
答案 0 :(得分:4)
如果你只能选一个,那么重新运行是正确的。但是存在共享的原因并且最好理解它,以便您可以适当地使用它。
假设您有一个只返回数据库中所有记录的函数,那么放入共享类就可以了。让我们说这个函数有一个参数让你指定一个你想要返回的记录。在这种情况下,您仍然是安全的,因为每次调用该函数都会向堆栈添加另一个帧并分别跟踪该帧的变量。
但是,如果您开始使用函数中的类成员变量,那么您可能会遇到麻烦。假设您的类使用包含要显示的每页行数的成员变量。每次用户更改其偏好时,都会影响所有用户。
所以,我希望能为你清理一下。
编辑:暂时回答你的问题......
考虑MessageBox类。如您所知,您不必创建它的实例来使用其方法。如果同时对其Show(字符串文本)方法进行两次调用,则不必担心第二次调用会覆盖第一次传递的消息,因为每次调用该方法都会维护自己的一组变量。
但是,请考虑以下类:
public static class MyMessageBox
{
public static string Message { get; set; }
public static void Show()
{
MessageBox.Show(MyMessageBox.Message);
}
}
请注意有关此课程的一些事项: 1)Show必须通过对静态类MyMessageBox的引用来访问Message属性。它不能将它引用为'this.Message',因为没有类的实际实例,因此没有'this'这样的东西。
2)因为这是一个静态类,所有属性/字段必须声明为static。但是,不要误解您也可以使用静态变量和方法的非静态类。从功能上讲,使您的类静态不会改变代码行为的方式...它只会导致编译器在您的类中强制执行某些规则。
使方法静态允许您将其称为MyClass.SomeMethod()而不是instanceOfMyClass.SomeMethod()。这只是语法上的差异。实际上,所有方法都是静态的(即,方法代码永远不会有多个实例......它只在一个地方。它是实例化的变量。)。除了语法上的差异之外,使方法静态还强制执行规则,使您无法引用任何非常有意义的非静态属性/字段,因为您没有从对象的实际实例中调用它。
3)最重要的是,请注意这将是设计这门课程的一种可怕方式。如果对该类进行了两次调用,则可能有一个人可以将Message属性设置为“Hello”,然后其他人可以在第一个人显示其消息之前将其设置为“World”。然后每个人调用Show()方法,你会得到两个说“World”的消息框。
有时需要这种设计,因此您必须使用多线程技术使后续调用者排队等待使用特定资源。但对于像这样简单的事情显然是荒谬的。
答案 1 :(得分:1)
公共共享意味着没有相关类的实例,并且可能在多线程环境中导致重大问题。共享功能还存在一些其他问题,因为它们会创建非常难以模拟和测试的耦合环境。一般来说最好避免使用共享函数,我会说如果尽可能少地使用共享属性,我会这么做。
答案 2 :(得分:0)
这就是Shared
要传达的内容,该值由正在运行的应用程序中的每一段代码共享。这也意味着如果您的网站可以被更多用户同时访问,那么它们在Shared
字段或属性中将具有相同的值。
一般来说,Shared
方法没有任何问题,如果您了解它们的灵活性低于实例方法。例如,您无法仅在应用程序的一个部分中更改它的功能。
至于Shared
字段和属性,在多线程环境中应该小心它们。在一个线程上更改它们也会在其他线程中更改它们,但由于缓存,更改可能不会立即显示。