簡體   English   中英

我對在C#和MVC中使用NEW關鍵字感到非常困惑

[英]I am really confused about NEW keyword use in C# and MVC

我對新知識的了解如下:1)例如在類,數組列表等中創建對象時:

public class Employee {
public int ID {get;set;}
Public String Name{get;set;}
}


}
public static main(){
var emp n = new Employee;

}

2)修飾符

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'. 
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

但是我將展示一些場景,在該場景中我很難在這里實現新關鍵字。 我認為第一個新詞用於創建管理器對象,但是第二個新詞或(new UserStore<ApplicationUser>的用途是什么。請您解釋一下。

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

new關鍵字如何用於在下面調用此語句:

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

使用c#中的'new'關鍵字是出於以下原因:

  1. 您想在托管堆中為新對象分配內存(創建對象)

  2. 您想用相同名稱的新方法替換基類中的方法

  3. 泛型類型的約束(這意味着將在INSIDE泛型方法中創建對象)

例子 :

  1. 一個實例= new A();

  2. 類A {public void MyMethod(){}}

    B類:A {public new void MyMethod(){}}

  3. C類,其中MyType:new(){T instance = new T(); }

將成員聲明中使用的“新”思維轉換為“ hide-base-class-member”。

第一個示例用於構造對象的新實例。

第二個示例用於在定義子類時替換字段。

子類可以訪問字段,因此當您嘗試訪問字段“ x”時,它始終是基類中的一個。

但是,如果您確實需要字段x引用子類中的其他內容,該怎么辦? 放置new修飾符意味着x的無限定用法是指此類中的x字段,而不是超類(您可以使用base.x引用base.x )。

此版本的new關鍵字的主要用例是方法聲明,它在接口實現中特別方便,在多個接口實現中特別方便。

你可以有一個方法X()定義在接口上,而另一種方法new X()的實現類,以及正確的方法將被調用依賴於引用的類型......從一個接口強制轉換為實現類將導致調用不同的方法。

在很短的: new [Classname]調用一個類別(例如你的構造new Employee ),並在所分配的存儲器空間創建一個對象, new的變量/方法聲明的前面(例如new public static int x = 100;用於“隱藏”先前的聲明。

new Employee的語法錯誤:

var emp n = new Employee;

應該

var emp = new Employee();

var :變量的類型(即編譯器檢測到的變量類型,也可以是Employee

emp :指向實例的變量名稱

Employee() :要調用的空構造函數的類名和() (如果未指定,則默認創建。)

根據MSDN參考:

在C#中,new關鍵字可用作運算符,修飾符或約束。

new as an Operator:

    Used to create objects and invoke constructors.

new as a Modifier:

    Used to hide an inherited member from a base class member.

new as a Constraint:

   Used to restrict types that might be used as arguments for a type 
   parameter in a generic declaration.

在該行中:

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

您正在創建一個“新” ApplicationUserManager

實際的問題是

ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

可以解釋吧?

很簡單:

您創建一個新的特定類型T的用戶存儲,其中T是應用程序用戶

所以

UserStore<ApplicationUser> myStore = new UserStore<ApplicationUser>();

這就是您提到的1),除了通用的“ of”之外沒有什么特別的。 在您的特定情況下,我們使用重載,其中使用構造函數,該構造函數接受contecxt對象

UserStore<ApplicationUser> myStore = new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>());

之后,您可以在應用程序管理器中使用這個新創建的對象(盡管我認為您的示例缺少某些內容)

ApplicationUserManager(myStore);

上面的初始代碼很簡單,因為您不需要myStore對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM