在ASP.NET MVC 5中创建对象时,何时使用C#中的NEW关键字?

6

我是一名初学者,正在使用C#语言的ASP.Net MVC 5框架学习Web开发。我看到了下面的代码:

场景1:在对象创建中没有使用New关键字。

[AuthorizeFunc]
[BlockWidget]
public PartialViewResult WidgetPayments()
{    
   PaymentFormMV data; // No New Keyword used
   if (SimUtils.IsDelayedPaymentAllowed)
   {
       data = Pay.GetData(PaymentPageMode.DelayedPayment);
   }
   else
   {
       data = PayHelp.GetData(PaymentPageMode.MakePayment);
   }
   return PartialView("PaymentsWrapper", data);
}

情景二:New关键字用于对象创建。

[AuthorizeFunc]
[BlockWidget]
public PartialViewResult WidgetPayments()
{    
   PaymentFormMV data = new PaymentFormMV();  // New Keyword used
   if (SimUtils.IsDelayedPaymentAllowed)
   {
       data = Pay.GetData(PaymentPageMode.DelayedPayment);
   }
   else
   {
       data = PayHelp.GetData(PaymentPageMode.MakePayment);
   }
   return PartialView("PaymentsWrapper", data);
}

我是一名初学者,我尝试了这两段代码,这两段代码都能正常工作
  • 问题1:为什么这两段代码都能正常工作?
  • 问题2:何时使用new,何时不使用new。可以给我举一个例子吗?
  • 问题3:它们之间有什么区别?

能否有人给我一些指导呢?


1
非静态类需要使用 new 关键词实例化。这样做的原因可能是 GetData 方法返回一个带有新 PaymentFormMV 对象的值。 - Sam Marion
3个回答

5

不要只看这一行代码,要看这个方法的其他部分在做什么。在所有逻辑情况(ifelse)下,那个变量都被设置为某些值。(假设.GetData()方法成功返回了某些内容。)

一般来说,当您想创建一个对象的新实例时,可以使用new关键字。您所展示的示例不需要这样做,因为它接下来要做的事情是用另一个实例替换该实例。没有必要创建一个东西,然后立即丢弃它。


4
为什么两个代码都能正常工作?它们之间有什么区别?
最简单的解释是“因为它们做了相同的事情”。更具体地说,你的第二段代码片段进行了一个被忽略的赋值;除了这个赋值之外,代码是完全一样的。
何时使用"new",何时不使用?
当代码的所有分支都进行赋值时,如在您的情况下,请不要使用new。当需要分配一个对象,然后在以后重新分配它时,请使用new。如果有时不需要对象,但在其他情况下需要它,请使用null而不是new
请注意,如果您将本地变量未分配,编译器将在第一次读取变量之前检查所有分支是否执行了分配:
PaymentFormMV data;
if (SimUtils.IsDelayedPaymentAllowed)
{
    data = Pay.GetData(PaymentPageMode.DelayedPayment);
}  // No "else"
return PartialView("PaymentsWrapper", data); // Compile-time error

1
在这两种情况下,你都在if语句中创建了一个新的对象实例,因此它最初是否被构建和分配实例是无关紧要的,因为它会被替换。
如果在第一种情况下立即查询声明后的对象,你会发现它是null,而在第二种情况下,它将是一个PaymentsFormMV。

1
只是一个小细节:它将是未初始化的,而不是空值。字段默认情况下会被初始化为 null,但局部变量不会。 - Matthias Meid
@MatthiasMeid,object变量是引用类型,而值类型的默认值是default(T),其中T是值类型。例如,int的默认值为0,而不是null - DiskJunky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接