有人可以向我解释下面写的代码
public IList<GetProductPrice> CurrentPage
{
get { return ViewState["CurrentPage"] as List<GetProductPrice>; }
set { ViewState["CurrentPage"] = value; }
}
答案 0 :(得分:0)
此属性允许属性的使用者像Local集合一样使用它而不在代码中引用ViewState。它将使代码简单易用。
get { return ViewState["CurrentPage"] as List<GetProductPrice>; }
这里ViewState对象ViewState [“CurrentPage”]被转换为GetProductPrice列表
set { ViewState["CurrentPage"] = value; }
此处列表被分配给ViewState [“CurrentPage”]
答案 1 :(得分:0)
它被称为财产。它们在编译时生成getter和setter函数:
List<GetProductPrice> GetCurrentPage(){
return ViewState["CurrentPage"] as List<GetProductPrice>;
}
void SetCurrentPage(List<GetProductPrice> value) {
ViewState["CurrentPage"] = value;
}
//i think its actual get_.. but it doesn't matter for the example
因此它产生了易用性的getter setter。您可以使用以下方式致电:
var test = CurrentPage; //compiled to var test = GetCurrenctPage();
CurrentPage = test; //compiled to SetCurrentPage(test);
如果你把getter和setter留空,就像这样:
public int CurrentPage
{
get;
set;
}
它还会在存储数据的类上生成一个支持字段:
private int _currentPage;
public GetCurrentPage(){ return _currentPage }
public SetCurrentPage(int value) { _currentPage = value }
使用getter和setter是java中一个非常古老的最佳实践(其中ide可以选择生成它们)。但这会产生很多样板代码!
在C#中,他们试图通过添加这些属性来解决这个问题。但为什么我们需要吸气剂和制定者呢?例如,如果您希望在值更改时收到通知(将类自身标记为脏)。我认为实体框架使用它来跟踪模型是否被更改,否则它不会进行数据库更新调用。还有其他有用的工具在编译时在属性中注入代码。添加额外的功能。
使用属性返回HttpContext.Current
是危险的,因为你暗中依赖HttpContext
所以尽量不要这样做!
一般来说,当get或set中的代码非常繁重(非常苛刻)时,使用它也是不好的做法。这是一种不好的做法,因为使用代码的其他人可能会认为他只是设置属性/字段,而实际执行了一些非常繁重的代码。它的最佳实践是为此创建一个特殊的函数,而将getter / setter私有化:
public int Property {get; private set; }
public SetProperty(int value){
//intensive code here:
Property = value;
}
答案 2 :(得分:0)
此代码仅适用于控制器,其中ViewState
是属性。此CurrentPage
属性提供了一种静态类型的方式,可通过该属性访问某个ViewState项。
因此,您可以只使用ViewState["CurrentPage"] as List<GetProductPrice>
属性,而不是在您想要访问“当前页面”的控制器代码上遍布CurrentPage
。
当然“当前页面”是由开发人员选择命名此类内容而构成的术语,我看不出List<GetProductPrice>
与“当前页面”的关系如何。