繁体   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