面向对象编程,或 C# 中的 OOPS 概念,是一种包含对象集合的编程类型。每个对象都包含数据字段和数据成员。与 C、FORTRAN、BASIC 等过程式编程语言不同,C# 面向对象编程语言(OOPS 概念)可以轻松升级。
在这里,我们将学习 C# OOPS(面向对象编程)的概念,如类、对象、封装、继承、多态等。其中,封装、继承和多态是实现面向对象编程模型的有用机制。
C# 类
类是用户定义类型,它是 C# OOPS 或面向对象编程的主要概念。
类就像创建对象的蓝图或模板。C# 类不分配任何内存。但内存只分配给创建的类实例。C# 类的语法是
class <classname>
{
}
C# 对象
OOPS 概念中的 C# 对象被称为类的实例,对象包含数据字段和成员函数(数据成员)。实际上,在实时环境中,一切都被认为是对象。这同样适用于面向对象编程。
- 对象是可以被看到或想象的实体。
- 对象具有一些属性,用于识别其当前状态并进行验证。
- 数据成员或成员函数用于说明其功能或行为。
- 事件用于表示其状态的变化。
因此,我们可以说对象可以根据其状态、功能和事件相互区分。例如,如果我们把一个旋转的风扇看作一个对象,
- 一个被叶片包围的旋钮,它的品牌和颜色描绘了旋转风扇的状态。
- 风扇产生的气流被称为它的功能。
- 而旋转时叶片位置的变化则表示其状态的变化。
在 C# 面向对象术语中,我们说要访问类中的数据字段和成员函数,需要为该类创建一个对象。
OOPS 概念中的 C# 类实例语法
<ClassName> <ObjectName> = new <ConstructorName(<parameter list>)
在为 C# 类创建对象时,这里使用 new 关键字。
C# 变量、实例(对象)和引用之间的区别
本节涵盖 C# 变量、实例(对象)和引用。通过每个示例,您将了解它们之间的区别。
C# 变量
OOPS 概念中的 C# 变量只不过是一个未初始化的类的副本,例如。
int x; x 是 int 类型的一个副本。
string s; String 是一个类,s 是类 string 的副本。
这里,数据类型 int 和类 string 是一个没有分配内存的蓝图。但对于变量 x 和 s,内存是分配的。
因此,变量是特定数据类型的副本,它占用一些内存。相反,C# 数据类型是一个逻辑上的或一个没有分配内存的蓝图。
例如,房屋平面图就像数据类型,根据该平面图建造的实体房屋就是变量。即,上述上下文中的 int 或 string 没有任何内存,而变量具有物理内存。
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharp_Tutorial
{
class Class1
{
int x = 100;
static void Main(string[] args)
{
Console.WriteLine(x);
}
}
}

在上述 C# OOPS 程序中,当我们尝试在 main 方法中打印变量 x 时,它会显示一个错误。错误提示您正在尝试在静态 main 方法中打印非静态类变量。
在 C# 中,我们必须为该类创建一个实例才能初始化变量或在 main 方法中打印任何值。并使用该实例打印值,否则它会抛出错误,如下面的代码所示。
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharp_Tutorial
{
class Class1
{
int x = 100;
static void Main(string[] args)
{
Class1 c = new Class1();
Console.WriteLine(c.x);
}
}
}
输出

这是因为 C# 变量是未初始化的类的副本。
C# 实例
OOPS 概念中的 C# 实例只不过是类的副本,它有助于使用关键字 new 初始化变量。每个实例都有自己的内存。
为一个 C# 实例分配的内存永远不会与另一个实例共享。这意味着创建了多少个实例,就会为多少个实例分配内存,而无需内存共享。
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharp_Tutorial
{
class Class1
{
int x = 50;
public Class1()
{
Console.WriteLine("value of x is " + x);
}
public Class1(int i)
{
Console.WriteLine("value of i is " + i);
}
static void Main(string[] args)
{
Console.WriteLine("Default Constructor is invoked");
Class1 c = new Class1();
Class1 c1 = new Class1();
Console.WriteLine("Parameterized Constructor is invoked");
Class1 c2 = new Class1(100);
Class1 c3 = new Class1(200);
}
}
}
输出

在上面的程序中,为 Class1 创建了四个实例,
实例 c、c1 使用默认或无参数构造函数 Class1() 创建。而实例 c2、c3 使用参数化构造函数 Class1(int i) 创建。
无论使用哪个构造函数创建的所有实例都将分配独立的内存位置。
C# 引用
C# OOPS 概念中的引用也是类的副本,它与现有实例一起初始化。但是,引用没有分配任何内存。相反,它是为了共享实例的内存而创建的。
C# 类的引用也可以说是实例的指针。通过实例引用的字段和成员函数执行的每个操作都会反映该引用。反之亦然(使用引用进行的更改会反映到创建它的实例)。
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharp_Tutorial
{
class Class1
{
int x;
public Class1(int i)
{
x = i;
}
static void Main(string[] args)
{
Class1 c = new Class1(100);
Class1 c2 = c;
Console.WriteLine("x value using instance c");
Console.WriteLine(c.x);
Console.WriteLine("x value using reference c2");
Console.WriteLine(c2.x);
}
}
}
输出

在上面编写的 OOPS 概念代码中,c 是 Class1 的实例,而 c2 是为 c 创建的引用。
当我们尝试打印时,使用实例 c 和引用 c2 的 x 值是相同的。输出,即使用引用 c2 打印的 100,是因为它指向实例 c。