C# 10. 类成员

本文详细介绍了C#中的类成员定义、访问控制、字段、方法(包括重写、隐藏和接口实现)、属性、部分类、部分方法以及隐藏基类的方法和调用层次结构。讲解了如何使用关键字控制访问级别,并展示了自动属性和代码组织的最佳实践。
摘要由CSDN通过智能技术生成

本章内容:
● 如何定义类成员
● 如何使用类图添加成员
● 如何控制类成员的继承
● 如何定义嵌套的类
● 实现接口实明摆口
● 如何使用部分类定义
● 如何使用“调用层次结构”(Call Hierarchy)窗口

1. 成员定义

所有成员都有自己的访问级别,用下面的关键字之一来定义:
public——成员可以由任何代码访问。
private——成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字)。
internal——成员只能由定义它的程序集(项目)内部的代码访问。
protected——成员只能由类或派生类中的代码访问。

后两个关键字可以合并使用,所以也有 protected internal 成员。它们只能由项目(更确切地讲,是程序集)中派生类的代码来访问

1.1 定义字段

// 定义类
class MyClass
{
	public int Myint;
}

// 字段也可以使用关键字 readonly,表示这个字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。例如
class MyClass
{
	public readonly int Myint = 17;
}

// 静态字段必须通过定义它们的类来访问
class MyClass
{
	public static int MyInt;
}

1.2 建立方法

// 方法使用标准函数格式、可访问性和可选的 static 修饰符来声明。例如
class MyClass
{
	public string GetString()
	{
		return "hello world";
	}
}

方法定义中使用下述关键字:
virtual——方法可以重写。
abstract——方法必须在非抽象的派生类中重写(只用于抽象类中)。
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, overrides base implementation.
	}
}

1.3 定义属性

属性定义方式与字段类似,但包含的内容比多。

属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值

这两个块也称为访问器,分别用 get 和 set 关键字来定义,可以用于控制对属性的访问级别。可以忽略其中的一个块来创建只读或只写属性

public int MyIntProp
{
	get
	{
		// Property get code.
	}
	set
	{
		// Property set code.
	}
}

// set的用法——只有赋给属性的值在 0~10 之间,才会改 myInt
set
{
	if (value >=0 && value <= 10)
		myInt = value;
}

1.4 在类图中添加成员

在类视图中可以添加、修改对象

1.5 重构成员

可以在类视图中重构一个程序,可以直接将值下发到每个引导到的地方去

1.6 自动属性

利用自动属性,可以用简化的语法声明属性,C#编译器会自动添加未键入的内容。具体而言,编译器会声明一个用于存储属性的私有字段,并在属性的 get 和 set 块中使用该字段,我们无需考虑细节

// 使用下面的代码结构就可以定义一个自动属性
public int MyIntProp { get; set; }

使用自动属性时,只能通过属性访问数据

2. 类成员的其他议题

本节主要研究:

  • 隐藏基类方法
  • 调用重写或隐藏的基类方法
  • 嵌套的类型定义

2.1 隐藏基类方法

当继承的公共成员不像预期的那样工作时,就可以隐藏它

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

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

2.2 调用重写或隐藏的基类方法

无论是重写成员还是隐藏成员,都可以在派生类的内部访问基类成员。例如:

  • 要对派生类的用户隐藏继承的公共成员,但仍能在类中访问其功能。
  • 要给继承的虚拟成员添加实现代码,而不是简单地用重写的新执行代码替换它。

可以使用 base 关键字,它表示包含在派生类中的基类的实现代码

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

public class MyDerivedClass : MyBaseClass
{
	public override void DoSomething()
	{
		// Derived class implementation, extends base class implementation.
		base.DoSomething();
		// More derived class implementation.
	}
}

this 关键字
base 关键字外,还可以使用 this 关键字。与 base 一样,this 也可以用在类成员的内部,且该关键字也引用对象实例。只是 this 引用的是当前的对象实例(即不能在静态成员中使用 this 关键字,因为静态成员不是对象实例的一部分)。

this 关键字最常用的功能是把当前对象实例的引用传递给一个方法

public void doSomething()
{
	MyTargetClass myObj = new MyTargetClass();
	myObj.DoSomethingWith(this);
}

2.3 嵌套的类型定义

// 在类里面定义一个嵌套类
public class MyClass
{
	public class MyNestedClass
	{
		public int NestedClassField
	}
}

// 嵌套类的实例化
MyClass.MyNestedClass myObj = new MyClass.MyNestedClass;

3. 接口的实现

// 接口的定义
interface IMyInterface
{
	// Interface members.
}
  • 接口不允许使用访问修饰符,所有的接口都是公共的
  • 接口成员不能包含代码题
  • 接口不能定义字段成员
  • 接口不能用static等静态的来定义
// 可以用关键字new隐藏继承了基接口的成员
interface IMyBaseInterface
{
	void DoSinething();
}

interface IMyDerivedInterface : IMyInterface
{
	new void DoSomething();
}

在类中实现接口

// 实现接口的类必须包含该接口所有成员的实现代码,且必须匹配指定的签名,且必须是公共的
public interface IMyInterface
{
	void DoSomething();
	void DoSomethingElse();
}

// 实现的方法
public class Myclass : IMyinterface
{
	public void DoSomething()
	{
	
	}
	
	public void DoSomethingElse()
	{
	
	}
}

继承一个实现给定接口的基类,就意味着派生类隐式地支持这个接口

public interface IMyInterface
{
	void DoSomething();
	void DoSomethingElse();
}

// 实现的方法
public class Myclass : IMyinterface
{
	public virtual void DoSomething()
	{
	
	}
	
	public virtual void DoSomethingElse()
	{
	
	}
}

public class MyDerivedClass : MyBaseClass
{
	public override void DoSomething()
	{
	
	}
}

4. 部分类定义

当代码题包含许多类型成员,很容易混淆,且代码题过程。
可以给代码分组,在代码中定义区域,可以实现自定义折叠功能

// 这种方法可以实现代码折叠
public class MyClass
{
	#region Fields
	private int myInt;
	#endregion
}

上述方法,可能仍造成所有代码在一个类文件类难以理解的状态。
可以采取不分类定义——类的定义在多个文件中,方法在一个文件中。使用partial关键字

public partial class MyClass
{

}

5. 部分方法定义

部分方法可以分成,方法体和方法两种类来定义。在这两个类中,都要使用partial关键字

public partial class MyClass
{
	partial void MyPartialMethod();
}

public partial class MyClass
{
	partial void MyPartialMethod()
	{
		// 代码体
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值