c# - 重构大泥球;不确定这里是否正确使用了静态。建议?

标签 c# static refactoring

我承认有时关键字 static 的更深层次的细微差别让我无法理解。

这是我看到的:

public partial class Default : CSSDEIStatusBase
{
    private static Default _csWitWeb;

    protected void Page_Load(object sender, EventArgs e)
    {
        //DoStuff
        _csWitWeb = this;
        //OtherStuff
    }

    public static void ForceLoadSyncOperation(int? index)
    {
        Default._csWitWeb.LoadSelectedSyncOperation(index);
    }
}

对 ForceLoadSyncOperation 的唯一引用是:

Default.ForceLoadSyncOperation(index);

Default.ForceLoadSyncOperation(null);

这两个调用都来自:

    public partial class DataOriginUserControl : System.Web.UI.UserControl

并且不位于静态方法内部。

例如:

protected void btnCancelSyncOperation_Click(object sender, EventArgs e)
{
    this.lblErrorMessage.Text = string.Empty;
    this.lblErrorMessage.Visible = false;

    int index = _syncOperation.Sequence - 1;
    Default.ForceLoadSyncOperation(index);
}

这一切对我来说真的很古怪。其他人闻到这个味道了吗?不过,我不太确定如何解开它,因为我无法在用户控件内准确地创建默认页面的实例。

想法?感谢阅读。

protected void LoadSelectedSyncOperation(int? index)
{
    SyncOperationConfiguration[] syncOperations = CSServiceClient.GetInterfaceConfiguration().SyncOperationConfigurations.ToArray();

    PopulateSyncOperationsListView(syncOperations);
    SyncOperationConfiguration syncOperation = null;

    try
    {
        syncOperation = syncOperations[index.HasValue ? index.Value : 0];
    }
    catch
    {
        syncOperation = syncOperations[0];
    }

    ucDataOrigin.LoadSyncOperationData(syncOperation);
    Session["ConfigMenuActiveIndex"] = 1;
    menuConfiguration.Items[(int)Session["ConfigMenuActiveIndex"]].Selected = true;
    mvwConfiguration.ActiveViewIndex = (int)Session["ConfigMenuActiveIndex"];
}

最佳答案

据推测,用户控件包含在 Default 页面中,静态成员用作获取 Default 当前实例的快捷方式。我会这样做:

Default defaultPage = this.Page as Default;
if (defaultPage != null)
{
    defaultPage.LoadSelectedSyncOperation(index);
}

以这种方式使用静态成员是不安全的。它为竞争条件打开了大门。用户控件加载到另一个页面并在单独请求的 Default 实例上调用 LoadSelectedSyncOperation() 存在潜在风险,从而造成各种潜在的破坏。

关于c# - 重构大泥球;不确定这里是否正确使用了静态。建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8349454/

相关文章:

c# - "I"运算符,非整数和非 bool 类型除外

c# - 领域驱动设计中对持久性的调用在哪里

c++ - 为什么我在这里需要静态?

javascript - 寻找重构 D3.js 风格方法链模式的方法

c# - 函数分析问题 - Visual Studio 2010 Ultimate

c# - 在 ASP.NET 后端查找方法

c# - 异步调用API并解析JSON

c# - 特定 Controller 的路由

c# - 静态方法局部变量和线程安全

c# - C# 中 const 字段的继承修饰符 "new"