字段
什么是字段
- 字段(field)是一种表示与对象或类型(类与结构体)关联的变量
- 字段是类型的成员,旧称“成员变量”
- 与对象关联的字段称为“静态字段”,由static修饰
字段的声明
- 尽管字段的声明带有分号,但他不是语句
- 字段的名字一定是名称
字段的初始值
- 五显式初始化时,字段获得其类型的默认值,所以字段“永远都不会未被初始化”
- 实例字段初始化的时机——对象创建时,必须实例化才可以使用
- 静态字段初始化的时机——类型被加载(load)时,不用实例化就可以使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 实例字段和静态字段
{
class Program
{
static void Main(string[] args)
{
List<Student> stulist = new List<Student>();
for (int stu = 0; stu < 100; stu++)
{
Student student = new Student();
student.Age = 24; //此处调用非静态变量,必须实例化才可以使用
student.Score = stu;
stulist.Add(student);
}
int totalAge = 0;
int totalScore = 0;
foreach (var item in stulist)
{
totalAge += item.Age;
totalScore += item.Score;
}
Student.AverageAge = totalAge / Student.Amount; //此处调用静态变量,可以不用实例化
Student.AverageScore = totalScore / Student.Amount;
Console.WriteLine("平均年龄为:{0}",Student.AverageAge);
Console.WriteLine("平均成绩为:{0}",Student.AverageScore);
}
}
class Student
{
public int Age;
public int Score;
public static int AverageAge;
public static int AverageScore;
public static int Amount;
public Student()
{
Student.Amount++;
}
public static void ReportAmount()
{
Console.WriteLine(Student.Amount);
}
public static void ReportAverageAge()
{
Console.WriteLine(Student.AverageAge);
}
public static void ReportAverageScore()
{
Console.WriteLine(Student.AverageScore);
}
}
}
/*平均年龄为:24
* 平均成绩为:49
*/
属性
什么是属性
-
属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态
-
属性是字段的自然拓展
从命名上来看,field更偏向于实例化对象在内存的布局,property更偏向于反映现实世界对象的特征
对外:暴露数据,数据可以是储存在字段里的,也可以是动态计算出来的
对内:保护字段不被非法值“污染” -
属性有Get/Set方法对进化而来
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 私有字段
{
class Program
{
static void Main(string[] args)
{
try
{
Student student = new Student();
Console.WriteLine("请输入年龄值:");
int age = Int32.Parse(Console.ReadLine());
student.Setage(age);
Console.WriteLine("这位同学的年龄为:{0}", student.Getage());
}
catch (Exception ex) //抓住异常
{
Console.WriteLine(ex.Message); //输出异常
}
}
}
class Student
{
private int age;
public int Getage() //获取字段值的方法
{
return this.age;
}
public void Setage(int value) //对字段进赋值,此处就可以控制字段的输入形式
{
if (value>=0&&value<=120)
{
this.age = value;
}
else
{
throw new Exception("年龄输入超限!!"); //抛出异常,但不会在输出端显示出来,可以结合catch语句搭配使用
}
}
}
/*输入:20
*输出:这位同学的年龄为:20
*输入:1212
*输出:年龄输入超限!!
*输入:输入字符串的格式不正确。
*/
}
使用get–set方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 私有字段
{
class Program
{
static void Main(string[] args)
{
try
{
Student2 student2 = new Student2();
Console.WriteLine("请输入年龄值:");
int age = Int32.Parse(Console.ReadLine());
student2.Age = age;
Console.WriteLine("这位同学的年龄为:{0}", student2.Age);
}
catch (Exception ex) //抓住异常
{
Console.WriteLine(ex.Message); //输出异常
}
}
public class Student2
{
public int Age
{
get
{
return this.Age;
}
set
{
if (value >= 0 && value <= 120)
{
this.Age = value;
}
else
{
throw new Exception("年龄输入超限!!"); //抛出异常,但不会在输出端显示出来,可以结合catch语句搭配使用
}
}
}
}
}
}
/*输入:20
*输出:这位同学的年龄为:20
*输入:1212
*输出:年龄输入超限!!
*输入:输入字符串的格式不正确。
*/
属性的声明
- 完整的声明——后台(back)成员变量与访问器(注意使用code snippet和refactor工具)
- 简略声明——只有访问器(prop,再双击Tab键)
public class Student
{
public Guid id { get; set; }
public string age { get; set; }
}
- 可以利用set方法动态计算值
- 只读属性:只有getter没有setter
属性与字段的关系
- 一般情况下,他们都用于表示实体(对象或类型)的状态
- 属性大多数情况下是字段的包装器(wrapper)
- 建议:永远使用属性(而不是字段)来暴露数据,即字段永远都是private或protected
索引器(概述)
什么是索引器
索引器(快捷键:输入indexer后,再双击Tab键)是这样一种成员:他使对象能够用与数组相同的方式(即下标)进行索引
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 索引器
{
class Program
{
static void Main(string[] args)
{
Student student = new Student();
student["math"] = 90;
var mathscaore = student["math"];
Console.WriteLine(mathscaore);
}
}
class Student
{
private Dictionary<string, int> keyValuePairs = new Dictionary<string, int>();
//声明索引器indexer,双击Tab
public int? this[string subject]
{
get {
if (this.keyValuePairs.ContainsKey(subject))
{
return this.keyValuePairs[subject];
}
else
{
return null;
}
}
set {
if (value.HasValue==false)//检查value是否为空值
{
throw new Exception("对不起,值不可以为空值!!");
}
if (this.keyValuePairs.ContainsKey(subject))
{
this.keyValuePairs[subject] = value.Value; //可空类型获取值的方法
}
else
{
this.keyValuePairs.Add(subject, value.Value);
}
}
}
}
}
//输出:90
常量
什么是常量
- 常量(constant)是表示常量值(即:可以在编译时计算的值)的类成员
- 常量隶属于类型而不是对象,即没有“实例常量”
实例常量的角色由只读实例字段来担当 - 注意区分成员常量与局部常量
常量的应用场景
- 为了提高程序的可读性和执行效率——常量
- 为了防止对象的值被改变——只读字段
- 向外暴露不允许被修改的数据——只读属性(静态或非静态),功能与常量有一些重叠
- 当希望成为常量的值其类型不能被常量声明接收时(类/自定义结构体)——静态只读字段