C#基础知识之密封类可以有虚函数吗?
可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数
示例:
- class BaseClass {
- public virtual void F(){
- Console.WriteLine("BaseClass.F");
- }
- sealed class DeriveClass : BaseClass {
- //基类中的虚函数F被隐式的转化为非虚函数
- //密封类中不能再声明新的虚函数G
- public virtual void G(){
- Console.WriteLine("DeriveClass.G");
- }
- }
C#基础知识之如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢?
如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后也应只有一个。如果基类中有 get 和 set 两个属性访问器,那么继承类中可以只有一个也可以同时有两个属性访问器。
C#基础知识之abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
abstract 修饰符不可以和 static、virtual 和 override 修饰符一起使用
C#基础知识之接口可以包含哪些成员?
接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员
C#基础知识之类和结构的区别?
类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存,类有构造和析构函数,类可以继承和被继承
结构:结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。结构没有构造函数,但可以添加。结构没有析构函数,结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口
示例:
根据以上比较,我们可以得出一些轻量级的对象***使用结构,但数据量大或有复杂处理逻辑对象***使用类。如:Geoemtry(GIS 里的一个概论,在 OGC 标准里有定义) ***使用类,而 Geometry 中点的成员***使用结构
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace Example16 {
- interface IPoint {
- double X {
- get;set;
- }
- double Y {
- get;set;
- } double Z {
- get;set;
- }
- //结构也可以从接口继承struct Point: IPoint {
- private double x, y, z;
- //结构也可以增加构造函数
- public Point(double X, double Y, double Z){
- this.x = X;this.y = Y;this.z = Z;
- }
- public double X { get { return x;
- }
- set { x = value;
- }
- }
- public double Y {
- get { return x;
- }
- set { x = value;
- }
- }
- public double Z {
- get { return x;
- }
- set { x = value;
- }
- }
- //在此简化了点状Geometry的设计,实际产品中还包含Project(坐标变换)
等复杂操作class PointGeometry {- private Point value;
- public PointGeometry(double X, double Y, double Z){
- value = new Point(X, Y, Z);
- }
- public PointGeometry(Point value){
- //结构的赋值将分配新的内存this.value = value;
- }
- public double X { get { return value.X;
- }
- set {
- this.value.X = value;
- }
- }
- public double Y { get { return value.Y;
- }
- set { this.value.Y = value;
- }
- }
- public double Z { get { return value.Z;
- } set { this.value.Z = value;
- }
- }
- public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth){
- return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);
- }
- public override string ToString(){
- return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);
- }
- class Program {
- static void Main(string[] args){
- Point tmpPoint = new Point(1, 2, 3);
- PointGeometry tmpPG1 = new PointGeometry(tmpPoint);
- PointGeometry tmpPG2 = new PointGeometry(tmpPoint);
- tmpPG2.X = 4;tmpPG2.Y = 5;tmpPG2.Z = 6;
- //由于结构是值类型,tmpPG1 和 tmpPG2 的坐标并不一样Console.WriteLine(tmpPG1);
- Console.WriteLine(tmpPG2);
- //由于类是引用类型,对tmpPG1坐标修改后影响到了tmpPG3 PointGeometry tmpPG3 = tmpPG1;
- tmpPG1.X = 7;
- tmpPG1.Y = 8;
- tmpPG1.Z = 9;
- Console.WriteLine(tmpPG1);
- Console.WriteLine(tmpPG3);
- Console.ReadLine();
- }
【编辑推荐】