span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }
-->

更多相关文章,见本人的个人主页:zhongxiewei.com

类定义

定义类的修饰符:

  • internal (default访问修饰符),当前项目中的代码对其有访问权限
  • public(访问修饰符),公开其可访问性
  • abstract,说明该类是抽象类,不能实例化,只能被继承,可以拥有抽象成员
  • sealed,不能被继承

关于类的修饰符需要注意的是:

  • 没有private和protected修饰符
  • public类不能够继承自internal类,如 public class MyClass : MyBase {} // MyBase is a internal class,不过internal可以继承自public类
  • 继承抽象类时,除非当前类也是抽象的,就必须对所有抽象成员初始化
  • 继承时,不允许多重继承
  • 类定义中,父类和接口同时存在是,父类必须位于冒号后面的第一个位置,如:public class MyClass : MyBase, IMyInterface {}

接口定义

定义接口的修饰符:

  • internal (default访问修饰符),当前项目中的代码对其有访问权限
  • public(访问修饰符),公开其可访问性

需要注意的是:

  • 没有sealed,abstract修饰符
  • 允许接口的多重继承
  • 当接口被类继承时,接口中的所有函数都必须实现

System.Object

当类没有继承对象时,默认继承System.Object,那么就有必要看看该类中到底有什么。

Method Description
Object() 构造函数
~Object() 析构函数
virtual bool Equals(object) this和other对象进行比较
static bool Equals(object,object) 比较输入的两个对象,内部调用上一个函数,true all null
static bool ReferenceEquals(object,object) 比较输入的两个对象是不是同一个对象的引用
virtual string ToString() 默认返回类类型的名字
object MemberwiseClone() 构建新的object实例,并对成员变量进行copy,引用类型的成员变量仍然引用同一个变量
System.Type GetType() 返回对象的类型
virtual int GetHashCode() 返回对象的hash值

使用GetType的一个示例:

if (myObj.GetType() == typeof(MyComplexClass))
{
// myObj is an instance of the class MyComplexClass
}

类成员定义

修饰关键字:

  • public,任何代码都能够访问
  • private,类内部的代码才能够访问
  • internal,项目内部的代码才能够访问
  • protected,继承的子类中的代码能够访问
  • static,属于类的成员,而不单属于某个对象

只针对成员变量的修饰符:

  • readonly,只读变量,在声明或构造函数中进行初始化

只针对成员函数的修饰符:

  • virtual,能够被重载的函数
  • abstract, 必须被重载的函数,只能在abstract类中存在
  • override,重载基类中的函数
  • extern,函数的定义在其他的地方
  • sealed,函数无法被进一步重载

属性定义

private int myInt;

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

隐藏基类中的函数

很容易想到的实现方式如下:

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

但是上面的代码在编译的过程中会出现警告,说MyDerivedClass中的DoSomething函数隐藏了基类中的DoSomething函数,请使用new关键字,即public new void DoSomething() {}。

Collection

可以使用现有的System.Collections.ArrayList实现。这里要讲的是自己定义Collections。可以采用如下的方式来实现,如:

public class Animals : CollectionBase
{
// Add功能
public void Add(Animal newAnimal)
{
List.Add(newAnimal);
} // Remove功能
public void Remove(Animal oldAnimal)
{
List.Remove(oldAnimal);
} // 实现MyAnimal[0]的访问方式
public Animal this[int animalIndex]
{
get
{
return (Animal)List[animalIndex];
}
set
{
List[animalIndex] = value;
}
} public Animals()
{
}
}

操作符重载

重载操作符的成员函数是公有静态的。需要注意的是在进行变量转换的成员函数的定义过程中,有两个额外的关键字explicit和implicit。

// 二元操作符+
public class Class1
{
public int val;
// 二元操作符
public static Class1 operator +(Class1 op1, Class1 op2)
{
Class1 returnVal = new Class1();
returnVal.val = op1.val + op2.val;
return returnVal;
} // 一元操作符,-
public static Class1 operator -(Class1 op1)
{
Class1 returnVal = new Class1();
returnVal.val = -op1.val;
return returnVal;
}
}

is操作符和as操作符

is操作符:检测一个未知的变量能够转化成为已知的类型的变量。如果可以则返回true,否则返回false。但是它并不能判断两个类型是否相同。

它的语法结构为:<operand> is <type>

该表达式的可能的结果如下:

  • 如果type是class类型,那么当<operand>也是那个类型,或是那个类的子类,或是可以转换成那个类型时,返回的结果为true
  • 如果type是interface类型,那么当operand是那个类型,或是那个类型的实现的时候,返回结果为true
  • 如果type是value type,如int,那么当operand是那个类型,或是可以隐式转换成那个类型的时候,返回结果为true

as操作符,将变量转换成特殊的引用类型。<operand> as <type>。

适用于以下环境,

  • 如果operand的类型与type相同。
  • 如果operand能够隐式转换成type类型
  • 如果operand能够无损的强制得转换成type类型。

如果不能够转换,则返回的结果为null。

BaseClass obj1 = new BaseClass();
DerivedClass obj2 = obj1 as DerivedClass; // return null 不会抛出异常,如果使用 ... = (DerivedClass)obj1; 则会抛出异常 // 如果以下面的方式进行转换则是可以的
DerivedClass derivedClass = new DerivedClass();
BaseClass baseClass = derivedClass;
DerivedClass newDerivedClass = baseClass as DerivedClass; // not null

深度拷贝

直接采用System.Object对象内的MemberwiseClone()当遇到类含有引用变量的时候,就不能够实现深层的拷贝,如:

public class Content
{
public int Val;
} public class Cloner
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
} public object GetCopy()
{
return MemberwiseClone();
}
} // 具体调用
Cloner mySource = new Cloner(5);
Cloner myTarget = (Cloner)mySource.GetCopy();
mySource.MyContent.Val = 2; // 这将导致myTarget.MyTarget.Val也相应的改变成了2

要实现深度的拷贝,可以实现ICloneable接口。

public class Cloner : ICloneable
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
public object Clone()
{
Cloner clonedCloner = new Cloner(MyContent.Val);
return clonedCloner;
// 或是
// Cloner clonedCloner = new Cloner();
// clonedCloner.MyContent = MyContent.Clone();
// return clonedCloner;
}
}

自定义异常

自定义的过程中,只要继承Expection类并进行实现即可。如:

public class AgeBelowZeroException : Exception
{
public AgeBelowZeroException() :
base("The age must >= 0")
{
}
}

与类相关基本概念----Beginning Visual C#的更多相关文章

  1. C#图解教程学习笔记——类相关的概念

    一.一些基本概念1. 字段:隶属于类的变量,即类的成员变量.2. 方法:隶属于类的函数,即类的成员函数.3. 实例成员:类的每个实例拥有自己的各个类成员的副本,这些成员称为实例成员. 改变一个实例字段 ...

  2. 基本概念----Beginning Visual C#

    更多相关文章,见本人的个人主页:zhongxiewei.com 变量 注释方式:// 注释在这里和/* 注释在这里 */ 整形变量的类型: Type Alias for Allowed Values ...

  3. Events基本概念----Beginning Visual C#

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  4. Windows Programming ---- Beginning Visual C#

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  5. linux设备驱动归纳总结(一)内核的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxx ...

  6. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

  7. C# 图解教程 第四章 类的基本概念

    类的基本概念 类的概述声明类 类成员字段方法 创建变量和类的实例为数据分配内存实例成员访问修饰符 私有访问和公用访问 从类的内部访问成员从类的外部访问成员综合应用 类的基本概念 类的概述 类是一种活动 ...

  8. java类(Class)的概念;对象的概念,声明类的属性 和方法,局部变量和成员变量,面向对象编程思维,抽象的概念

    类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网 ...

  9. 一、HTML概述 二、web相关的概念 三、HTML的常用标签

    一.HTML概述###<1>概念 HTML:Hypertext Markup Language,超文本 标记语言,用来描述网页的一种语言. 非编程语言,由浏览器直接解释运行. ###< ...

随机推荐

  1. python将图片转换为Framebuffer裸数据格式(终端显示图片)

    要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口,直接写入像素信息即可. 但普通的图片带有头部信息或者编码格式不同,直接送入Framebuffer是显 ...

  2. Replace 删除、替换函数精解示例

    '************************************************************************* '**模 块 名:Replace函数精解示例 '* ...

  3. poj1200-Crazy Search(hash入门经典)

    Hash:一般是一个整数.就是说通过某种算法,可以把一个字符串"压缩" 成一个整数.一,题意: 给出两个数n,nc,并给出一个由nc种字符组成的字符串.求这个字符串中长度为n的不同 ...

  4. ex2-注释和井号

    代码: print("I could have code like this.") # and the commnt after is ignored.# You can also ...

  5. 学习笔记:delphi多线程知识

    最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处. Delphi的线程同步方法: ...

  6. java中文乱码解决之道(五)-----java是如何编码解码的

    在上篇博客中LZ阐述了java各个渠道转码的过程,阐述了java在运行过程中那些步骤在进行转码,在这些转码过程中如果一处出现问题就很有可能会产生乱码!下面LZ就讲述java在转码过程中是如何来进行编码 ...

  7. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  8. failed to load the jni shared library jvm

    启动eclipse luna时候出现的, 原因在于,eclipse要求jdk是 32位的, 而我本机安装的是 64的!

  9. Atitit 设计模式与算法,与流程的关系

    Atitit 设计模式与算法,与流程的关系 1.1. 设计模式就是算法 就是流程,不同的方面看法不同,抽象方法不同而造成的假象. 软件就是由设计模式累积成的.也可以说算法累计成的.. ,而可以用Vis ...

  10. Atitit 代码复用的理解attilax总结

    Atitit 代码复用的理解attilax总结 1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 ...