C#中的嵌套类型

文章介绍了嵌套类型的概念,即在类或结构内部声明的类型,并提供了嵌套类的示例。讨论了嵌套类型的访问修饰符,说明它们的访问级别类似于成员,而非类型。同时阐述了嵌套类型和封闭类型之间的访问关系,强调嵌套类型可以无限制地访问封闭类型的所有成员,而封闭类型只能访问嵌套类型的公共或受保护成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、什么是嵌套类型

二、嵌套类的示例

三、可见性和嵌套类型

1. 嵌套类型的访问修饰符

2. 嵌套类型和封闭类型之间的访问关系


一、什么是嵌套类型

在类或结构中声明类型(不是在命名空间中声明类型),嵌套类型可以是任意类型。


如果一个类只是作为帮助方法并且只对封闭类型有意义,可能就需要声明为嵌套类型了。(嵌套指类型声明的位置而不是内存中对象的位置)

 

二、嵌套类的示例

    class MyClass //封闭类
    {
        class MyCounter //嵌套类:计数器
        {
            public int Count { get; private set; }

            public static MyCounter operator ++(MyCounter current) 
            {
                current.Count++;
                return current;
            }
        }

        MyCounter counter;

        public MyClass() 
        {
            counter = new MyCounter();
        }

        public int Incr() { return (counter++).Count; }//增量方法
        public int GetValue() { return counter.Count; }//获取计数值
    
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.Incr();
            mc.Incr();
            mc.Incr();
            mc.Incr();
            mc.Incr();
            mc.Incr();
            Console.WriteLine("Total:{0}",mc.GetValue());

        }
    }

三、可见性和嵌套类型

1.嵌套类型的访问修饰符

类或类型的访问修饰符通常为public和internal,但是嵌套类型的可访问性类似于成员,嵌套类型拥有成员访问级别,而不是类型访问级别。

  1. 类内部的嵌套类型访问修饰符:public、protected、internal、protected internal、private
  2. 结构内部的嵌套类型访问修饰符:public、internal、private
  3. 嵌套类型的默认访问级别是private

2. 嵌套类型和封闭类型之间的访问关系

嵌套类型和封闭类型之间的访问关系是不对称的。

  1. 嵌套类型的成员对封闭类型的成员总是有完全访问权限。
  2. 封闭类型的成员:
    1. 总是可以访问嵌套类型本身
    2. 只能访问声明了有访问权限的嵌套类型成员

 class SomeClass //封闭类
    {
        int Field1 = 15;
        int Field2 = 20;
        MyNested mn;

        public SomeClass() 
        {
            mn = new MyNested(this);
        }

        public void PrintMyMembers() 
        { class SomeClass //封闭类
    {
        int Field1 = 15;
        int Field2 = 20;
        MyNested mn;

        public SomeClass() 
        {
            mn = new MyNested(this);
        }

        public void PrintMyMembers() 
        {
            mn.PrintOutMembers();
        }

        public class MyNested
        {
            SomeClass sc;

            public MyNested(SomeClass SC) 
            {
                sc = SC;
            }

            public void PrintOutMembers() 
            {
                Console.WriteLine("Field1 : {0}",sc.Field1);
                Console.WriteLine("Field2 : {0}",sc.Field2);
            }
        }
    }

    internal class class1
    {
        static void Main(string[] args)
        {
            SomeClass sc = new SomeClass();
            sc.PrintMyMembers();
        }
    }
            mn.PrintOutMembers();
        }

        public class MyNested
        {
            SomeClass sc;

            public MyNested(SomeClass SC) 
            {
                sc = SC;
            }

            public void PrintOutMembers() 
            {
                Console.WriteLine("Field1 : {0}",sc.Field1);
                Console.WriteLine("Field2 : {0}",sc.Field2);
            }
        }
    }

    internal class class1
    {
        static void Main(string[] args)
        {
            SomeClass sc = new SomeClass();
            sc.PrintMyMembers();
        }
    }

 

(注:内容学习总结自《C#图解教程》)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值