我真的很困惑在C#和MVC中使用NEW关键字

  • 本文关键字:MVC 关键字 NEW 真的 c#
  • 更新时间 :
  • 英文 :


我对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'关键字的原因如下:

  1. 您想在托管堆中为新对象分配内存(创建对象)

  2. 您想用同名的新方法替换基类中的方法

  3. 泛型类型的约束(这意味着对象将在泛型方法内部创建)

示例:

  1. 一个实例=新的A();

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

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

  3. 类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(),根据引用的类型,将调用正确的方法。。。从接口到实现类的强制转换将导致调用不同的方法。

最新更新