我应该使用公共共享子和公共共享功能吗?他们是不是在用户之间共享数据?
Posted
技术标签:
【中文标题】我应该使用公共共享子和公共共享功能吗?他们是不是在用户之间共享数据?【英文标题】:Should I use Public Shared Sub and Public Shared Functions or not? Do they share data between users?我应该使用公共共享子和公共共享功能吗?他们是否在用户之间共享数据? 【发布时间】:2011-12-27 23:14:58 【问题描述】:我正在使用 VB 与 .Net 合作,并且刚刚完成了一个网站项目,我正准备推出它......但是当我进行最后的清理/演练时,我注意到我目前有使用公共共享函数 62 次和公共共享子 14 次,以及几个公共共享属性。
这是一个我从未完全清楚并希望正确优化我的代码的领域。
我读过的很多文章似乎都表明,公共共享只是让访问函数或子变得更容易,而无需先创建它的实例。
然后我读到的其他地方谈到这是否在网站上的用户之间共享。
这是我不确定/困惑的地方。如果 2 个用户同时开启并且他们都调用相同的公共共享函数或子,事情可以交叉吗?
变量/属性的工作方式相同还是不同?例如,如果我将用户对象存储为公共共享属性是仅限于该用户,还是所有用户都可以访问它?
【问题讨论】:
请给出一些代码示例。您使用 VB.NET 的事实让一些读者感到困惑。 【参考方案1】:如果你只能选择一个,那么重播就对了。但是共享存在是有原因的,最好理解它,这样你就可以适当地使用它。
假设你有一个函数只返回数据库中的所有记录,那么放在共享类中就可以了。假设这个函数有一个参数,让您指定要返回的一条记录。在这种情况下,您仍然是安全的,因为对函数的每次调用都会将另一个帧添加到堆栈并单独跟踪该帧的变量。
但是,如果您开始在函数中使用类成员变量,那么您可能会遇到麻烦。假设您的类使用一个成员变量,该变量包含每页要显示的行数。每次用户更改其偏好时,都会影响所有用户。
所以,我希望这能让你明白一点。
编辑:回答您的问题...
考虑 MessageBox 类。如您所知,您不必创建它的实例即可使用其方法。如果同时对其 Show(string text) 方法进行两次调用,您不必担心第二次调用会覆盖第一次传递的消息,因为对该方法的每次调用都维护自己的一组变量。
但是,请考虑以下类:
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) 因为这是一个静态类,所以所有属性/字段都必须声明为静态。但是,不要误解你也可以有一个带有静态变量和方法的非静态类。从功能上讲,使您的类成为静态并不会改变您的代码行为方式……它只会导致编译器在您的类中强制执行某些规则。
将方法设为静态允许您将其称为 MyClass.SomeMethod() 而不是 instanceOfMyClass.SomeMethod()。这只是语法上的差异。实际上,所有方法始终是静态的(即,您的方法代码永远不会有多个实例......它只是在一个地方。它是实例化的变量。)。除了语法上的差异之外,将方法设为静态还会强制执行一些规则,以防止您引用任何有意义的非静态属性/字段,因为您不是从对象的实际实例中调用它。
3) 最重要的是,请注意,这将是设计此类的一种糟糕的方式。如果对该类进行了两次调用,则可能一个人可以将 Message 属性设置为“Hello”,然后其他人可以在第一个人显示他们的消息之前将其设置为“World”。然后每个人调用 Show() 方法,你会得到两个消息框,上面写着“World”。
有时需要这种设计,因此您必须使用多线程技术让后续调用者排队等待使用特定资源。但是对于这么简单的事情,这显然是荒谬的。
【讨论】:
感谢您的想法。它帮助我理解它,并且我正在修改我的许多功能。好的,假设我有一个公共共享函数,它接收一个整数的字节值并返回一个字符串值。如果只有 5 个可用的整数可以在整个网站上传递,并且它们都不是特定于用户的,那么这是否会创建 5 个不同的框架供用户共享?即,这是对公共共享功能的良好使用吗? 我不完全明白你的意思是什么意思你有 5 个可用的整数......如 5 个参数或静态变量或什么?我在答案中添加了更多信息,因此请检查一下,如果它没有回答您的问题,那么也许可以尝试提供更多信息来说明您的确切含义。 谢谢,我想你帮我澄清了!【参考方案2】:公共共享意味着没有相关类的实例,并且可能在多线程环境中导致重大问题。共享函数还有一些其他问题,因为它们创建了非常耦合的环境,难以模拟和测试。一般来说,最好避免使用共享函数,如果将它们分解出来并不困难,我会说尽可能少地使用共享属性。
【讨论】:
【参考方案3】:这就是Shared
所要传达的意思,该值由正在运行的应用程序中的每一段代码共享。这也意味着,如果您的网站可以被更多用户同时访问,那么他们在Shared
字段或属性中将具有相同的值。
一般来说,Shared
方法没有任何问题,如果您了解它们不如实例方法灵活的话。例如,您不能只更改它在应用程序的一部分中的作用。
至于Shared
字段和属性,在多线程环境下要小心。在一个线程上更改它们也会在其他线程中更改它们,但由于缓存,更改可能不会立即显示。
【讨论】:
以上是关于我应该使用公共共享子和公共共享功能吗?他们是不是在用户之间共享数据?的主要内容,如果未能解决你的问题,请参考以下文章
适用于 iOS 的 Google Plus API:共享功能 - 在本机对话框共享中触摸“公共”时应用程序崩溃?