博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C#学习笔记3】C#面向对象相关知识2
阅读量:5159 次
发布时间:2019-06-13

本文共 3987 字,大约阅读时间需要 13 分钟。

1.Member Definitions

public-成员可以由任何代码访问

private-成员只能由类内的代码访问 - Default

internal-成员只能由定义它的工程内部访问

protected-成员只能有类内,或者继承他的类访问

protected internal-成员只能有工程内部的类本身以及继承它的类访问

1) Defining Fileds

公有类型的字段变量 使用 PascalCasing 规则命名

readonly关键字-表明该字段只能由构造函数来赋值,或者由初始化赋值语句赋值

2) Defining Methods

***如果使用static来修饰该方法,那么此方法只能通过类名来访问,不能通过类的实例来访问***

virtual-该方法可被重写

abstract-该方法必须在一个非抽象子类中被重写,只能用于抽象类中

override-方法重写了一个基类方法,如果该方法被重写必须使用该关键字

extern-方法的定义被放在其他地方

3) Defining Properties

属性为特殊的字段,有get 和 set 其中set可以用来做一些赋值控制。

eg.

View Code
1 namespace Ch10Ex02 2 { 3     public class Myclass 4     { 5         public readonly String Name; 6         private int intVal; 7         public int Val 8         { 9             get10             {11                 return intVal;12             }13             set14             {15                 if (value >= 0 && value <= 10)16                     intVal = value;17                 else18                     throw (new ArgumentOutOfRangeException("Val", value, "Val must assigned a value between 0 and 10."));19             }20         }21         public override string ToString()22         {23             return "Name:" + Name + "\nVal:" + Val;24         }25         private Myclass()26             : this("Default Name")27         {28         }29         public Myclass(string newName)30         {31             Name = newName;32             intVal = 0;33         }34     }35     class Program36     {37         static void Main(string[] args)38         {39             Console.WriteLine("Creating Object myObj...");40             Myclass myObj = new Myclass("My Object");41             Console.WriteLine("myObj Created");42             for (int i = -1; i <= 0; i++)43             {44                 try45                 {46                     Console.WriteLine("\nAttempting to assign {0} to myObj.Val...", i);47                     myObj.Val = i;48                     Console.WriteLine("Value {0} assigned to myObj.Val.", myObj.Val);49                 }50                 catch (Exception e)51                 {52                     Console.WriteLine("Exception {0} thrown.", e.GetType().FullName);53                     Console.WriteLine("Message:\n\"{0}\"", e.Message);54                 }55             }56             Console.WriteLine("\nOutputting myObj.ToString()...");57             Console.WriteLine(myObj.ToString());58             Console.WriteLine("myObj.ToStrinig() Output.");59             Console.ReadKey();60         }61     }62 }

可以控制赋值只能在0到10之间,其他赋值情况就会抛出异常。

主要用于一些类内的成员变量,为了安全性,设为了私有,不允许外界访问,所以一般通过属性来访问。

2.Additional Class Member Topics

1)Hidding Base Class Methods

隐藏基类方法可以直接在子类中 重新定义方法。

例如:

public Class MyBaseClass

{

public void DoSomething()

{}

}

pulbic Class MyDerivedClass:MyBaseClass

{

public void  DoSomething()

{}

}

此方法就隐藏了基类中的方法。另外可以使用关键字new

new public void DoSomething(){} 可以达到同样的效果。不过不会出现警告!

***隐藏基类和重写的区别***

隐藏基类不会对基类产生影响,重写会产生影响。重写之后,当把子类复制给基类的时候就会基类中的方法被重写。

2)Calling Overriden or Hidden Base Class Methods

使用base关键字,在子类中使用 例如: base.DoSomething(); 那么子类中仍然保留了基类中的方法。

3)Nested Type Definition

嵌套类型的定义,即可以在类中再定义一个类,一般都把这个嵌套类定义为private类型。如果为public类型则可以实例化

eg. MyClass.MyNestedClass myObj = new Myclass.MyNestedClass();

3.Interface Implementation

分为显示引用和隐式引用两种,一般情况下用显式引用

3.Boxing and Unboxing

***System.Object equals to object***

装箱的含义: 

int i = 42;

object o = i;

此 程序中 将值类型42赋予了对象引用类型的o.值类型的值都存在栈中 而引用类型必须要引用堆中的值,所以此时就把42复制一个到堆中,从而object类型的引用也引用堆中的值,这样就不会造成错误。

而复制到堆中的值与原来在栈中的值没有关系,任意一个修改都不影响另外一个。

拆箱的含义:

将堆中的值拆箱 再存到栈中,需要用到强制类型转换,如果不符合会抛出InvalidCastException

例如

int i = 42;

object o = i;

i = (int)o;

***拆箱和装箱的开销较大,不能够滥用,后面会继续学到另外一种异曲同工的技术----泛型。

4.强制类型转换

is操作符

例如:

WrappedInt wi = new WrappedInt();

object o = wi;

if(o is WrappedInt)

{

WrappedInt temp = (WrappedInt)o;

}

as操作符

WrappedInt wi = new WrappedInt();

object o = wi;

WrappedInt temp = o as WrappedInt;

if(temp != null) //只有成功转换,转型是安全的,if下面的值才会执行。

posted on
2013-04-16 14:31 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/carlfeng/archive/2013/04/16/Csharplearning3.html

你可能感兴趣的文章
一种脱离VC编程软件的方法学习C/C++编程(搭建EditPlus实现在文本编辑框中执行.c文件...
查看>>
[科普文] 关于浏览器内核的一些小知识,明明白白选浏览器!
查看>>
软硬件之共生之道——一千零一夜的启发
查看>>
(一一二)图文混排中特殊文字的点击与事件处理
查看>>
iPhone开发经典语录集锦 (转)
查看>>
SVM基础必备常识
查看>>
FPGA时序约束的几种方法 (转)
查看>>
cocos2dx 3.x tolua 分析
查看>>
oracle 外网访问
查看>>
jdbc连接数据库方式问题
查看>>
一步一回头撞在了南墙上
查看>>
POJ2965 The Pilots Brothers' refrigerator
查看>>
C# 2.0 中的新增功能01 分布类与分部方法
查看>>
关于腾讯ip接口一个流传很广的错误用法
查看>>
XMU 1056 瞌睡 vs 听课 【动态规划】
查看>>
openlayers3中应用proj4js
查看>>
leaflet一个前端gis框架,比openlayer更简单
查看>>
java 浅拷贝和深拷贝
查看>>
如何从不均衡类中进行机器学习
查看>>
自定义UILabel UITextField 填充
查看>>