c#访问修饰符和修饰符_枚举和结构体有什么具体区别「建议收藏」

c#访问修饰符和修饰符_枚举和结构体有什么具体区别「建议收藏」C#基础语法_枚举成员如何访问

访问修饰符

访问修饰符属于关键字,可用于修饰类型、变量和函数等等,访问修饰符的含义如下表所示:

关键字 含义
public 访问不受限制
protected 访问限于包含类或派生自包含类的类型
internal 访问限于当前程序集
protected internal 访问限于当前程序集或派生自包含类的类型
private 访问限于包含类
private protected 访问限于包含类或当前程序集中派生自包含类的类型

按保护性可简单的划分为下图,其中public的保护性是最低的,private的保护性是最强的,而当多个访问修饰符配在一起时,取其最弱的保护性,例如protected internalinternal保护性弱于protected,因此protected internal可等价于internal

在这里插入图片描述
对访问修饰符的灵活应用程度,侧面反映了编程者编程水平的高低,当然这不代表全都用public的项目一定不好,只要能良好的控制代码那就是好项目。

枚举

语法说明

枚举是一种类型,由关键字enum声明,语法如下:

enum <enum_name>
{ 
    enumeration list 
};

其中:

  • enum_name ,指定枚举的类型名称;
  • enumeration list 是一个用逗号分隔的成员列表;
  • 每个成员都代表一个整数值,默认情况下,第一个成员的值是 0;
  • 一般习惯命名枚举类名带上Enum后缀,枚举成员名称全大写。

创建好枚举变量后通过符号.访问成员,使用方法如下:

枚举变量. 枚举成员;

例子

在解决方案中新建enum.cs专门用于存放枚举变量,便于维护代码。
在这里插入图片描述

定义枚举

枚举星期,星期一到星期天代表数字1-7,代码如下:

enum WeekEnum  //枚举星期
{ 
   
	MONDAY = 1, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY = 7
};  //MONDAY = 1指定此处从1开始,后续TUESDAY会自动赋值为2。

调用枚举

打印输出枚举变量所代表的数值,利用WeekEum.TUESDAY访问枚举成员,通过显式转换枚举变量获取枚举变量所代表的值,代码如下:

static void Main(string[] args)
{ 
   
	Console.WriteLine(WeekEnum.TUESDAY + "=" + (int)WeekEnum.TUESDAY);
}

当然你也可以随意更改赋值,例如:

enum ExampleEnum
{ 
   
	MONDAY = 1, FRIDAY = 5, TUESDAY, SUNDAY = 0, WEDNESDAY, THURSDAY,  SATURDAY
};

TUESDAY会根据前一成员FRIDAY顺序赋值为6,而WEDNESDAY会顺序赋值为1,同理THURSDAY顺序赋值为2,具体需要根据应用情景来赋值。

可访问性

对于枚举而言,其默认可访问性为public,并且无法显式声明为privateprotected等,如下表所示:

成员 默认成员可访问性 允许的成员的声明的可访问性
enum public

下图演示了使用private修饰枚举变量,IDE提示报错,表明枚举变量不可被其他修饰符修饰:

在这里插入图片描述

小结

1.枚举是一种类型,形同intdouble等;
2.枚举类名带上Enum后缀,枚举成员名称全大写;
3.枚举变量中每一成员都对应一个整数值,默认按先后顺序递增;
4.枚举变量是隐式public,不可显式声明被修饰为其他可访问性。

结构体

语法说明

结构体是一种类型,由关键字struct声明,语法如下:

<access specifier> struct struct_name
{ 
	// member variables
    <access specifier> <data type> variable1;
    <access specifier> <data type> variable2;
    ...
    <access specifier> <data type> variableN;
    // member methods
    <access specifier> <return type> method1(parameter_list)
    {
        // method body
    }
    <access specifier> <return type> method2(parameter_list)
    {
        // method body
    }
    ...
    <access specifier> <return type> methodN(parameter_list)
    {
        // method body
    }
};

其中:

  • struct_name ,指定结构体的类型名称;
  • variableN,methodN是一个用分号分隔的成员列表,variableN称为字段或者成员变量,methodN称为方法或成员函数;
  • < access specifier > 指定了可访问性,< data type > 指定了变量类型,< return type > 指定了返回的数据类型;
  • 结构体应遵循大峰驼命名法,命名时首字母应大写。

创建好结构体变量后通过符号.访问成员,使用方法如下:

结构体变量. 变量;
结构体变量. 方法();

例子

定义结构体

创建结构体Moives,含有电影名和导演等信息与显示信息函数,并重载构造函数,代码如下:

struct Moives
{ 
   
    //结构体中默认成员可访问性为private
    public string strTitle;  //电影名称
    public string strType;  //电影类型
    public int year;  //电影年份
    public string strDirector;  //导演
    public Moives(string titile,string type,int year,string director)  //有参构造函数
    { 
   
        strTitle = titile;
        strType = type;
        this.year = year;  //this.year指成员变量,year指临时变量
        strDirector = director;
    }
    public void showDetail()  //CSharp中结构体可包含方法、字段、索引、属性、运算符方法和事件
    { 
   
        Console.WriteLine("电影名:{0},电影类型:{1},上映年份:{2}年,导演:{3}", this.strTitle, this.strType, this.year, this.strDirector);
    }
};

注意:在结构体内部不可给成员赋值且重载构造函数时必须为所有的成员变量赋值。

在这里插入图片描述

调用结构体

分别使用了默认无参构造函数创建结构体变量MyCountry和有参构造函数创建结构体变量TheCaptain,利用数组存储结构体并用符号.访问成员函数输出结构体中的信息,代码如下:

static void Main(string[] args)
{ 
   
    /* 方法一:利用默认的无参构造函数实例化结构体 */
    Moives MyCountry;  //声明MyCountry,类型为Moives,结构体可不使用new来创建
    /// 更推荐使用Moives MyCountry = new Moives(); //使用默认的无参构造函数实例化结构体
    MyCountry.strTitle = "我和我的父辈";
    MyCountry.strType = "剧情片";
    MyCountry.year = 2021;
    MyCountry.strDirector = "吴京";  //不使用new时MyCountry所有成员初始化后才被实例化
    /* 方法二:利用有参构造函数实例化结构体*/
    Moives TheCaptain = new Moives("中国机长", "灾难片", 2019, "刘伟强");  //声明TheCaptain,类型为Moives,初始化
    /// 使用重载的有参构造函数实例化结构体,参数1:电影名,参数2:电影类型,参数3:年份,参数4:导演
    Moives[] moives = new Moives[2] { 
    MyCountry, TheCaptain };  //创建moives数组并初始化
    for(int index = 0; index < moives.Length; index++)  //打印数组
    { 
   
        Console.WriteLine("MyCountry,电影名:{0},电影类型:{1},上映年份:{2}年,导演:{3}", moives[index].strTitle, moives[index].strType, moives[index].year, moives[index].strDirector);
        /// 等价于moives[index].showDetail();
    }
}

注意:
1.在结构体中不能重载无参构造函数;

在这里插入图片描述

2.在不使用关键字new时不会调用无参构造函数,必须将该结构体变量的所有成员变量赋值后才会被实例化。

在这里插入图片描述

可访问性

在C#中对于结构体而言,成员的默认可访问性为private,如下表所示:

成员 默认成员可访问性 允许的成员的声明的可访问性
struct private public
internal
private

下图演示了不使用访问修饰符修饰结构体成员变量时,外部结构体访问内部信息时IDE提示报错,表明结构体变量的默认可访问性为private

在这里插入图片描述

小结

1.结构体是一种类型,形同intdouble等,可用数组存储;
2.结构体中可含有方法、字段、索引、属性、运算符方法和事件等;
3.结构体中声明的字段无法赋予初值且重载构造函数中必须为结构体所有字段赋值;
4.结构体变量可以不使用new创建,但需要为结构体所有字段赋值才会被实例化,否则无法调用;
5.结构体中无法重载无参构造函数,无参构造函数是默认构造函数在结构体中不能重载;
6.结构体中成员是隐式private,可显式声明为其他可访问类型。

类在面向对象的语言中起到一个十分重要的作用,它体现了面向对象语言的特性 —— 抽象,所谓抽象简单来说就是将我们现实世界抽象成程序代码。

语法说明

类是一种类型,由关键字class声明,语法如下:

<access specifier> class class_name
{ 
	// member variables
    <access specifier> <data type> variable1;
    <access specifier> <data type> variable2;
    ...
    <access specifier> <data type> variableN;
    // member methods
    <access specifier> <return type> method1(parameter_list)
    {
        // method body
    }
    <access specifier> <return type> method2(parameter_list)
    {
        // method body
    }
    ...
    <access specifier> <return type> methodN(parameter_list)
    {
        // method body
    }
};

其中:

  • class_name ,指定类的类型名称;
  • variableN,methodN是一个用分号分隔的成员列表,variableN称为字段或者成员变量,methodN称为方法或成员函数;
  • < access specifier > 指定了可访问性,< data type > 指定了变量类型,< return type > 指定了返回的数据类型;
  • 类应遵循大峰驼命名法,命名时首字母应大写,同时当字段为私有成员变量时命名以下划线开头进行区分,例如_variableN。

例子

在解决方案中新建Teacher.cs专门用于存放Teacher类,便于维护代码。
在这里插入图片描述

定义类

创建类Teacher,含有教师名、上课信息与上课函数,教师每上课40ms后就下课,并重载构造函数,代码如下:

class Teacher
{ 
   
    public string name { 
    get; private set; }  //外部只读
    bool _isHavingClass = false;
    public void attendClass()
    { 
   
        string time = DateTime.Now.ToString("HH:mm:ss");
        if (!this._isHavingClass)
        { 
   
            Console.WriteLine(time + "||" + this.name + "老师上课了");
            this._isHavingClass = true;
            System.Timers.Timer timer = new System.Timers.Timer(4000);  //实例化Timer类,设置时间间隔4000ms
            timer.Elapsed += new System.Timers.ElapsedEventHandler(finishClass);  //到达时间时执行的事件
            timer.AutoReset = false;  //设置执行一次
            timer.Start();  //开始执行
        }
        else
        { 
   
            Console.WriteLine(time + "||" + this.name + "老师正忙");
        }
    }
    void finishClass(object o, System.Timers.ElapsedEventArgs e)
    { 
      //与委托ElapsedEventHandler匹配重载
        string time = DateTime.Now.ToString("HH:mm:ss");
        Console.WriteLine(time + "||" + this.name + "老师下课了");
        this._isHavingClass = false;
    }
    ~Teacher()  //析构函数
    { 
   
        Console.WriteLine("走了个老师");
    }
    public Teacher()  //重载的无参构造函数
    { 
   
        Console.WriteLine("来了个新老师");
    }
    public Teacher(string name)  //重载的有参构造函数
    { 
   
        this.name = name;
        Console.WriteLine("来了个新老师叫" + name);
    }
}

注意:在类外部不可以给默认的成员赋值。

在这里插入图片描述

调用类

分别使用了重载的无参构造函数创建author和有参构造函数创建me,

static void Main(string[] args)
{ 
   
	/* 方法一:利用重载的无参构造函数 */
	Teacher author = new Teacher();  //创建变量并实例化
	//author.name = "吾门"; //初始化成员变量
	/* 方法二:利用有参构造函数 */
	Teacher me = new Teacher("吾门");  //创建变量并实例化
	me.attendClass();  //上课
	Console.ReadKey();  //让窗体保存接受外部参数的状态来达到不退出的效果
}

注意:此时会Teacher类中的name实际上的为只读字段,外部不可修改,只可以获取。

在这里插入图片描述

需要注意强调的是,当声明了有参构造函数后,编译器将不再提供默认的无参构造函数,此点需要格外注意。

在这里插入图片描述
在这里插入图片描述

可访问性

在C#中对于类而言,成员的默认可访问性为private,如下表所示:

成员 默认成员可访问性 允许的成员的声明的可访问性
class private public
protected
internal
private
protected internal
private protected

下图演示了不使用访问修饰符修饰类中成员变量时,外部类变量访问内部信息时IDE提示报错,表明类成员变量的默认可访问性为private:

在这里插入图片描述在这里插入图片描述

注意:内部成员函数作为类的一个成员,可以访问该类的内部的所有成员,包括被保护性最强的修饰符private所修饰的成员变量。无论是从面向对象编程的角度还是设计模式的角度出发,成员变量是对象的属性,应让它们保持私有来实现封装,这些变量使用public所修饰的公共成员函数来访问。

小结

1.类是一种类型,形同intdouble等,可用数组存储;
2.类中可含有方法、字段、索引、属性、运算符方法和事件等;
3.类中默认声明的字段可以赋予初值且重载构造函数无需为类的所有字段赋值;
4.创建类变量时必须使用new创建,否则无法实例化对象,始终为无法被调用的null;
5.类中可以重载构造函数和析构函数,声明有参构造函数后不再提供默认构造函数;
6.类中所有成员是隐式private,可显式声明为其他可访问类型。

今天的文章c#访问修饰符和修饰符_枚举和结构体有什么具体区别「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85816.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注