字段
字段是在类或结构中直接声明的任意类型的变量。
不同实例调用同一个字段,字段指向两个空间,值互不影响,但静态字段指向同一空间,值会发生变化。如下:
class D {
int Mem1;static int Mem2;
public void SetVars(int va,int v2)//设置位
{Meml=V1;Mem2=V2;}
public void Display(string str)
{Console.Writeline("{o]:Mem1={1},Mem2={2}",str,Mem1,Mem2);}
t
class Program{
static void Main()
{
Dd1=new D(),d2=new D();//创建两个实例da.SetVars(2,4);//设置d1的值
da.Display(“d1");
d2.SetVars(15,17);//设置d2的值dz.Display("dz");
d1.Display("d1");//再次显示d1,
}∥注意,这时Mem2静态成员的值已改变
}
这段代码产生以下输出:
d1:Meml=2,Mem2=4
d2:Mem1=15,Mem2=17
d1:Mem1=2,Mem2=17
}
}
没有类实例的静态成员仍然可以被赋值并读取,因为字段与类有关,而与实例无关。意思不用new,直接 类名.静态字段就可赋值并读取。 静态函数是一样的道理。
成员常量类似前一章所述的局部常量,只是它们被声明在类声明中而不是方法内。
C#没有全局常量!成员常量和静态字段一样可以不用实例,直接调用,不能用static修饰。静态属性跟静态字段一样。
属性
属性其实就是对私有字段的读取和写入,以便做些公有字段无法完成的任务,他的使用方式和公有字段完全一样,所以可以理解成属性是为了满足对公有字段的特殊需求而产生的附属品。因而当我们选择使用属性还是使用字段时,主要看需求,如果不需设置访问权限、不需在赋值时检测值是否满足要求、不需要在赋值时修改对象其他一些状态等特殊的需求时,使用公有字段即可,否则就使用属性。
小结:引入属性的优点
1.维护私有字段(保证类的封装性)
2.可控制访问(只读/只写,确保赋值的正确性等)
3.不用注重细节(直接使用,不需要考虑复杂的处理代码
(1条消息) C#中的属性和字段的区别_fan_rockrock的博客-CSDN博客
属性和它们的后备字段有几种命名约定。一种约定是两个名称使用相同的内容,但字段使用Camel大小写,属性使用Pascal大小写。(在Camel大小写风格中,复合词标识符中每个单词的首学母大写除了第一个单词,其余空母都是小写。在Pascal大小写风格中,复合词中每个单词的首字母都是大写。
创建实例时,后面的 类名() 就是构造函数。 构造函数的作用将类中的字段等进行赋值,将实例进行初始化。
索引器
可以认为索引器是为类的多个数据成员提供get和set访问的属性。
索引器例子:
class Employee{
public string Lastlame;//调用字段0
public string FirstName;//调用字段1
public string Cityof8irth;//调用字段2
public string this[int index]//索引器声明
set //set访问器声明
{
switch(index){
case 0:LastName=value;break;
case 1:FirstName=value;break;
case 2:CityOfBirth=value;break;default:
throw new ArgumentoutofRangeException("index");
}
get //get访问器声明
{
switch(index){
case 0:return LastName;
case 1:return FirstName
;case 2:return CityofBirth;
default:/(第23章中的异常)
throw new ArgumentoutofRangeException("index");
}
}
}
抽象类
抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。
不能创建抽象类的实例。new 一个抽象类是错误的。
抽象类使用abstract 修饰符声明。
字段和常量不能用abstract修饰。
abstract class MyBase / /抽象和非抽象成员的组合
{
public int SideLength =10;//数据成员
const int TriangleSideCount=3;/数据成员
abstract public void PrintStuff(string s); //抽象方法
abstract public int MyInt{get;set;} //抽象属性
public int PerimeterLength()//普通的非抽象方法
{return TriangleSidecount*Sidelength;}
}
class MyClass:MyBase
{
public override void PrintStuff(string s)//覆盖抽象方法
{Console.writeline(s);}
private int_myInt;
public override int MyInt //覆盖抽象属性
{
get{return_myInt;}
set{_myInt=value;}
}
}
class Program
{
static void Main(string[]args)
MyClass mc ='new MyClass();
mc.PrintStuff("This is a string.");
mc.MyInt=28;
Console.Writeline(mc.MyInt);
Console.Writeline($"Perimeter Length:{mc.Perimetertength()}");
这段代码产生如下输出:
This is a string.
28
Perimeter Length:30
静态类
静态类用于存放不受实例数据影响的数据和函数。静态类的一个常见用途可能是创建一个包含一组数学方法和值的数学库。
扩展方法
某个类本身的方法不够用,在另一个类中声明所需要的方法,当某个类实例被创建后,可以用对象.需要的方法调用该方法。扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其它方式修改原始类型。