• new关键字的三种用法


    三种用法如下:
    在 C# 中,new 关键字可用作运算符、修饰符或约束。
    1)new 运算符:用于创建对象和调用构造函数。
    2)new 修饰符:在用作修饰符时,new 关键字可以隐藏从基类继承的成员。
    3)new 约束:用于在泛型声明中约束用作类型的参数必须要有Public无参数构造函数。 
     
    关于第二种用法看下例:
    using System;
    namespace ConsoleApplication1
    {
        public class BaseA
        {
            public int x = 1;
            public void Invoke()
            {
                Console.WriteLine(x.ToString());
            }
            public int TrueValue
            {
                get { return x; }
                set { x = value; }
            }
        }
        public class DerivedB : BaseA
        {
            new public int x = 2;
            new public void Invoke()
            {
                Console.WriteLine(x.ToString());
            }
            new public int TrueValue
            {
                get { return x; }
                set { x = value; }
            }
        }
     
        class Test
        {
            static void Main(string[] args)
            {
                DerivedB b = new DerivedB();
                b.Invoke();//调用DerivedB的Invoke方法,输出:2
                Console.WriteLine(b.x.ToString());//输出DerivedB的成员x值:2
                BaseA a = b;
                a.Invoke();//调用BaseA的Invoke方法,输出:1
                a.TrueValue = 3;//调用BaseA的属性TrueValue,修改BaseA的成员x的值
                Console.WriteLine(a.x.ToString());//输出BaseA的成员x的值:3
                Console.WriteLine(b.TrueValue.ToString());//输出DerivedB的成员x的值,仍然是:1
    //可见,要想访问被隐藏的基类的成员变量、属性或方法,办法就是将子类造型为父类,然
    //后通过基类访问被隐藏的成员变量、属性或方法。
            }
         }
    }

    对同一成员同时使用 new 和 override 是错误的做法,因为这两个修饰符的含义互斥。 new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。 override 修饰符会扩展继承成员的实现。

    在不隐藏继承成员的声明中使用 new 修饰符将会生成警告。

     
     
     
    new约束指定泛型类声明中的任何类型参数都必须具有公共的无参数构造函数.请看下例:
    如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写。
    using System;
    using System.Collections.Generic;
     
    namespace ConsoleApplication2
    {
        public class Employee
        {
            private string name;
            private int id;
     
            public Employee()
            {
                name = "Temp";
                id = 0;
            }
     
            public Employee(string s, int i)
            {
                name = s;
                id = i;
            }
     
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
     
            public int ID
            {
                get { return id; }
                set { id = value; }
            }
        }
     
        class ItemFactory<T> where T : new()
        {
            public T GetNewItem()
            {
                return new T();
            }
        }
     
        public class Test
        {
            public static void Main()
            {
                ItemFactory<Employee> EmployeeFactory = new ItemFactory<Employee>();
                ////此处编译器会检查Employee是否具有公有的无参构造函数。
                //若没有则会有The Employee must have a public parameterless constructor 错误。
                Console.WriteLine("{0}'ID is {1}.", EmployeeFactory.GetNewItem().Name, EmployeeFactory.GetNewItem().ID);
            }
        }
    }
     
     
  • 相关阅读:
    Java中@Override的作用
    微软面试题: LeetCode 152. 乘积最大子数组 出现次数:2
    微软面试题: LeetCode 300. 最长递增子序列 出现次数:2
    微软面试题: LeetCode 76. 最小覆盖子串 出现次数:2
    微软面试题:剑指 Offer 52. 两个链表的第一个公共节点 出现次数:2
    微软面试题: LeetCode 79. 单词搜索 出现次数:2
    微软面试题: LeetCode 39. 组合总和 出现次数:2
    微软面试题: LeetCode 151. 翻转字符串里的单词 出现次数:2
    微软面试题: LeetCode 415. 字符串相加 出现次数:2
    微软面试题: LeetCode 110. 平衡二叉树 出现次数:2
  • 原文地址:https://www.cnblogs.com/sylone/p/5550072.html
Copyright © 2020-2023  润新知