[英]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'關鍵字是出於以下原因:
您想在托管堆中為新對象分配內存(創建對象)
您想用相同名稱的新方法替換基類中的方法
泛型類型的約束(這意味着將在INSIDE泛型方法中創建對象)
例子 :
一個實例= new A();
類A {public void MyMethod(){}}
B類:A {public new void MyMethod(){}}
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.