嵌套类与匿名类

1、嵌套类

   在C#中,可以将类定义在另一个类的内部,被包含的类称作嵌套类,而包含嵌套类的类就称作外部类。

   实际上,嵌套类与普通类相似,只是被声明的位置比较特殊,致使其访问权限与引用方式与普通类有所区别

csharp 复制代码
 class Outer
    {
        class Nesting//声明嵌套类
        {
            public int num = 10;
        }
        //定义OuterMethod方法
        public void OuterMethod()
        {
            Nesting nesting = new Nesting();//在外部类方法中创建嵌套类的对象
            Console.WriteLine("调用嵌套类的字典num="+nesting.num);//调用嵌套类的字段,那么字段必须是共有的
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Outer outer = new Outer();
            outer.OuterMethod();
            Console.ReadKey();
        }
    }

 注意:外部类与嵌套类的非静态成员可以重名,在对非静态成员访问时,需要先创建它所在类的对象。在嵌套类内可以声明静态成员,也可以直接引用外部类的静态成员,想要在作用域范围之外引用嵌套类,需要使用类似"Outer.Nesting"的完整限定名方式

csharp 复制代码
class Outer
    {
        public string name = "Outer";
        public class Nesting
        {
            public string name = "Nesting";
            void ShowName()
            {
                Console.WriteLine(name);
            }
        }
    }
    class Program
    {
        public static void Main(string[] args)
        {
            Outer.Nesting nesting = new Outer.Nesting();
            //此处Nesting nesting=new Nesting();是不对的,因为默认在Program类下找Nesting,是找不到
            Console.WriteLine(nesting.name);
        }
    }

匿名类

  有时候某个类的实例只会用到一次,这时可以使用匿名类的方式创建实例,即无需显式定义一个类,就可以将一组只读属性封装到单个对象中。

csharp 复制代码
  static void Main(string[] args)
        {
            //创建匿名对象
            var Anon = new { Name = "小小", Age = 3, Sex = '男' };
            //在控制台输出匿名对象Anon的属性
            Console.WriteLine("我的名字是:{0},性别为:{1},年龄是:{2}岁",Anon.Name,Anon.Sex,Anon.Age);
            Console.ReadKey();
        }

对象初始化器与集合初始化器

1、对象初始化器

  在一个类中,通常是使用构造方法来为属性赋值吗,当一个类中属性过多时,不可能为每种情况都创建一个构造方法,此时可以使用对象初始化器为属性赋值,对象初始化器的语法格式。

csharp 复制代码
类名 变量名=new 类名(){属性名=值,属性名=值,....};
上述语法格式可以看出对象初始化器可以同时为类的多个属性赋值,从而打打减少对象初始化的代码
csharp 复制代码
 class Person
        {
            //在Person类中定义Age、Gender、Name属性
            int age;
            public int Age
            {
                set { age = value; }
                get { return age; }
            }
            char gender;
            public char Gender
            {
                set { gender = value; }
                get { return gender; }
            }
            string name;
            public string Name
            {
                set { name = value; }
                get { return name; }
            }
        }
        
        static void Main(string[] args)
        {
            //初始化对象并使用对象初始化器为属性赋值
            Person p1 = new Person() { Name = "小小", Age = 3, Gender = '男' };//此处的()可无
            Console.WriteLine("我的名字是:" + p1.Name + ",性别为:" + p1.Gender + ",年龄是:" + p1.Age + "岁");
            Person p2 = new Person { Name = "小红", Age = 23 };
            Console.WriteLine("我的名字是:" + p2.Name + ",年龄是:"+ p2.Age + "岁");
            Console.ReadKey();
        }

2、集合初始化器

csharp 复制代码
List<int> list=new List<int>(){1,2,3,4,5};
int i=list.Count;
Console.WriteLine(i.ToString());
Console.WriteLine(list[1]);
相关推荐
Wang's Blog4 分钟前
Java 项目实战: 交友项目 - 喜欢与取消喜欢
java·开发语言·交友
quantdash_cc40 分钟前
如何检查滚动收益率计算中的窗口长度不足?——从数学定义到 Pandas 实现
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
衍生星球1 小时前
【Java 语言】— 方法(方法定义、调用、参数、返回值、方法重载)
java·开发语言·方法
CodeGL1 小时前
16、Python Web开发
开发语言·前端·python
喵了几个咪1 小时前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
开发语言·后端·clickhouse·微服务·golang·gowind
FRing031 小时前
JavaScript入门到精通二十九(内置构造函数(Object、Array))
开发语言·前端·javascript
syagain_zsx1 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小嘉丶学长1 小时前
Day08 · 字符串(二)
服务器·开发语言·python·学习·1024程序员节
萌动的小火苗2 小时前
MQTT的QoS0、QoS1、QoS2有什么区别?
开发语言·网络·python·php·信息与通信
买房动力十足2 小时前
秒杀商城 + AI 运营:Lua 防超卖、MQ 削峰,AI 负责选品和策划
开发语言·人工智能·lua