1:访问修饰符

访问修饰符可以定义应用程序中类成员的作用域。和C++有一些不同,下面说明一下:

public:访问不受限制,public成员可以被任何其他类访问。

private:访问只限于包含该成员的类,只有包含该成员的类才可以访问。

protected:访问限于包含该成员的类及该类的派生类。

internal:访问只限于所在的程序集,只有在同一程序集内的类才可以访问该成员。

protected internal:访问限于包含该成员的类、其派生类,及与其位于同一个程序集内的类。

2:创建对象

在C#语言中,每创建一个对象,都会首先调用new关键字后面指明的构造函数,来初始化该类对象,具体语法如下:

<类名><对象名>=new<构造函数(参数列表)>

new关键字示例:

Circle c=new Circle(0,0,10);

  访问对象成员的语法如下:

<对象名>.<成员名>

访问对象成员的示例:

double area;
area=c.getArea();

3:以一个例子总结创建类和对象的过程

(1)创建一个名为Circle的类,其内部代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication38
{
class Circle//定义Circle类
{
//定义字段
private int radius;
//定义方法
//构造函数
public Circle(int radiusValue)
{
radius = radiusValue;
}
//为radius字段编写setR()方法,为radius字段赋值,注意对字段要验证其合法性
public void setR(int radius_1)
{
if (radius_1 >= 0)
radius = radius_1;
else
radius = 0;
}
//为radius字段编写getRadius()方法,以便于用户获取字段值
public int getRadius()
{
return radius;
}
//定义getArea()方法求圆面积
public double getArea()
{
return 3.14 * radius * radius;
}
}
}

(2)在Program.cs文件中编写如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication38
{
class Program
{
static void Main(string[] args)
{
double r;
Circle circle = new Circle(1);//创建Circle类对象circle
r = circle.getArea();//调用对象circle的getArea()方法成员
Console.Write("圆半径为" + circle.getRadius() + "的圆面积:");
Console.WriteLine(r); circle.setR(10);
r = circle.getArea();//调用对象circle的getArea()方法成员
Console.Write("圆半径为" + circle.getRadius() + "的圆面积:");
Console.WriteLine(r);
Console.ReadLine(); }
}
}

(3)运行结果:

4:方法

方法就相当于函数

(1)方法的定义和调用示例

class Circle//定义Circle类
{
......
//定义getArea()方法求圆面积
public double getArea()
{
return 3.14*radius*radius;
}
}
class Program
{
static void Main(string[]args)
{
double area;
Circle circle=new Circle(1);
area=circle.getArea();//调用getArea()方法
Console.Write(circle.getRadius()+";");
Console.WriteLine(area);
Console.ReadLine();
}
}

(2)方法中的参数传递之值传递

class Program
{
static void Main(string[]args)
{
int a=3;
Square(a);
Console.WriteLine(a);
Console.ReadLine();
}
static void Square(int x)
{
x=x*x;
}
}

  调用Square()方法时,先将变量a的复制值传递给Square方法的参数x。x是Square()方法的局部变量,该局部变量在方法返回时被丢弃。因此,实际上并没有更改a变量中值。程序输出结果为3.

(3)方法的参数传递之引用传递

当变量通过引用传递时,方法接收到的是对实际变量数值的引用。因此在方法中对这个变量的任何更改都将改变原来的变量。通过使用ref关键字声明引用参数。一但在参数列表中使用了关键字ref,编译器就知道相应变量的数字通过引用来传递。如以下代码所示:

class Program
{
static void Main(string[]args)
{
int b=4;
Square(ref b);
Console.WriteLine(b);
Console.ReadLine();
}
static void Square(ref int x)
{
x=x*x;
}
}

  调用Square()方法时,因为使用了ref关键字,所以变量b以引用方式传递给Square方法的参数x。Square()方法对x变量进行了更改,也就是对变量b进行了更改。程序输出结果为16.

5:方法的重载

C#语言允许多个方法使用相同的名称,只要每个方法拥有不同的参数列表即可。这样定义方法的形式称为方法重载。如以下代码所示:

class Program
{
public static int Add(int i,int j)
{
return(i+j);
}
public static double Add(double x,double y)
{
return(x+y);
}
public static string Add(string s1,string s2)
{
return(s1+s2);
}
static void Main(string[]args)
{
Console.WriteLine(Add(1,2));
Console.WriteLine(Add(1.5,2.5));
Console.WriteLine(Add("Hello","world"));
Console.ReadLine();
} }

  当程序中的一个重载方法被调用时,C#编译器通过检查调用者使用的参数的数目、类型和顺序来选择具体的方法。在上述代码中,虽然有多个Add()方法,但是每个Add()方法中参数的个数和类型不完全相同,所有系统在调用时会自动找到最匹配的方法。

和方法一样,类的构造函数也可以重载。对构造函数重载有助于以多种方式创建实例。例如:Circle类代码

public Circle()
{
radius=0;
}
public Circle(int radius Value)
{
radius=radius Value;
}

  在Programs.cs中创建Circle类对象的代码如下:

double area;
Circle c1=new Circle();
area=c1.getArea();
Console.Write(c1.getRadius()+":");
Console.WriteLine(area);
Circle c2=new Circle(10);
area=c2.getArea();
Console.Write(c2.getRadius()+":");
Console.WriteLine(r);

  当创建c1对象时,将调用与之匹配的构造函数,及Circle()。当创建c2对象时,将调用与之匹配的构造函数,即Circle(int radius Value).

6:属性

尽管使用private这样的访问修饰符可以控制对类成员的访问,但是,在C#中通过使用属性,可以更有效地管理对类成员的访问。属性是一种类成员,它可以用来控制其他对象对本对象数据的访问。

定义属性的语法形式如下:

public|protected 数据成员数据类型 属性名
{
get{
//获取属性的代码
}
set{
//设置属性的代码
}
}

  例如:

建立Circle类,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication39
{
class Circle
{
private int radius;
const double PI = 3.14;
public Circle(int radiusValue)
{
CircleRadius = radiusValue;
}
//CircleRadius属性
public int CircleRadius
{
get
{
return radius;
}
set
{
radius = ((value >= 0) ? value : 0);
}
}
public double getArea() {
return PI * CircleRadius * CircleRadius;
}
}
}

  主程序Program中代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication39
{
class Program
{
static void Main(string[] args)
{
Circle c = new Circle(1); c.CircleRadius = 10;
Console.WriteLine(c.getArea()); c.CircleRadius = -9;
Console.WriteLine(c.getArea()); Console.ReadLine();
}
}
}

  运行结果:

通过get访问器和set访问器访问private数据,不仅防止字段接受无效值,而且也隐藏了字段的内部实现。根据情况的不同,C#语言允许只提供get访问器或者只提供set访问器,也可以同时提供get和set访问器。

C#_类的更多相关文章

  1. C++_进阶之函数模板_类模板

     C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...

  2. 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用

    package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...

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

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

  4. Python_面向对象_类2

    类的几个装饰器方法: @classmethod (类方法):使之无法访问实例变量 class Animal(object): def __init__(self, name): self.name = ...

  5. oc_转_类的数组的实现和操作

    OC的数组对象的基本方法的使用:因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为:   01.#import&l ...

  6. 04737_C++程序设计_第4章_类和对象

    例4.1 描述点的Point类. 例4.2 根据上面对Point类的定义,演示使用Point类的对象. #define _SCL_SECURE_NO_WARNINGS #include <ios ...

  7. 04737_C++程序设计_第7章_类模板与向量

    例7.1 使用类模板的实例. 例7.2 求4个数中最大值的类模板程序. #include <iostream> using namespace std; template <clas ...

  8. C++_基础_类和对象3

    内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...

  9. C++_基础_类和对象2

    内容: (1)构造函数 (2)初始化列表及其必要性 (3)支持自定义类型转换的构造函数 (4)this指针 (5)const对象和成员函数 (6)析构函数 1.构造函数1.1 格式: class 类名 ...

  10. C++_基础_类和对象

    内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...

随机推荐

  1. python 识别图像主题并切割

    两种办法,一种是用百度的API,效果还可以,不过好像每天有50次的调用的限制 from aip import AipImageClassify import cv2 """ ...

  2. vue 父子组件数据的双向绑定大法

    官方文档说明 所有的 prop 都使得其父子 prop 之间形成了一个 单向下行绑定 父级 prop 的更新会向下流动到子组件中,但是反过来则不行 2.3.0+ 新增 .sync 修饰符 以 upda ...

  3. [转载]Linux缓存机制

    [转载]Linux缓存机制 来源:https://blog.csdn.net/weixin_38278334/article/details/96478405 linux下的缓存机制及清理buffer ...

  4. 【php设计模式】观察者模式

    当对象间存在一对多关系时,则使用观察者模式.比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. <?php class Subject{ private $obser ...

  5. vue项目中图片预览旋转功能

    最近项目中需要在图片预览时,可以旋转图片预览,在网上找了下,发现有一款功能强大的图片组件:viewerjs. git-hup: https://github.com/fengyuanchen/view ...

  6. 编译luacheck Linux版

    最近在写Visual Studio Code的Lua插件,需要把luacheck集成进去.但是luacheck默认只提供了win32版本,见https://github.com/mpeterv/lua ...

  7. Delphi 10.3.3最新消息

    有朋友说,已经开始内测,预计10月末发版,按最新的路线图,此版本支持iOS 13及Android 64位. 2019-11-18,今天,下载及注册机都来了,快下载安装,试用吧. 需要的话加入QQ群20 ...

  8. Python---安装路径查看

    python是解释型脚本语言,在执行时,逐句解释执行,不需要进行预编译.但需要有自身的Python解释器.  所以在执行Python代码时,需要指定python解释器.  指定解释器方法: 在文件开头 ...

  9. 打开myeclipse提示An internal error occurred during: "CheckLicensesAndNotify". com/genuitec/pulse2/client/targetcfg/ui/PulseActivator

    打开myeclipse提示An internal error occurred during: "CheckLicensesAndNotify". com/genuitec/pul ...

  10. LNMP原理

    在linux系统中,LNMP是目前网站主流架构之一,LNMP中L指linux系统平台,N是nginx指网站的前端程序,发布静态页面和调用外部程序解析动态页面,M是mysql指网站的后台数据库,P是PH ...