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()
{
}
}

操作符重载

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

// 二元操作符+
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. win10调用局域网内xp系统上的打印机

    首先在xp系统上配置允许远程连接,然后设置账户密码,最后配置打印机,允许共享. 打开自己win10 ,win+R ,输入\\目标电脑ip\打印机名,确定,输入账户,密码. win+X - P-进入控制 ...

  2. VS 默认开发环境如何更改

    话不多说,直接上图

  3. Oracle_R12C_安装注意点_Win64_exectask

    安装问题1 原因 - 无法访问临时位置. 操作 - 请确保当前用户具有访问临时位置所需的权限. 附加信息: - 所有节点上的框架设置检查都失败 -原因: 问题的原因不可用 -操作:用户操作不可用 失败 ...

  4. 在java中如何用键盘输入一个数,字符,字符串

    一,利用 Scanner 实现从键盘读入integer或float 型数据 import java.util.*; public class test { public static void mai ...

  5. 使用LinqToExcel读取Excel

    我们读取和写入Excel 经常使用NPOI工具,如果我们的需求只是需要读取Excel,可以考虑使用LinqToExcel这个组件.这个组件用起来简单,实用,操作方便,而且结合了Linq的查询特性,ex ...

  6. ABP理论学习之Javascript API(理论完结篇)

    返回总目录 本篇目录 Ajax Notification Message UI block和busy 事件总线 Logging 其他工具功能 说在前面的话 不知不觉,我们送走了2015,同时迎来了20 ...

  7. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...

  8. C语言 · 最小公倍数

    问题描述 编写一函数lcm,求两个正整数的最小公倍数. 样例输入 一个满足题目要求的输入范例.例:3 5 样例输出 与上面的样例输入对应的输出.例: 数据规模和约定 输入数据中每一个数的范围. 例:两 ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14  结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...

  10. C语言-指针

    C指针基础知识 C语言中,指针无疑是最令人头疼的.今天无事就来学学C语言的指针,在此留下点笔记,仅供个人参考. 首先要搞懂的是,指针是什么? 指针:是用来存放内存地址的变量. 不管是什么类型的指针,存 ...