我有时会承认关键字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
并且不在静态方法内。
E.G:
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);
}
这一切对我来说都很古怪。这闻到了其他人的味道吗?但是,不确定如何解开它,因为我无法在用户控件内部完全创建Default页面的实例。
思考?谢谢你的阅读。
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"];
}
答案 0 :(得分:2)
据推测,用户控件包含在Default
页面中,静态成员用作获取Default
当前实例的快捷方式。我会这样做的:
Default defaultPage = this.Page as Default;
if (defaultPage != null)
{
defaultPage.LoadSelectedSyncOperation(index);
}
以这种方式使用静态成员是不安全的。它为竞争条件打开了大门。存在潜在的风险,即用户控件被加载到另一个页面中,并在单独的请求的LoadSelectedSyncOperation()
实例上调用Default
,从而造成各种潜在的破坏。
答案 1 :(得分:1)
我不知道LoadSelectedSyncOperation做了什么,但这段代码看起来很奇怪。每当您单击btnCancelSyncOperation时,您最终会在某个页面上调用此方法,但您永远不知道它们中的哪一个。这对我来说没什么意义。
答案 2 :(得分:1)
我肯定会说你的担忧是有效的。我无法想到这个设计有意义的任何理由。这也会给我一个旗帜。
根据您对我的评论的回复,如果Default.LoadSelectedSyncOperation
不依赖于默认页面,那么我建议将其重构为一个单独的类(不是ASP.NET页面)。
方法或新类是否有意义是静态的是一个单独的问题,并且将基于方法中包含的逻辑。