面向对象的编程(C# 和 Visual Basic)
在.NET Framework 中,(例如 Visual Basic 和 C# 中的所有托管的语言提供完全支持面向对象的编程,其中包括封装、 继承和多态性。
封装 表示一组相关的属性、 方法和其他成员视为一个单元或对象。
继承 描述要创建基于现有类的新类的能力。
多态性 意味着可以有多个类,可互换,即使每个类以不同方式实现相同属性或方法。
本部分介绍以下概念:
类和对象
类成员
属性和字段
方法
构造函数
析构函数
事件
嵌套的类
访问修饰符以及具有的访问级别
实例化类
静态 (共享) 类和成员
匿名类型
继承
- 重写成员
接口
泛型
委托
类和对象
这些条款 类 和 对象 有时会用互换,但事实上,类描述 类型 对象,而对象是可用的 实例 类。因此,调用创建对象的行为 实例化.使用蓝图类比,类是蓝图,对象就是基于该蓝图的建筑。
若要定义类:
Class SampleClass
End Class
class SampleClass
{
}
Visual Basic 和 C# 还提供了类称为简版 结构 当您需要创建较大的数组的对象并执行一些有用不想为此消耗太多内存。
若要定义一个结构:
Structure SampleStructure
End Structure
struct SampleStruct
{
}
有关详细信息,请参阅:
Visual Basic
C#
类成员
每个类都可以有不同 类成员 包含描述类的数据、 定义类行为的方法和提供不同的类和对象之间的通信的事件的属性。
属性和字段
字段和属性表示对象包含的信息。字段是像变量,因为可以读取或直接设置。
若要定义一个字段:
Class SampleClass
Public SampleField As String
End Class
Class SampleClass
{
public string sampleField;
}
属性具有 get 和 set 过程,提供了更好地控制如何设置或返回值上。
C# 和 Visual Basic 都允许您创建一个用于存储属性值的私有字段或使用所谓的自动实现属性,创建此字段会自动在后台为属性过程中提供的基本逻辑。
若要定义一个自动实现的属性:
Class SampleClass
Public Property SampleProperty as String
End Class
class SampleClass
{
public int SampleProperty { get; set; }
}
如果您需要执行一些其他操作来读取和写入的属性值,定义一个用于存储属性值的字段,并提供基本的逻辑,用于存储和检索其:
Class Samplelass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
class SampleClass
{
private int _sample;
public int Sample
{
// Return the value stored in a field.
get { return _sample; }
// Store the value in the field.
set { _sample = value; }
}
}
大多数属性的方法或过程来设置和获取属性值。但是,您可以创建只读或只写属性来限制对它们的修改或读取。您可以使用 Visual Basic 只读 和 WriteOnly 关键字。在 C# 中,您可以忽略 获取 或 设置 属性的方法。但是,在 Visual Basic 和 C# 中,自动实现的属性不能是只读或只写。
有关详细信息,请参阅:
Visual Basic
C#
方法
A 方法 是一个对象可以执行的操作。
说明 |
---|
在 Visual Basic 中,有两种方法可以创建方法: " 子 如果该方法不会返回一个值 ; 如果使用语句 " 函数 如果方法的返回值,则使用语句。 |
若要定义类的方法:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
class SampleClass
{
public int sampleMethod(string sampleParam)
{
// Insert code here
}
}
一个类可以有多个实现,或 重载同一不同数量的参数或参数类型的方法。
重载方法:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
public int sampleMethod(string sampleParam) {};
public int sampleMethod(int sampleParam) {}
在大多数情况下您将声明中的类定义的方法。但是,Visual Basic 和 C# 还支持 扩展方法 这样,您可以将方法添加到现有类的实际类定义之外。
有关详细信息,请参阅:
Visual Basic
C#
构造函数
构造函数是在创建给定类型的对象时自动执行的类方法。构造函数通常用于初始化新对象的数据成员。构造函数可以只运行一次当创建一个类。此外,在构造函数中的代码始终在类中所有其他代码之前运行。但是,您可以以任何其他方法相同的方式创建多个构造函数重载。
若要定义类的构造函数:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
public class SampleClass
{
public SampleClass()
{
// Add code here
}
}
有关详细信息,请参阅:
Visual Basic
C#
析构函数
析构函数用于销毁类的实例。在.NET Framework 中,垃圾回收器会自动管理的分配和释放内存以供您的应用程序中的托管对象。但是,您仍可能需要析构函数来清理您的应用程序创建任何非托管资源。可以为一个类只能有一个析构函数。
关于析构函数和.NET Framework 中的垃圾回收的详细信息,请参阅 垃圾回收.
事件
事件使类或对象通知其他类或对象利益的事情发生。调用发送 (或引发) 该事件的类 发布服务器 并收到 (或处理) 该事件的类称为 订阅服务器.有关事件的详细信息,如何引发和处理,请参见 处理和引发事件.
Visual Basic
若要声明事件,请使用 Event 语句.
若要引发事件,请使用 RaiseEvent 语句.
若要指定使用声明性方法的事件处理程序,请使用 WithEvents (Visual Basic) 语句和 Handles 子句 (Visual Basic) 子句。
若要能够动态地添加、 删除和更改事件处理程序与事件相关联,请使用 AddHandler 语句 和 RemoveHandler 语句 一起使用 AddressOf 运算符 (Visual Basic).
C#
要声明类中的事件,请使用 event(C# 参考) 关键字。
若要引发事件,调用的事件委托。
若要订阅事件,请使用 += 运算符 ; 若要取消订阅事件,请使用 -= 运算符。
嵌套的类
在另一个类中定义的类称为 嵌套.默认情况下,嵌套的类是私有类。
Class Container
Class Nested
' Add code here.
End Class
End Class
class Container
{
class Nested
{
// Add code here.
}
}
若要创建嵌套的类的一个实例,请使用容器类跟点,再后跟该嵌套类的名称的名称:
Dim nestedInstance As Container.Nested = New Container.Nested()
Container.Nested nestedInstance = new Container.Nested()
访问修饰符以及具有的访问级别
所有类和类成员可以都指定自己为其他类提供使用何种访问级别 访问修饰符.
提供了以下访问修饰符:
Visual Basic 修饰符 |
C# 修饰符 |
定义 |
---|---|---|
在同一个程序集或另一个引用它的程序集的任何其他代码可以访问该类型或成员。 |
||
只有同一类中的代码可以访问该类型或成员。 |
||
只有通过在同一个类或派生类中的代码可以访问该类型或成员。 |
||
可以由同一程序集中,而不是从另一个程序集中的任何代码访问该类型或成员。 |
||
受保护的友元 |
受保护的内部 |
通过在同一程序集中的任何代码或另一个程序集中的任何派生类,可以访问该类型或成员。 |
有关详细信息,请参阅 Visual Basic 中的访问级别 和 访问修饰符(C# 编程指南).
实例化类
若要创建一个对象,您需要实例化类,或者创建类实例。
Dim sampleObject as New SampleClass()
SampleClass sampleObject = new SampleClass();
实例化类之后, 可以将值分配给该实例的属性和字段和调用类的方法。
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
// Set a property value.
sampleObject.sampleProperty = "Sample String";
// Call a method.
sampleObject.sampleMethod();
若要将值分配给属性类的实例化过程中,请使用对象初始值设定项:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
// Set a property value.
SampleClass sampleObject = new SampleClass
{ FirstProperty = "A", SecondProperty = "B" };
有关详细信息,请参阅:
Visual Basic
C#
静态 (共享) 类和成员
静态 (共享中的 Visual Basic) 成员的类是属性、 过程或由一个类的所有实例共享的字段。
若要定义一个静态 (共享) 成员:
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
static class SampleClass
{
public static string SampleString = "Sample String";
}
若要访问静态 (共享) 成员,而无需创建此类的对象使用的类的名称:
MsgBox(SampleClass.SampleString)
Console.WriteLine(SampleClass.SampleString);
C# 中的静态 (共享) 类和模块在 Visual Basic 中的具有仅限静态 (共享) 成员,不能实例化。静态 (共享) 成员也无法访问非静态 (非共享) 的属性、 字段或方法
有关详细信息,请参阅:
Visual Basic
C#
匿名类型
匿名类型使您能够创建对象,而无需编写数据类型的类定义。相反,编译器将为您生成一个类。此类已没有可用的名称,并包含在声明对象时指定的属性。
若要创建匿名类型的实例:
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
// sampleObject is an instance of a simple anonymous type.
var sampleObject =
new { FirstProperty = "A", SecondProperty = "B" };
有关详细信息,请参阅:
Visual Basic: 匿名类型 (Visual Basic)
C#: 匿名类型(C# 编程指南)
继承
继承使您能够创建一个新类,重用、 扩展和修改另一个类中定义的行为。其成员继承的类称为 基类并继承这些成员的类被调用 派生的类.但是,C# 和 Visual Basic 中的所有类隐式地从都继承 [使用T:System.Object] 支持.NET 类层次结构,并提供低级服务的所有类的类。
说明 |
---|
在.NET Framework 中的托管的语言不支持多重继承,i.e.可以指定的派生类只能有一个基类。 |
若要从一个基类继承:
Class DerivedClass
Inherits BaseClass
End Class
class DerivedClass:BaseClass{}
默认情况下可以继承的所有类。但是,可以指定类不能用作基类,还是创建一个类可以用作基类的类只。
指定类不能用作基类的类:
NotInheritable Class SampleClass
End Class
public sealed class A { }
若要指定一个类可以用作基类只和不能实例化:
MustInherit Class BaseClass
End Class
public abstract class B { }
有关详细信息,请参阅:
Visual Basic
C#
重写成员
默认情况下,派生的类从其基类继承的所有成员。如果您想要更改继承成员的行为,则需要将其重写。也就是说,可以在派生类中定义方法、 属性或事件的新实现。
下列修饰符用于控制如何重写的属性和方法:
Visual Basic 修饰符 |
C# 修饰符 |
定义 |
---|---|---|
允许在派生类中重写类成员。 |
||
将重写基类中定义的虚拟 (可重写) 成员。 |
||
不受支持 |
防止在继承类中被重写的成员。 |
|
要求在派生类中重写类成员。 |
||
隐藏从基类继承的成员 |
接口
像类一样,接口也定义了一组属性、 方法和事件。但与类不同,接口不提供实现。它们实现的类,而且作为单独的实体,从类定义。接口表示一种约定,实现接口的类必须严格按其定义实现接口的每个方面。
若要定义接口:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
interface ISampleInterface
{
void doSomething();
}
若要在类中实现接口:
Class SampleClass
Implements ISampleInterface
Sub doSomething
' Method implementation.
End Sub
End Class
class SampleClass : ISampleInterface
{
void ISampleInterface.SampleMethod()
{
// Method implementation.
}
}
有关详细信息,请参阅:
Visual Basic
C#
泛型
类、 结构、 接口和.NET Framework 中的方法可以 类型参数 定义可以存储或使用的对象的类型。泛型的最常见的示例是一个集合,您可以在其中指定要存储在集合中的对象类型。
若要定义一个泛型类:
Class SampleGeneric(Of T)
Public Field As T
End Class
Public class SampleGeneric<T>
{
public T Field;
}
若要创建泛型类的实例:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
SampleGeneric<string> sampleObject = new SampleGeneric<string>();
sampleObject.Field = "Sample string";
有关详细信息,请参阅:
委托
A 委托 是一种类型,它定义方法签名,并可以提供具有兼容签名的任何方法的引用。可以调用 (或调用) 通过该委托的方法。委托用于将方法作为参数传递给其他方法。
说明 |
---|
事件处理程序只不过通过委托调用的方法。有关使用委托在事件处理中的详细信息,请参阅 事件和委托. |
若要创建一个委托:
Delegate Sub SampleDelegate(ByVal str As String)
public delegate void SampleDelegate(string str);
若要创建对指定该委托的签名相匹配的方法的引用:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
class SampleClass
{
// Method that matches the SampleDelegate signature.
public static void sampleMethod(string message)
{
// Add code here.
}
// Method that instantiates the delegate.
void SampleDelegate()
{
SampleDelegate sd = sampleMethod;
sd("Sample string");
}
}
有关详细信息,请参阅:
Visual Basic
C#