C#基础知识讨论

开发 后端
本文介绍C#基础知识,包括密封类可以有虚函数吗、接口可以包含哪些成员、类和结构的区别和abstract 可以和 virtual 一起使用吗等问题。

C#基础知识之密封类可以有虚函数吗?

可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数

示例:

  1. class BaseClass {   
  2. public virtual void F(){   
  3. Console.WriteLine("BaseClass.F");  
  4. }   
  5. sealed class DeriveClass : BaseClass {  
  6. //基类中的虚函数F被隐式的转化为非虚函数  
  7.  
  8. //密封类中不能再声明新的虚函数G   
  9. public virtual void G(){   
  10. Console.WriteLine("DeriveClass.G");  
  11. }   

C#基础知识之如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢?

如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后也应只有一个。如果基类中有 get 和 set 两个属性访问器,那么继承类中可以只有一个也可以同时有两个属性访问器。

C#基础知识之abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?

abstract 修饰符不可以和 static、virtual 和 override 修饰符一起使用

C#基础知识之接口可以包含哪些成员?

接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员

C#基础知识之类和结构的区别?

类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存,类有构造和析构函数,类可以继承和被继承

结构:结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。结构没有构造函数,但可以添加。结构没有析构函数,结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

示例:

根据以上比较,我们可以得出一些轻量级的对象***使用结构,但数据量大或有复杂处理逻辑对象***使用类。如:Geoemtry(GIS 里的一个概论,在 OGC 标准里有定义) ***使用类,而 Geometry 中点的成员***使用结构

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace Example16 {   
  6. interface IPoint {   
  7. double X {   
  8. get;set;  
  9. }   
  10. double Y {   
  11. get;set;  
  12. } double Z {   
  13. get;set;  
  14. }   
  15. //结构也可以从接口继承struct Point: IPoint {   
  16. private double x, y, z;  
  17. //结构也可以增加构造函数  
  18. public Point(double X, double Y, double Z){   
  19. this.x = Xthis.y = Ythis.z = Z;  
  20. }   
  21. public double X { get { return x;   
  22. }   
  23. set { x = value;   
  24. }   
  25. }   
  26. public double Y {   
  27. get { return x;   
  28. }   
  29. set { x = value;   
  30. }   
  31. }   
  32. public double Z {   
  33. get { return x;   
  34. }   
  35. set { x = value;   
  36. }   
  37. }   
  38. //在此简化了点状Geometry的设计,实际产品中还包含Project(坐标变换)
    等复杂操作class PointGeometry {   
  39. private Point value;  
  40.  
  41. public PointGeometry(double X, double Y, double Z){   
  42. value = new Point(X, Y, Z);  
  43. }   
  44. public PointGeometry(Point value){   
  45. //结构的赋值将分配新的内存this.value = value;  
  46. }   
  47. public double X { get { return value.X;   
  48. }   
  49. set {   
  50. this.value.X = value;   
  51. }   
  52. }   
  53. public double Y { get { return value.Y;   
  54. }   
  55. set { this.value.Y = value;   
  56. }   
  57. }   
  58. public double Z { get { return value.Z;   
  59. } set { this.value.Z = value;   
  60. }   
  61. }   
  62. public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth){   
  63. return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);  
  64. }   
  65. public override string ToString(){   
  66. return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);  
  67. }   
  68. class Program {   
  69. static void Main(string[] args){   
  70. Point tmpPoint = new Point(1, 2, 3);  
  71.  
  72. PointGeometry tmpPG1 = new PointGeometry(tmpPoint);  
  73. PointGeometry tmpPG2 = new PointGeometry(tmpPoint);  
  74. tmpPG2.X = 4tmpPG2.Y = 5tmpPG2.Z = 6;  
  75. //由于结构是值类型,tmpPG1 和 tmpPG2 的坐标并不一样Console.WriteLine(tmpPG1);  
  76. Console.WriteLine(tmpPG2);  
  77. //由于类是引用类型,对tmpPG1坐标修改后影响到了tmpPG3 PointGeometry tmpPG3 = tmpPG1;  
  78. tmpPG1.X = 7;  
  79. tmpPG1.Y = 8;  
  80. tmpPG1.Z = 9;  
  81. Console.WriteLine(tmpPG1);  
  82. Console.WriteLine(tmpPG3);  
  83. Console.ReadLine();  

【编辑推荐】

  1. C#结构体的特点浅析
  2. 介绍C#窗体拖动事件
  3. C#读取Excel遇到无法读取的解决方法
  4. 概述C#.NET操作XML
  5. C#基础概念学习笔记
责任编辑:佚名 来源: 比特网
相关推荐

2009-08-13 12:50:45

C#基础知识

2009-08-27 16:37:06

C#基础知识

2009-08-11 15:17:12

C#基础知识

2009-08-13 15:40:28

C#基础知识

2009-08-03 13:55:03

C#基础知识

2009-08-19 17:13:15

C# 操作符基础知识

2009-08-24 17:07:09

C# 泛型

2009-08-21 17:19:36

C#网络编程入门

2009-08-19 16:19:01

C#操作Access数

2010-01-19 14:45:35

C++语言

2010-01-19 10:16:40

C++程序

2009-08-14 10:59:35

C#分部方法

2009-08-12 16:22:29

C#插件技术

2009-08-10 17:00:14

C#分部方法

2015-06-01 13:35:43

数据中心DCIM

2010-07-16 10:53:30

Perl基础

2009-04-17 14:22:40

XPathXML基础

2009-09-23 11:07:11

Hibernate基础

2014-08-20 10:15:45

2009-04-10 09:35:00

WCDMA基础无线网络
点赞
收藏

51CTO技术栈公众号