C#学习笔记(十三)-- 定义类成员

一、成员定义

  成员的访问级别:

  public:成员可以被任何代码访问。

  private:成员只能由类中的代码访问(如果没有使用任何的关键字,就默认使用这个关键字)。

  internal:成员只能有定义它的程序集(项目)内部的代码访问。

  protected:成员只能由类或派生类中的代码访问。

  protected internal:成员只能由项目(更准确地说是程序集)中的派生类的代码来访问。

  static:成员是类的静态成员,而不是对象实例的成员。

1)定义字段

  可以用标准的变量声明格式(可以进行初始化)和前面介绍的修饰符来定义字段:

class MyClass
{
   public int MyInt;
}

  注意:

  .NET FrameWork中的公共字段以PascalCasing的形式来命名,而不是camelCasing,私有字段通常使用camelCasing

  字段也可以使用关键字readonly,表示这个字段只能在执行构造函数的过程中赋值,或者由初始化赋值语句赋值:

class MyClass
{
   public readonly int MyInt = 17;
}

  也可以使用static关键字将字段声明为静态字段:

class MyClass
{
   public static int MyInt;
}

  静态字段必须通过定义它们的类来进行访问(在上面这个示例中,就要使用MyClass.MyInt),而不是通过这个类的对象实例来访问。另外可以使用关键字const来创建一个常量值。按照定义,const成员也是静态的,所以不需要使用static修饰符。

2)定义方法

  方法使用标准函数格式、可访问性和可选的static修饰符来声明:

class MyClass
{
   public string GetString() => "Here is a string.";
}

  注意:公共方法也使用PascalCasing的方式来命名。

  注意,如果使用了static关键字,这个方法就只能通过类来访问,不能通过对象实例来访问。也可以在方法定义中使用下述关键字:

  virtual:方法可以重写。

  abstrat:方法必须在抽象的派生类中重写(只能用于抽象类中)。

  override:方法重写了一个基类方法(如果方法被重写,就必须使用该关键字)。

  extern:方法定义放在其他的地方。

  以下是方法重写的一个示例:

public class MyBaseClass
{
   public virtual void DoSomething()
   {
      //Base implementation;
   }
}

public class MyDerivedClass:MyBaseClass
{
   public override void DoSomething()
   {
      //Derived class implementation, overrides base implementation.
   }
}

  如果是用来override,也可以使用sealed来指定在派生类中不能对这个方法做进一步的修改,即这个方法不能由派生类重写:

public class MyDerivedClass:MyBaseClass
{
   public override sealed void DoSomething
   {
      //derived class implementation,override base implementation.
   }
}

3)定义属性

  属性的定义方式与字段类似,但包含的内容比较多。属性比字段复杂,因为它们在修改状态前还乐意执行一些额外操作,实际上,它们可能并不修改状态。属性拥有两个类似于函数的块,一个用于获取属性的值,另一个块用于设置属性的值。

  这两个块也称为访问器,分别用get和set关键字来定义,可以用于控制属性的访问级别。可以忽略其中的一个块来创建只读或者只写属性(忽略get块创建只写属性,忽略set块创建只读属性)。当然,这仅适用于外部代码,因为类中的其他代码可以访问这些代码块能访问的数据。还可以在访问器上包含可访问的修饰符,例如使get块变成保护的,使set块变成受保护的。至少要包含其中一个块,属性才是有效的(既不能读取也不能修改的属性没有任何的用处)。

  属性的基本结构包括标准的可访问修饰符(public、private等),后跟类型名、属性名和get块(或set块,或者get块和set块,其中包含属性处理代码):

public int MyIntProp
{
   get{}
   set{}
}

  注意:公共属性也以PascalCasing的方式来命名,而不是camelCasing方式命名,与字段和方法一样,这里使用PascalCasing的方式。

  get块必须有一个属性类型的返回值,简单属性一般与私有字段相关联,以控制对这个字段的访问,此时get块可以直接返回该字段的值:

private int myInt;

public int MyIntProp
{
   get{return myInt;}
   set{}
}

  类外部的代码不能直接访问这个myInt字段,因为其访问级别是私有的。外部代码必须使用属性来访问该字段,set函数采用类似方式把一个值赋给字段。这里可以使用关键字value来表示用户提供的属性值:

private int myInt;

public int MyIntProp
{
   get{return myInt;}
   set{myInt = value;}
}

  value等于类型与属性相同的一个值,所以如果属性和字段使用相同的类型,就不必考虑数据类型转换了。要为可空整数类型提供一个默认值,可以使用这个由表达式构成的成员函数模式:

private int ? myInt;

public int ? MyIntProp
{
   get{return myInt;}
   set{myInt = value ?? 0;}
}

  这个简单属性只是用来阻止对myInt字段的直接访问。在对操作进行更多控制时,属性的真正作用才能发挥出来:

private int myInt

public int MyIntProp
{
   get{return myInt;}
   set
   {
      if (value >= 0 && value <= 10)
      {
          myInt = value;
      }
   }
}

  只有在赋给属性的值在0~10之间,才会修改myInt。此时,要做一个重要的设计选择:如果使用了无效值,该进行什么操作?

  (1)什么也不做(如上述代码所示)。

  (2)给字段赋默认值。

  (3)继续执行,就像没发生错误一样,但记录下该事件,以备将来分析。

  (4)抛出异常。

  一般来说,后两个选择效果较好,选择哪个选项取决于如何使用类,以及给类的用户授予多少控制权。抛出异常给用户提供的控制权相当大,可以让用户了解发生了什么情况,并作适当的响应。为此可使用System名称空间中的标准异常:

private int myInt;

public int MyIntProp
{
   get{return myInt;}
   set
   {
      if (value >= && value <= 10)
      {
         myInt = value;
      }
      else
      {
         throw(new ArgumentOutOfRangeException("MyIntProp", value, "MyIntProp must be assigned a value between 0 and 10."));
      }
   }
}

  该异常可以在使用属性的代码中用try...catch...finally来处理。

  属性可以使用virtual、override和abstract关键字,就像方法一样,但这几个关键字不能用于字段。访问器也可以有自己的可访问性:

private int myInt;

public int MyIntProp
{
   get{return myInt;}
   protected set{myInt = value;}

}

  只有类或者派生类中的代码才能使用set访问器。

  访问器可以使用的访问修饰符取决于属性的可访问性,访问器的可访问性不能高于它所属的属性,也就是说,私有属性对他的访问器不能包含任何可访问修饰符,而公共属性可以对其访问器使用所有的可访问修饰符。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值