C# 重用Viewbag中存储的变量,性能如何?(回收袋)
当我想到一个C# 重用Viewbag中存储的变量,性能如何?(回收袋),c#,asp.net-mvc,performance,viewbag,C#,Asp.net Mvc,Performance,Viewbag,当我想到一个ViewBag,我会把它和“final say”联系起来 这意味着你做了所有的逻辑,并设定了结果 ViewBag.A = Some crazy math formula; ViewBag.B = Another crazy math formula; ViewBag.GrandTotal = Some crazy math formula + Another crazy math formula; 这同样有效: ViewBag.A = Some crazy math formula
ViewBag
,我会把它和“final say”联系起来
这意味着你做了所有的逻辑,并设定了结果
ViewBag.A = Some crazy math formula;
ViewBag.B = Another crazy math formula;
ViewBag.GrandTotal = Some crazy math formula + Another crazy math formula;
这同样有效:
ViewBag.A = Some crazy math formula;
ViewBag.B = Another crazy math formula;
ViewBag.GrandTotal = ViewBag.A + ViewBag.B;
Yepes,我正在处理运行时形成的变量
这是荒谬的还是低效的?tl;dr:ViewBag是一个懒散地被过度使用的“免出狱卡”,用于存储数据,基本上会让你说“嘿,在运行时抛出错误,那么谁真正在乎呢?”
这是荒谬的吗
绝对正确如果完全基于ViewBag
值执行复杂的逻辑/公式,那么就等于打开了潜在运行时错误的大门
你真的应该强烈地输入它们,把它们放在模型中。这样至少可以减轻一些潜在的运行时错误或实现中可能存在的缺陷
对我来说,ViewBag
(而不是ViewBag.Title
)唯一合理的用途是,当您的模型可以是许多不相关的不同类型时(如果这些类型是相关的,您可以让它们都派生自一个公共项,并将您的属性放在该项上)
这是MVC(模型视图控制器),而不是一些人认为/实施的VVC(ViewBag视图控制器)。
就性能而言,我要说的是,这种差异并不明显,因此不能保证使用它。您的第二个选项显然比第一个选项性能更好。这与是否使用ViewBag无关,只是您只执行一次计算 除此之外,使用ViewBag不是很有效,因为需要装箱将值类型放入堆中,然后使用强制转换将值发送到视图中 正确的方法是通过模型:
public class MyModel{
public decimal A {get; set; }
public decimal B {get; set; }
public decimal GrandTotal { get { return A + B;}}
}
然后在控制器中实例化该类,放入变量并将其传递给视图:
** snip **
MyModel model = new MyModel {A = some crazy formula, B = another crazy formula};
return View(model);
我想知道为什么要在viewbag中存储
GrandTotal
,而它只是一个计算字段。为了简单起见,我坚持使用选项2,我怀疑访问viewbag属性的性能影响是否是有形的。viewbag基本上只是一个字典
,除非您可以使用点来引用条目,而不是索引它。这里没有什么神奇的东西。只有最后一句话与被问的问题有关。我认为这一切都是相关的,因为答案基本上是:不要将ViewBag用于此类内容,而且,除非你有非常好的理由,否则根本不要使用它。ViewBag经常被滥用;每个人都需要听到@mattytomo写的内容,并经常听到。@Pinch感谢您的编辑。顺便说一句,tl;dr
不是一个错误,它只是一个互联网短语,意思是太长;没有阅读
。当答案被认为太长时,人们这样做是为了提供答案的摘要:)