目录
1、类的成员
类具有表示其数据和行为的成员。 类的成员包括在类中声明的所有成员,以及在该类的继承层次结构中的所有类中声明的所有成员(构造函数和析构函数除外)。 基类中的私有成员被继承,但不能从派生类访问。
对类的理解可参考:C# 类(一)——类库、命名空间、类、对象
类中可包含的成员类型:字段(field)、属性(property)、方法(method)、事件(event)等。
2、字段(field)
字段是直接在类或结构体中声明的任何类型的变量。 类可以拥有实例字段或静态字段,或同时拥有两者。实例字段用来描述对象的状态,静态字段用来描述类的状态。也就是说,静态字段属于类本身,在类的所有对象中共享,从对象A所作的更改将立刻呈现在对象B和C上;而实例字段属于每个对象,修改A的实例字段,并不影响B和C。
声明字段:访问级别 类型 名称
字段一般是私有的或受保护的,字段应通过属性、方法、索引器间接访问,这样做可以避免字段输入无效的值。比方说,类的实例字段,我们为这个类创建了对象,对象并不能直接访问字段,而需要通过属性、方法、索引器来间接访问,直接访问的话,哪怕我们给字段输入一个无效的值,程序也不知道,间接访问,我们可以添加判断逻辑,输入无效值时给出错误信息。
namespace Test
{
public class Person
{
//实例字段
//公共字段(一般不推荐)
public int age;
//实例字段 私有字段
private int height;
//实例字段 私有字段
private int weight;
//静态字段 私有字段
private static int avgAge;
//静态字段 私有字段
private static int avgHeight;
//静态字段 私有字段
private static int avgWeight;
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.age = 300; //访问公共字段,输入无效值,但是程序并不知道
Console.WriteLine("年龄:" + p1.age);
Console.ReadLine();
}
}
}
声明字段时可以使用赋值运算符为字段指定一个初始值。
namespace Test
{
public class Person
{
//为字段指定初始值
public int age = 20;
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
Console.WriteLine("年龄:" + p1.age);
Console.ReadLine();
}
}
}
字段的初始化紧靠调用对象实例的构造函数之前。 如果构造函数为字段赋值,则该值将覆盖字段声明期间给出的任何值。
namespace Test
{
public class Person
{
public int age=20;
public Person()
{
age = 15;
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
Console.WriteLine("年龄:" + p1.age); //输出为 15
Console.ReadLine();
}
}
}
可以将字段声明为 readonly, 只读字段只能在初始化期间或在构造函数中赋值。
namespace Test
{
public class Person
{
public readonly int age=20;
public Person()
{
age = 15;
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
//p1.age = 18;
Console.WriteLine("年龄:" + p1.age);
Console.ReadLine();
}
}
}
3、属性(property)
属性是这样的成员:它提供灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。
正如上面所说的,在类外部,我们想要访问字段,并不是直接地访问,而是间接的进行访问,属性便是间接访问字段的方式之一。
namespace Test
{
public class Person
{
//字段
private int age;
//属性
public int Age
{
get { return age; } //get访问器用于返回属性值
set { age = value; } //set访问器用于分配新值;value为上下文关键字,用于定义由 set 取值函数分配的值。
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
//p1.age = 18;
//Console.WriteLine("年龄:" + p1.age);
p1.Age = 18;
Console.WriteLine("年龄:" + p1.Age); //输出 18
Console.ReadLine();
}
}
}
namespace Test
{
public class Person
{
//字段
private int age;
//属性
public int Age
{
get { return age; } //get访问器用于返回属性值
set //set访问器用于分配新值;value为上下文关键字,用于定义由 set 取值函数分配的值。
{
if(value>0&&value<130)
{
age = value;
}
else
{
throw new Exception("输入年龄无效");
}
}
}
}
class Program
{
static void Main(string[] args)
{
try
{
Person p1 = new Person();
//p1.Age = 150;
p1.Age = 50;
Console.WriteLine("年龄:"+p1.Age);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
}
属性可以只有get访问器,这时属性是只读的。
4、方法(method)
“方法”是包含一系列语句的代码块。比如拿Person来说,方法有走路、跑步、唱歌等。Main 方法是每个 C# 应用程序的入口点。
字段可以通过方法间接访问。
namespace Test
{
public class Person
{
private int Age=18;
public int GetAge()
{
return Age;
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
Console.WriteLine("年龄:"+p1.GetAge());
Console.ReadLine();
}
}
}
5、事件(event)
类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
举个例子,有3个机器人A、B、C,A可以将自己的消息发送给B,那么此时A就是消息的发布者,B就是消息的订阅者。A也可以将消息发送给B和C,也就是说可以一个发布者对多个订阅者。A和B可以将消息发送给C,也就是说可以多个发布者对一个订阅者。
先写到这里了,我发现事件挺难的,等我学好了再写。