C#字段和属性小结

来源:互联网 发布:linux system函数用法 编辑:程序博客网 时间:2024/04/29 23:23
一、

对于c#的学习多是集中于web方向的那些控件操作,以及一些简单的逻辑,导致很多基础性的知识不是很扎实,今天正好有时间和兴趣,就补了一下这方面的知识。
这部分主要是关于属性,字段以及方法的概念:
为什么有属性?首先是直接把数据字段公开不好,其次是有时候需要对一些用户的输入进行验证,输出有时也需要计算
代码:
using System;

#region //使用属性来读写类中的字段,从而实现对字段的保护
//字段标识符小写,而属性一般以每个单词的第一个字母大写
public class Student
{
public string name;
public int id;
public int age=22;

//set中的判断
public int Id
{
get { return id; }
set {
if (value< 100)
id = value;
else
id = 100;
}
}

//get后的计算
public string Name
{
get { return "Hello "+name; }
set { name = value; }
}
//Age是只读属性
public int Age
{
get { return age; }
}
}

class Test
{
public static void Main()
{
Student stu = new Student();
stu.Name = "beijing";
stu.Id = 123;
//stu.age = 3;正确。属性只读,但是字段可以改
//stu.Age=3;错误。只读属性不可以设

Console.WriteLine("{0}---{1}--{2}",stu.Id,stu.Name,stu.Age);

}
}
#endregion
这里有三个字段name ,id ,age;对应三个属性:Name,Id,Age。Id属性用set对输入进行判断,Name属性get对输出做了修改,Age为只读属性
另外:属性也不同于方法,它没有圆括号,不必指定返回值类型。set{;}get{;}

来源:http://www.enet.com.cn/article/2007/1023/A20071023879379.shtml
二、

类的字段和属性
 一般把类或结构中定义的变量和常量叫字段。属性不是字段,本质上是定义修改字段的方法,由于属性和字段的紧密关系,把它们放到一起叙述。
静态字段、实例字段、常量和只读字段
 用修饰符static声明的字段为静态字段。不管包含该静态字段的类生成多少个对象或根本无对象,该字段都只有一个实例,静态字段不能被撤销。必须采用如下方法引用静态字段:类名.静态字段名。如果类中定义的字段不使用修饰符static,该字段为实例字段,每创建该类的一个对象,在对象内创建一个该字段实例,创建它的对象被撤销,该字段对象也被撤销,实例字段采用如下方法引用:实例名.实例字段名。用const修饰符声明的字段为常量,常量只能在声明中初始化,以后不能再修改。用readonly修饰符声明的字段为只读字段,只读字段是特殊的实例字段,它只能在字段声明中或构造函数中重新赋值,在其它任何地方都不能改变只读字段的值。例子:
public class Test
{ public const int intMax=int.MaxValue;//常量,必须赋初值
 public int x=0;//实例字段
 public readonly int y=0;//只读字段
 public static int cnt=0;//静态字段
 public Test(int x1,int y1)//构造函数
 { //intMax=0;//错误,不能修改常量
  x=x1;//在构造函数允许修改实例字段
  y=y1;//在构造函数允许修改只读字段
  cnt++;//每创建一个对象都调用构造函数,用此语句可以记录对象的个数
 }
 public void Modify(int x1,int y1)
 { //intMax=0;//错误,不能修改常量
  x=x1;
  cnt=y1;
  //y=10;//不允许修改只读字段
 }
}
class Class1
{ static void Main(string[] args)
 { Test T1=new Test(100,200);
  T1.x=40;//引用实例字段采用方法:实例名.实例字段名
   Test.cnt=0;//引用静态字段采用方法:类名.静态字段名
  int z=T1.y;//引用只读字段
   z=Test.intMax;//引用常量
 }
}
属性
 C#语言支持组件编程,组件也是类,组件用属性、方法、事件描述。属性不是字段,但必然和类中的某个或某些字段相联系,属性定义了得到和修改相联系的字段的方法。C#中的属性更充分地体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,借助于get和set方法对属性的值进行读写。访问属性值的语法形式和访问一个变量基本一样,使访问属性就象访问变量一样方便,符合习惯。
 在类的基本概念一节中,定义一个描述个人情况的类Person,其中字段name和age是私有字段,记录姓名和年龄,外部通过公有方法SetName和SetAge修改这两个私有字段。现在用属性来描述姓名和年龄。例子如下:
using System;
public class Person
{ private string P_name="张三"; //P_name是私有字段
 private int P_age=12; //P_age是私有字段
 public void Display() //类的方法声明,显示姓名和年龄
 { Console.WriteLine("姓名:{0},年龄:{1}",P_name,P_age);
 }
 public string Name //定义属性Name
 { get
  { return  P_name;}
  set
  { P_name=value;}
 }
 public int Age //定义属性Age
 { get
  { return  P_age;}
  set
  { P_age=value;}
 }
}
public class Test
{ public static void Main()
 { Person OnePerson= new Person();
  OnePerson.Name="田七";//value="田七",通过set方法修改变量P_Name
  string s=OnePerson.Name;//通过get方法得到变量P_Name值
  OnePerson.Age=20;//通过定义属性,既保证了姓名和年龄按指定方法修改
  int x=OnePerson.Age;//语法形式和修改、得到一个变量基本一致,符合习惯
 OnePerson.Display();
 }
}
 在属性的访问声明中,只有set访问器表明属性的值只能进行设置而不能读出,只有get访问器表明属性的值是只读的不能改写,同时具有set访问器和get访问器表明属性的值的读写都是允许的。
虽然属性和字段的使用方法类似,但由于属性本质上是方法,因此不能把属性当做变量,一些使用变量的地方并不能使用属性,例如不能把属性作为函数的引用型参数或输出参数。