【问题标题】:What is the proper way to use static variable in OOP?在 OOP 中使用静态变量的正确方法是什么?
【发布时间】:2011-05-06 09:57:23
【问题描述】:

我正在开发员工管理系统。每个员工属于一个部门,当员工登录系统时,我将 UserId 和 DepartmentId 存储在我的班级中,如下所示

internal static class MyStaticData
{
    internal static Guid UserId { get; set; }
    internal static Guid DepartmentId { get; set; }
}

当用户创建离开申请页面并点击保存按钮时,我需要将 UserId 和 DepartmentId 都发送到数据库中,那么将 UserId 和 DepartmentId 发送到此页面之间的正确方法是什么

// Create instance property inside the class and assign it when create new object.
public class LeavePage
{
    public Guid UserId { get; set; }
    public Guid DepartmentId { get; set; }
}

var leavePage = new LeavePage { UserId = MyStaticData.UserId, DepartmentId = MyStaticData.DepartmentId };

或

// Don't have instance property inside the class but use MyStaticData directly
public class LeavePage
{
    public void Save()
    {
        Db.Save(data, ..., MySataicData.UserId, MyStaticData.DepartmentId);
    }
}

我不确定哪个更好(耦合更少)还是有更好的方法来做到这一点?

【问题讨论】:

  • 你说的是“离开页面”。您正在开发 Web 应用程序吗?那么静态用户数据是个坏主意。
  • 您是否将静态对象类成员与常量实例成员混淆了?静态成员在类的所有实例之间共享。您可能希望对 UserId 和 DepartmentId 使用私有 const,因为它们在用户之间是可变的。
  • @DanielB:这是窗口应用程序。
  • @DanielB:为什么静态用户数据是个坏主意?
  • @Akram Shahda:在 Web 应用程序 (asp.net) 中,静态变量在应用程序之间共享并且没有请求范围,因此每个用户都将使用自己的数据覆盖其他人的静态变量。

标签: c# oop


【解决方案1】:

您可能想尝试使用一些更通用的类的静态实例 - 像这样:

public class User
{
    public Guid Id { get; set; }
    public Guid DepartmentId { get; set; }
}

public static class SessionContext
{
    public static User CurrentUser { get; set; }
}

然后保存时使用SessionContext.CurrentUser。

当然,在这种情况下使用静态类可能不合适,您应该查看特定于会话的实例。

【讨论】:

    【解决方案2】:

    如果不需要在类中包含值的实例,请不要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-05
      • 2019-03-31
      • 2013-11-06
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2017-01-31
      • 2018-11-22
      相关资源
      最近更新 更多