c# 字段、属性的特性
类的成员:
1. 常量 → 固定的值
2. 字段(变量) → 会变化的值
3. 属性 → 受保护的值
4. 方法 → 一系列动作和行为
5. 运算符 → 特定的运算方式(=,+,-,*,/,%,>=,<=...........)
6. 构造方法 → 按照特定的结构创造、产生东西的方法
如下代码示例
1 namespace 变量_字段_属性//命名空间 2 { 3 class Program//类 4 { 5 static void Main(string[] args)//主方法 6 { 7 QQ myQQ = new QQ(); 8 //类 对象 = new 构造方法←创建对象的方法 9 10 Console.WriteLine("请输入用户名(按回车键结束):"); 11 string myYongHuMing = Console.ReadLine();//变量 12 Console.WriteLine("请输入密码(按回车键结束):"); 13 string myMiMa = Console.ReadLine();//变量 14 15 myQQ.注册(myYongHuMing, myMiMa); 16 Console.ReadLine(); 17 } 18 } 19 class QQ//类 20 { 21 //在类中,存储数据的变量,称为成员变量,也叫字段 22 public string 注册时间; //字段(成员变量):会变化的值 23 public string QQYongHuMing; //字段(成员变量):会变化的值 24 string 注册MiMa; 25 26 //属性:受保护的值 27 //属性和方法的区别在于:属性没有()、属性没有形参 28 //属性和变量的区别在于:变量没有 { } 29 string QQMiMa//只能读,不能写 30 { 31 get { return 注册MiMa; }//读 32 } 33 public QQ()//构造方法:按照特定的结构,创造、产生东西的方法。构造方法名和类名相同 34 { 35 } 36 public void 注册(string myYongHuMing, string myMiMa)//方法:一系列动作和行为 37 { 38 QQYongHuMing = myYongHuMing; 39 注册MiMa = myMiMa;//变量 40 注册时间 = DateTime.Now.ToString(); 41 Console.WriteLine("{0}注册成功!注册时间为:{1}", QQYongHuMing, 注册时间); 42 } 43 } 44 }
一、字段的定义
字段是在类或结构中直接声明的任意类型变量。
声明一个字段,可以用访问修饰符+类型+变量名称来声明,如下示例:
1 public class 家庭 2 { 3 public int 成员数量; 4 public staitc string 口号; 5 protected readonly int 星级; 6 }
二、属性定义
属性语法是字段的自然延申,属性需要有get或者set的访问器。
声明一个属性,可以用访问修饰符+类型+变量名称来声明,如下示例:
public class 家庭 { public int 成员数量{ge;set;} public staitc string 口号{ge;set;} protected readonly int 星级{ge;set;} }
三、字段的特性
1.字段通常不使用public关键字,仅在private和protected时才建议使用。如果您要使用public时,建议转为属性。这是为了符合面向对象设计的原因。简单一句话理解就是字段对内,属性对外。
2.可以对字段使用static关键字,这可使字段让调用方在任何时候进行调用,即使不存在任何类的实例。
3.也可以对字段使用static readonly关键字,这样很像const关键字。它们之间的区别是static readonly需要在运行时才可以访问,而const则编译的时候就已经可以访问了。
4.字段是在对象实例的构造函数被调用之前便初始化。 如果构造函数分配了该字段的新值,则它将覆盖在字段声明期间给定的任何值。
5.字段可以使用ref、out关键字传递。
四、属性的特性
1.属性需要定义访问器get或者set,或者两者都有。
2.属性可以隐式定义,即只有简单的get、set。这样声明会非常简洁。如:public int 成员数量 { get; set; }
3.属性还可以使用缓存式定义,这对于一些特殊情形下,非常有用,它通常会结合字段来进行缓存。如下示例:
1 private int _number; 2 public int 成员数量 3 { 4 get 5 { 6 return this._number; 7 } 8 set 9 { 10 this._number = value; 11 if(this._number > 6 ) 12 { 13 this.星级一; 14 } 15 } 16 }
4.字段是变量,但属性不是变量噢。变量是可以使用ref、out关键字传递的,所以字段可以,但属性不可以。
5.属性可以抽象、虚化、密封,即属性可以加上abstract、virtual、sealed关键字。
五、其它的高级特性
1.老是使用get访问器,我是不是等于每次都调用一下方法,这样是不是增加了额外开销?
答:是等于调用方法,但不会增加额外开销。编译器已经自动优化了get访问器,不会产生额外开销。但是当该属性声明为virtual关键字,由于编译器搞不清楚会不会被子类重写属性,所以,这种情况下会产生额外开销。
2.编写属性时,我可以在get访问器更改缓存字段的值吗?
1 private int _number; 2 public int 成员数量 3 { 4 get 5 { 6 return this._number; 7 } 8 set 9 { 10 this._number = value; 11 if(this._number > 6 ) 12 { 13 this._number = 6;; 14 } 15 } 16
答:如上图,您可以更改缓存字段_number的值。但是这是一种非常差劲的编码风格。您不应该去更改_number字段的值,它的作用就让它仅仅用于记录缓存就好。
版权声明:本文为CSDN博主「4564344」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_31653645/article/details/113055459
版权声明:本文为CSDN博主「MrLc666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sakenc/article/details/95042964
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人