首页 > 技术文章 > C#中的字段,属性,常量

AMzz 2020-04-16 15:58 原文

C#中的字段,属性,常量

字段(field)

一种表示与对象或类型(类或结构体)关联的变量,旧称成员变量

(attributes)(field-modifiers) type variable-declarators; //字符声明,括号表示可选
  • 实例字段,与对象关联的
  • 静态字段,与类型关联的,由static修饰的字段

字段修饰符field-modifier

  • public,protected,private

  • new(显式隐藏从基类继承的成员)

  • internal(同一个程序集中可访问)

  • static

  • readonly(只读)

    一旦初始化就无法再赋值

  • volatile(易变的,常用于多线程)

关于internal: https://www.cnblogs.com/wowoblog/p/6970502.html

字段初始值

  • 显式初始化(在声明时初始化或使用构造函数)
    • 实例字段(其初始化在创建的时候)
    • 静态字段(其初始化在加载时唯一构造一次,对应静态构造函数)
  • 隐式初始化,字段获得该类型默认值

属性(property)

一种用于访问对象或类型的特征的成员,是字段的进化

C++中用private来封装类中的成员变量,用public定义取值方法和修改方式,以此来保护值不被污染(被赋予超出可能性赋值范围的值)

class Program
{
	static void Main(string[]ages)
	{
		People man1=new People();
		man1.SetAge(1000);
		Console.WriteLine(man1.GetAge());
	}
}
class People
{
	private int age;
	public int GetAge()
	{
		return age;
	}
	public int SetAge(int num)
	{
		age=num;
	}
}
//Output:man1's age = 1000
//显然年龄不可能为1000,该年龄为错误值

相同作用但使用属性表示

private int age
{
	get
	{
     	return age;
     }
     set
     {
     	if(value>0&&value<130)
        {
        	this.age = value;
        }
        else	//若数值错误,则抛出异常
        {
            throw new Exception("error age");
        }
      }
}

属性一般格式

private/protected  type variable-declarators
modifiers type variable-declarators
{
	get 
	{
		......
	}
	set   
	{
		......  //临时值value为传入值固定名字
	}
}

​ 在VS里面快捷生成先输入propfull再按两下Tab键即可快捷完整生成一个属性,每按一下Tab键跳转位置,自定义修改该属性,而使用prop然后按下两下Tab键则是快捷简单生成一个属性,此时该简单生成的属性类似于一个字段,如下

private int myVar;					//propfull
public int MyProperty
{
	get { return myVar; }
	set { myVar = value; }
}

public int MyProperty { get; set; }   //prop

​ VS中还提供了选中变量声明,鼠标右键选中重构,可以帮你封装成属性或者仍用字段

​ 而在set和get前添加访问修饰符,能限定外部无法修改或访问该字段;或者删除其中一个,还能限定该字段只读或只写,但一般只会设置只读而不会设置只写

​ 总的来说,属性和字段核心作用是一样的,但属性一般算是字段的包装,推荐永远使用属性暴露数据(可以保护字段),将其字段用private或protected封装起来

常量(constant)

modifiers const <data_type> <constant_name> = value;

不同只读场景的不同区别

  • 为提高程序执行效率--常量
  • 为防止对象的值被修改--只读字段
  • 为暴露不可修改的数据--只读属性
  • 当希望成为常量的值其类型(类/结构体)不能被常量声明接受时--静态只读字段

推荐阅读