我承认有时关键字 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/