[英]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.