【问题标题】:Static Method in ASP.netASP.net 中的静态方法
【发布时间】:2015-01-16 10:39:09
【问题描述】:

我目前正在构建一个 asp.net 网络应用程序。我想创建一些静态方法作为辅助方法。这是一个好主意还是我以后会遇到问题?没有字段或属性。只是方法,有些有返回类型,有些没有返回类型。

静态方法是在字段和属性等所有用户之间共享还是唯一?


    private static string userName;
    public static string UserName
    {
        get
        {
            if (User.Identity.IsAuthenticated)
            {
                if (userName == "" || userName == null)
                {
                    userName = User.Identity.Name;
                }
                return userName;

            }
            else
            {
                throw new ArgumentNullException("Illegal Access", "You're not login or authorize to perform such task");
            }


        }
    }

【问题讨论】:

    标签: c# asp.net static-methods


    【解决方案1】:

    是的,它们是共享的,但您认为这对方法意味着什么?

    静态方法在 ASP.NET 中是完全安全的。即使该方法被多个用户在多个请求中多次调用,调用之间也没有共享数据。

    也就是说,除非静态方法修改了静态数据,在这种情况下,你应该尽可能避免,但无论如何,都需要加锁。


    Public Class MyPage
        Inherits Page
    
        Private Shared _iAmShared As Integer
    
        Private Shared Sub StaticMethod()
            Dim iAmNotShared As Integer = 0
            _iAmShared = _iAmShared + 1
            iAmNotShared = iAmNotShared + 1
        End Sub
    
        Public Sub Page_Load()
            StaticMethod()
        End Sub
    End Class
    

    上面的代码是错误的。 _iAmShared 的增量需要互锁。如果(何时)多个请求同时执行该代码,则不能保证增量是原子的。所有用户和所有请求都有一份_iAmShared 副本。

    另一方面,iAmNotShared 根本不共享。对StaticMethod 的每次调用都会获得自己的iAmNotShared 副本。

    【讨论】:

    • 约翰,我意识到我的问题措辞不当。我的意思是如果数据在调用之间共享。感谢您为我回答这个问题。出于好奇,调用之间是否共享静态属性和字段数据?
    • 是的,静态数据是共享的。 ASP.NET 和控制台应用程序之间没有区别。静态数据也在控制台应用程序中“共享”。唯一的区别是没有什么可以分享它,所以没关系。对于 ASP.NET,数据在所有用户和请求之间共享。
    • 但是您询问的是哪些数据?局部变量仍然是静态方法的局部变量,就像它们在实例方法中一样。
    • 约翰,这是一个例子(不是一个实际的例子)。如果 userA 要调用 UserName 属性,然后 UserB 调用它,会给出相同的结果吗?请参阅下面的示例...
    • 我复制粘贴到下面的回复中。
    【解决方案2】:

    静态方法非常适合 ASP.net 网站中的辅助功能。您可以使用可在整个站点中使用的静态函数创建帮助程序类。对静态方法的每次调用都是唯一的,不会共享任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多