C# 调用变量或实体字段的性能/良好实践比较

C# 调用变量或实体字段的性能/良好实践比较,c#,performance,entity-framework,asp.net-mvc-4,variables,C#,Performance,Entity Framework,Asp.net Mvc 4,Variables,我需要知道,如果我使用变量id通过请求传递给控制器中的某个操作,或者使用使用我曾经通过相同请求传递的相同id检索到的模型的IdFoo,这是更重还是一种不良做法 假设我使用ASP.NET MVC4和C#和实体框架,我有一个带有数据注释的模型,声明IdFoo为模型的主键: 公共类Foo { [关键] 公共int IdFoo{get;set;} } 在我的FooController中,在Edit操作中,我需要检索IdFoo,但它与我通过route传递的id变量相同 公共类Foo { [HttpGet

我需要知道,如果我使用变量id通过请求传递给控制器中的某个操作,或者使用使用我曾经通过相同请求传递的相同id检索到的模型的IdFoo,这是更重还是一种不良做法

假设我使用ASP.NET MVC4和C#和实体框架,我有一个带有数据注释的模型,声明IdFoo为模型的主键:

公共类Foo
{
[关键]
公共int IdFoo{get;set;}
}
在我的FooController中,在Edit操作中,我需要检索IdFoo,但它与我通过route传递的id变量相同

公共类Foo
{
[HttpGet]
公共操作结果创建(int id=0)
{
var Foo=db.Foo.Find(id);
//其他行动。
var Bar=Foo.IdFoo;
var-Qux=id;
//Bar=Qux
...
返回视图(Foo);
}
}

继续使用我通过请求传递的id变量作为控制器代码的其余部分,这是一种良好的做法/性能要求较低,还是应该使用Foo.IdFoo?请注意,Foo.IdFoo和id始终具有相同的值,因此我知道我可以同时使用它们,我只是在寻找良好的实践或性能原因来证明使用它们的合理性。

除非
IdFoo
正在做它不应该做的事情,否则从性能角度来看,它应该没有任何区别


从微观优化的角度来看,我认为从技术上来说,使用上下文中已经存在的变量比从
Foo
对象中提取变量更快;但这真是令人毛骨悚然,我没有基准统计数据来证明这一理论。

我认为在性能上没有任何差异。然而,还有两个其他考虑因素:

  • 如果变量或属性被修改怎么办?一千次提交之后,其中一次操作可能会更改该对象的Id。或者这可能不是这些操作中的任何一个,而是另一个线程中的某个操作。因此,对于这种(现在不太可能)行为,最好使用该属性。顺便说一句,我不知道ASP.NET的细节,但是您的ID属性看起来不应该在项目的生命周期内更改,因此将此属性设置为只读(没有访问器)可能是明智的,因此它只能在构造函数中设置

  • 什么更具可读性?现在这两个选项看起来都一样,但在现实世界中,这些类名通常会变长,所以简单id可能会更好


Foo.Id与数据库上的主键字段相对应。通常,它是自动递增的。您必须知道,所有这些代码都发生在ASP.NET MVC4中的HTTP GET请求中,
Foo.Id
Id
,即使它们在代码中是可变的,也不应该在请求生命周期结束时更改,因为没有理由这样做。此应用程序不应处理更改或生成主键的问题,在这种情况下,这是数据库的责任,应用程序将仅检索和查询主键(如
db.Foo.Find(id)
部分所示,我们使用LINQ(语言集成查询)从数据库检索实体)。假设我必须使用
db.Foo.Find(id)从数据库中检索
Foo
每次,所以我们无法逃避这一部分。我要说的是:忘记我已经检索了
Foo
这个事实,在我已经检索了
Foo.Id
之后,使用
Foo.Id
或变量
Id
有什么区别吗?更严格地说,只需调用
Foo.Id
,已经加载到服务器的RAM内存,比简单地调用
id
变量(也存储在服务器的RAM内存中)更实用和/或性能密集吗?@EdgarSalazar如我所说,如果它是一个额外的函数调用,则可能会有一些轻微的开销进入属性。但是,您的讲话分数为毫秒…如果有的话。请坚持whichever对您来说是最可读的,因为在性能方面不会有明显的差异。因此,我认为我将为这个案例创建我们自己的团队的良好实践,这在我们的项目中已经发生了很多。我将坚持使用Foo.Id并将Id留给实体检索。谢谢!