Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重用Viewbag中存储的变量,性能如何?(回收袋)_C#_Asp.net Mvc_Performance_Viewbag - Fatal编程技术网

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
不是一个错误,它只是一个互联网短语,意思是
太长;没有阅读
。当答案被认为太长时,人们这样做是为了提供答案的摘要:)