(二)CSharp-字段-属性-常量

news/2024/10/18 12:27:23/

一、字段

什么是字段

  • 字段(filed)是一种表示与对象或类型(类或结构体)关联的变量
  • 字段是类型的成员,旧称“成员变量”
  • 与对象关联的字段亦称“实例字段”
  • 与类型关联的字段称为“静态字段”,由 static 修饰

字段的声明

  • 参见 C# 语言定义文档
  • 尽管字段声明带有分号,但它不是语句
  • 字段的名字一定是名词

字段的初始值

  • 无显式初始化时,字段获得其类型的默认值,所以字段“永远都不会未被初始化”
  • 实例字段初始化的时机——对象创建时
  • 静态字段初始化的时机——类型被加载(load)时

只读字段

  • 实例只读字段
  • 静态只读字段

二、属性

1、什么是属性

  • 【1】属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态
  • 【2】属性是字段的自然扩展
    • 1)从命名上看,field 更偏向于实例对象在内存中的布局,property 更偏向于反映现实世界对象的特征
    • 2)对外: 暴露数据,数据可以是存储在字段里的,也可以是动态计算出来的
    • 3)对内: 保护字段不被非法值“污染”
namespace ConsoleApplication1
{class Program{static void Main(string[] args){try{Student stu1 = new Student();stu1.Age = 20;Student stu2 = new Student();stu2.Age = 200;int avgAge = (stu1.Age + stu2.Age) / 2;Console.WriteLine(avgAge);}catch(Exception ex){Console.WriteLine(ex.Message);}}}class Student{private int age;public int Age{get { return age; }set{if (value > 0 && value <= 120){this.age = value;}else{throw new Exception("Age value has error.");}}}}
}
  • 【3】属性由 Get/Set 方法对进化而来
  • 【4】又一个“语法糖”——属性背后的秘密

2、属性的声明

  • 完整声明——后台(back)成员变量与访问器(注意使用 code snippet 和 refactor 工具)
    (输入 propfull,按两下Tab,生成如下代码,便是完整声明)
 private int myVar;public int MyProperty{get { return myVar; }set { myVar = value; }}
  • 简略声明——只有访问器(查看 IL 代码)
   public int MyProperty { get; set; }
  • 动态计算值的属性
 class Student{private int age;public int Age{get { return age; }set { age = value; }}public bool CanWork{get{if(this.age >= 16){return true;}else{return false;}}}}
  • 注意实例属性和静态属性
  • 属性的名字一定是名词
  • 只读属性——只有 getter 没有 setter
    • 尽管语法上正确,几乎没有人使用“只写属性”,因为属性的主要目的是通过向外暴露数据而表示对象/类型的状态

3、属性与字段的关系

  • 一般情况下,它们都用于表示实体(对象或类型)的状态
  • 属性大多数情况下是字段的包装器(wraper)
  • 建议:永远使用属性(而不是字段)来暴露数据,即字段永远都是 private 或 protected 的

三、常量

1、常量的声明和定义

什么是常量

  • 常量(constant)是表示常量值(即,可以在编译时计算的值)的类成员
  • 常量隶属于类型而不是对象,即没有“实例常量”
  • 注意区分成员常量与局部常量

常量的声明
1、各种“只读”的应用场景

  • 为了提高程序可读性和执行效率——常量
  • 为了防止对象的值被改变——只读字段
  • 向外暴露不允许修改的数据——只读属性(静态或非静态),功能与常量有一些重叠
  • 当希望成为常量的值其类型不能被常量声明接受时(类/自定义结构体)——静态只读字段

2、和字段不同,属性是一个函数成员。

  • 它不一定为数据存储分配内存。
  • 它执行代码。

3、属性是一组(两个)匹配的、命名的、称为访问器的方法。

  • set 访问器为属性赋值。(有 value 参数和返回类型 void)
  • get 访问器从属性获取值。(返回类型 void)
  • 属性本身没有任何存储。访问器决定如何处理发送进来的数据,以及将什么数据发送出去。
    方法签名

由方法的名称和形参列表组成。具体来说,一个方法的签名由它的名称以及它的形参的个数、修饰符和类型组成。

只读和只写属性
要想不定义属性的某个访问器

  • 只有 get 访问器的属性称为只读属性。
  • 只有 set 访问器的属性称为只写属性。
  • 两个访问器中至少有一个必须定义,否则编译器会产生一条错误消息。

自动属性

请添加图片描述

静态属性

属性可以声明为 static。静态属性的访问器和所有静态成员一样,具有以下特点。

  • 不能访问类的实例成员,但能被实例成员访问。
  • 不管类是否有实例,它们都是存在的。
  • 在类的内部,可以仅使用名称来引用静态属性。
  • 在类的外部,可以通过类名或者使用 using static 结构来引用静态属性。

请添加图片描述

2、readonly 修饰符

const与readonly 的区别

  • const 字段只能在字段的声明语句中初始化,而 readonly 字段可以在下列任意位置设置它的值
    • 字段声明语句,类似于 const。
    • 类的任何构造函数、如果是 static 字段,初始化必须在静态构造函数中完成。
  • const 字段的值必须可在编译时决定,而 readonly 字段的值可以在运行时决定。这种自由性允许你在不同的环境或不同的构造函数中设置不同的值。
  • const 的行为总是静态的,而对于 readonly 字段以下两点是正确的。
    • 它可以是实例字段,也可以是静态字段。
    • 它在内存中有存储位置。

跟const 区别的用处-例子:

 class Shape{readonly double PI = 3.1416;readonly int NumberOfSides;public Shape(double side1,double side2){NumberOfSides = 4;}public Shape(double side1,double side2,double side3){NumberOfSides = 3;}}

http://www.ppmy.cn/news/248292.html

相关文章

Nginx进阶篇 :Nginx proxy服务器

1.代理原理 正向代理&#xff1a;内网客户端通过代理访问互联网&#xff0c;通常要设置代理服务器地址和端口。 反向代理&#xff1a;外网用户通过代理访问内网服务器&#xff0c;内网服务器无感知。 正向代理和反向代理的区别&#xff1a; (1)正向代理其实就是客户端的代理&am…

学习游戏服务器编程进阶篇之全球同服技术架构

笔者介绍&#xff1a;姜雪伟&#xff0c;IT公司技术合伙人&#xff0c;IT高级讲师&#xff0c;CSDN社区专家&#xff0c;特邀编辑&#xff0c;畅销书作者&#xff0c;国家专利发明人;已出版书籍&#xff1a;《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术…

部署代理服务 Squid

目录 代理 常见的代理软件 web 代理的功能 squid 代理的基本类型 传统代理配置&#xff1a; 1.添加双网卡&#xff0c;并配置 IP 地址 2.启用路由转发 3.解压并安装 squid 软件&#xff08;需要先将squid软件包拖进去&#xff09; 4.创建用户并优化服务 5.检查语法并…

【初探篇】反向代理在系统结构中的应用场景

&#x1f331;本专栏将会从基础开始&#xff0c;循序渐进讲解Nginx的使用和有关配置&#xff0c;也请大家多多支持,希望大家都能够从中获益。 &#x1f4eb;专栏地址:Nginx &#x1f4eb;相关软件:链接地址 文章目录 反向代理在系统结构中的应用场景Nginx的反向代理配置基于反向…

iss信息服务器,配置iss服务器

配置iss服务器 内容精选 换一换 可以。您可以在云服务器关机后,对云服务器变更规格。温馨提醒:目前包周期云服务器只支持升级配置。 网站接入WAF防护之后,若您访问网站时出现404 Not Found、502 Bad Gateway,504 Gateway Timeout等错误,请参考以下方法解决。网站接入WAF后…

独立服务器和vps的区别

独立服务器是指单独的一台服务器&#xff0c;而vps服务器大多是在独立服务器上面虚拟出来的共享服务器。 内存的区别&#xff0c;独立服务器是完全独立控制&#xff0c;100%内存独立使用权限&#xff1b;而vps则是和其他人共享&#xff0c;内存消耗较大&#xff0c;实际得到的可…

Varnish反向代理服务器和 HTTP 加速器

Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器&#xff0c;其采用全新的软件体系机构&#xff0c;和现在的硬件体系紧密配合&#xff0c;与传统的 squid 相比&#xff0c;varnish 具有性能更高、速度更快、管理更加方便等诸多优点。 什么是反向代理&#xff1f; …

游戏服服务器——DB服

服务器框架 https://blog.csdn.net/nie2314550441/article/details/105981967 一、DB服介绍 整个服务器&#xff08;除网站后台&#xff09;与数据库交互都是通过DB服进行。DB服用于数据库交互和数据缓存&#xff0c;使用sqlserver做为存储&#xff0c;用来保存用户的所有相关…