C#的new关键字的几种用法

一共有三种用法:
在 C# 中,new 关键字可用作运算符、修饰符或约束。
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。

直接上代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NewTest
{
    /*
     * a)     作为运算符用来创建一个对象和调用构造函数。
     * b)     作为修饰符。
     * c)      用于在泛型声明中约束可能用作类型参数的参数的类型。
     * 
     */

    class A
    {
        public A() { }
        public int data;
        public int Data { get { return data; } set { data = value; } }
        public int Data1 { get; set; }
        public virtual void Get()
        {
            Console.WriteLine("AAAAAAA");
        }
    }

    class B : A
    {
        public B():base() { }
        new public int data;
        new public int Data { get; set; }
        new public int Data1 { get; set; }
        new public void Get()
        {
            Console.WriteLine("BBBBBBB");
        }
    }
    class C<T> where T:new()
    {
    }
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.data = 10;
            b.Data = 12;
            b.Data1 = 13;
            Console.WriteLine($"B:::data:{b.data},Data:{b.Data},Data1:{b.Data1}");
            b.Get();
            A a = b ;
            Console.WriteLine($"A:::data:{a.data},Data:{a.Data},Data1:{a.Data1}");
            a.data = 100;
            a.Data = 120;
            a.Data1 = 130;
            Console.WriteLine($"A:::data:{a.data},Data:{a.Data},Data1:{a.Data1}");
            a.Get();
            Console.WriteLine($"B:::data:{b.data},Data:{b.Data},Data1:{b.Data1}");
            b.Get();
            C<B> c = new C<B>();
        }
    }
}

结果:
在这里插入图片描述

b断点调试结果:
在这里插入图片描述

这里说明下,重写父类的变量其实是重新定义了一个新的变量,变量名相同是把父类的变量隐藏了,会增加内存

参考文章:
C#的new关键字的几种用法

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,没有this指针的概念。相对应的,在C#中使用this关键字来引用当前对象,它主要有以下几种用法: 1. 在成员方法中调用其他成员方法: ```csharp class MyClass { public void Func1() { Console.WriteLine("调用了Func1方法"); this.Func2(); } public void Func2() { Console.WriteLine("调用了Func2方法"); } } static void Main(string[] args) { MyClass obj = new MyClass(); obj.Func1(); } ``` 在成员方法Func1()中,我们使用了this关键字来调用成员方法Func2()。这里的this关键字实际上表示当前对象,因此可以通过this.Func2()来调用当前对象的成员方法Func2()。 2. 在构造函数中调用其他构造函数: ```csharp class MyClass { public MyClass() : this(0) { Console.WriteLine("调用了不带参数的构造函数"); } public MyClass(int x) { Console.WriteLine("调用了带一个参数的构造函数,参数为:" + x); } } static void Main(string[] args) { MyClass obj = new MyClass(); MyClass obj2 = new MyClass(10); } ``` 在构造函数MyClass()中,我们使用了this关键字来调用带一个参数的构造函数MyClass(int x)。这里的this关键字实际上表示当前对象,因此可以通过this(0)来调用当前对象的带一个参数的构造函数MyClass(int x),参数为0。 3. 在属性或方法中访问成员变量: ```csharp class MyClass { private int x; public int X { get { return this.x; } set { this.x = value; } } public void Func() { Console.WriteLine("X的值为:" + this.X); } } static void Main(string[] args) { MyClass obj = new MyClass(); obj.X = 10; obj.Func(); } ``` 在属性X的get和set方法以及成员方法Func()中,我们使用了this关键字来访问成员变量x。这里的this关键字实际上表示当前对象,因此可以通过this.X和this.x来访问当前对象的成员变量X和x。 需要注意的是,在C#中,this关键字是隐式存在的,不需要显式地使用this来引用当前对象。在大多数情况下,可以省略this关键字,并直接使用成员变量、成员方法或属性的名称来访问。但是,在与函数参数或局部变量名称发生冲突时,需要使用this关键字来明确地表示访问的是成员变量、成员方法或属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值