我对new的了解如下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>()));
如何使用新关键字来调用下面的语句:
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
实际的问题是
ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
可以被解读,对吧?
非常简单:
创建一个特定类型T的新用户存储,其中T是应用程序用户
所以
UserStore<ApplicationUser> myStore = new UserStore<ApplicationUser>();
这正是你所说的1),除了一般的"T"之外没有什么特别的。在您的特定情况下,我们使用重载,其中我们使用构造函数,它接受一个竞争对象
UserStore<ApplicationUser> myStore = new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>());
之后,您在应用程序管理器中使用这个新创建的对象(尽管我认为您的示例缺少一些东西)
ApplicationUserManager(myStore);
上面的初始代码是一个简单的单行代码,因为您不需要myStore对象。
将成员声明中使用的"new"转换为"隐藏基类成员"。
简而言之:new [Classname]
调用类的构造函数(例如您的new Employee
)并在分配的内存空间中创建对象,变量/方法声明(例如new public static int x = 100;
)前面的new
用于"隐藏"以前的声明。
new Employee
的语法错误:
var emp n = new Employee;
应该是
var emp = new Employee();
var
:变量的类型(这是编译器检测到的变量类型,但也可能是Employee
)
emp
:指向实例的变量的名称
Employee()
:要调用的空构造函数的类名和()
(如果没有指定,则默认创建)
c#中使用'new'关键字的原因如下:
-
您想在托管堆中为新对象分配内存(创建对象)
-
您想用同名的新方法替换基类中的方法
-
泛型类型的约束(这意味着对象将在泛型方法内部创建)
示例:
-
一个实例=新的A();
-
A类{public void MyMethod(){}}
B:A级{public new void MyMethod(){}}
-
类C,其中MyType:new(){T instance=new T();}
根据MSDN参考:
在C#中,新关键字可以用作运算符、修饰符或约束。
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
第一个示例用于构造对象的新实例。
第二个示例用于在定义子类时替换字段。
字段可以由子类访问,所以当您尝试访问字段"x"时,它总是来自基类的字段。
但是,如果您确实需要字段x引用子类中的不同内容,该怎么办?放置new
修饰符意味着x
的非限定用法指代该类中的x
字段,而不是超类(可以使用base.x
来指代该字段)。
这个版本的new
关键字的主要用例是方法声明,它对接口实现非常有用,对多个接口实现尤其有用。
您可以在接口上定义方法X()
,在实现类上定义另一个方法new X()
,根据引用的类型,将调用正确的方法。。。从接口到实现类的强制转换将导致调用不同的方法。