2017-09-21 54 views
5

Jestem początkującym i uczącym się rozwijaniem stron internetowych przy użyciu środowiska ASP.Net MVC 5 w języku C#. Znalazłem poniższy kod:Kiedy używać NOWEGO słowa kluczowego w języku C# podczas tworzenia obiektu w ASP.NET MVC 5

Scenrio 1: Nie Nowe Słowo kluczowe użyte w tworzeniu obiektu.

[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); 
} 

Scenrio 2: New słowo używane w tworzenie obiektów.

[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); 
} 

Jestem początkującym i próbowałem zarówno kod i zarówno kod działa poprawnie dla mnie.

Pytanie 1: Dlaczego oba kody działają poprawnie?

Pytanie 2: Kiedy używać "nowego", a kiedy nie "używać". Czy ktoś może mi powiedzieć jeden przykład dla obu scenariuszy.

Pytanie 3: Jaka jest różnica między nimi oboma.

Czy ktoś może mnie trochę poprowadzić.

+1

zajęcia dla statyczne muszą być tworzony z nowym słowo kluczowe. Powodem tego działania jest prawdopodobnie to, że metoda GetData zwraca wartość za pomocą nowego obiektu PaymentFormMV. –

Odpowiedz

3

Dlaczego oba kody działają poprawnie? Jaka jest różnica między nimi?

Najprostszym sposobem umieszczenia go będzie "ponieważ robią to samo". Dokładniej, twój drugi fragment kodu sprawia, że ​​przypisanie jest ignorowane; poza tym jednym przydziałem, kod jest identyczny.

Kiedy używać „nowy”, a kiedy nie używać

Gdy wszystkie gałęzie kodu zrobić zadanie, jak w twoim przypadku, nie używaj new. Jeśli chcesz przypisać obiekt, a następnie ponownie go przypisać później, użyj new. Jeśli nie potrzebujesz obiektu w niektórych przypadkach, ale potrzebujesz go w innych, użyj null zamiast new.

Zauważ, że jeśli pozostawić zmiennej lokalnej nieprzypisane, kompilator sprawdza, czy wszystkie branże wykonać zadanie dla Ciebie przed pierwszym odczycie zmiennej:

PaymentFormMV data; 
if (SimUtils.IsDelayedPaymentAllowed) 
{ 
    data = Pay.GetData(PaymentPageMode.DelayedPayment); 
} // No "else" 
return PartialView("PaymentsWrapper", data); // Compile-time error 
1

W obu przypadkach tworzysz nową instancję obiektu wewnątrz instrukcji if, więc to, czy jest ona kontrukowana i przypisana instancja początkowo jest nieistotna po jej zastąpieniu.

Jeśli zapytanie dotyczyło obiektu natychmiast po zadeklarowaniu, w pierwszej instancji zobaczysz, że jest to wartość NULL, natomiast w drugim przypadku jest to PaymentsFormMV.

+1

Tylko niewielki szczegół: byłby niezainicjowany, a nie zerowy. Pola są domyślnie inicjowane 'null', zmienne lokalne nie są. –

+0

@MatthiasMeid, zmiennymi 'object' są, typy wartości to' default (T) ', gdzie' T' jest typem wartości. Np. 'Int' przyjmuje wartość' 0', a nie 'null' – DiskJunky

5

Spójrz na coś więcej niż tylko jedną linię, zobacz, co robi reszta tej metody. We wszystkich logicznych przypadkach (if i else) zmienna ta jest ustawiona na coś, co jest. (Zakładając, że metody .GetData() z powodzeniem zwracają coś.)

W sensie ogólnym używa się new, gdy chce się utworzyć nową instancję obiektu. Pokazany przykład nie musi tego robić, ponieważ kolejna rzecz, jaką robi, zastępuje tę instancję inną instancją. Nie ma potrzeby tworzenia czegoś, aby natychmiast je wyrzucić.