类的定义是以关键字class开始的,后面跟类的名称,类的主题包含一个花括号里,下面是类定义的一般格式。

<access specifier> class class_name
{
// member variables
<access specifier> <data type> variables1;
<access specifier> <data type> variables2;
//member method
<access specifier> <return Type> method1(parameter_list)
{
//method body
}
}

请注意:

  • 访问标识符<access specifier>指定了对类及其成员的访问规则。如果没有指定则使用默认的访问标识符,类的默认访问标识符是internal,类成员的默认访问标识符是private。
  • 数据类型<data type>指定了变量的类型,返回类型<return type>定义了返回方法的返回的数值类型。
  • 如果访问里面的成员,需要用(.)运算符
  • 点运算符链接了对象的名称和成员的名称
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace test_unityc
{ class Box
{
public double length;//长度
public double breadth;//宽度
public double height;//高度
} class Box_tester
{
static void Main(string[] args)
{
Box box1 = new Box();//声明box1,类型为Box
Box box2 = new Box();//声明box2,类型为Box
double volume = 0.0f;//体积 //box1详述
box1.height = 5.0;
box1.length = 6.0;
box1.breadth = 7.0; //box2详述
box2.breadth = 10.0;
box2.length = 12.0;
box2.height = 13.0; //box1的体积
volume = box1.height * box1.breadth * box1.length;
Console.WriteLine("box1的体积{0}", volume); //box1的体积
volume = box2.height * box2.breadth * box2.length;
Console.WriteLine("box2的体积{0}", volume); Console.ReadKey(); }
}
}

当上面的代码执行时,它会出现如下效果:

box1的体积210
box2的体积1560 

成员函数和封装

类的成员函数是一个在类的定义中有它的定义或原型的函数,就像其他的变量一样。作为类的一个成员,它能在类的任意对象上操作,且能访问该对象类的所有成员。

成员变量是类的属性(从设计角度),且它们保持私有来实现封装。这些变量只能使用公共成员函数来访问。

现在用使用上面的概念来设置并获取一个类当中不同类成员的值:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace test_unityc
{ class Box
{
private double length;//长度
private double breadth;//宽度
private double height;//高度
public void setLength(double len)
{
length = len; }
public void setBreadth(double bre)
{
breadth = bre; }
public void setHeight(double hei)
{
height = hei;
}
public double getVolume()
{
return length * breadth * height;
}
} class Box_tester
{
static void Main(string[] args)
{
Box box1 = new Box();//声明box1,类型为Box
Box box2 = new Box();//声明box2,类型为Box
double volume;//体积 //box1详述
box1.setHeight(5.0);
box1.setLength(6.0);
box1.setBreadth(7.0); //box2详述
box2.setHeight(12);
box2.setLength(13);
box2.setBreadth(14); //box1的体积
volume = box1.getVolume();
Console.WriteLine("box1的体积{0}", volume); //box1的体积
volume = box2.getVolume();
Console.WriteLine("box2的体积{0}", volume); Console.ReadKey(); }
}
}

运行结果:

box1的体积210
box2的体积2184

C#中的构造函数

类的构造函数是类的一个特殊的成员函数,当创建类的新对象是执行。

构造函数的函数名称与类名称完全相同,且它没有任何返回类型。

下面的实例说明了构造函数的概念:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace week2._1
{
class Program
{
private double line; // 线条的长度
public Program()
{
Console.Write("对象已经创建");
} public void setLength(double len)
{
line = len;
}
public double getLength()
{
return line;
}
static void Main(string[] args)
{
Program line = new Program();
//设置线条长度
line.setLength(6.0);
Console.Write("线条的长度为{0}", line.getLength());
Console.ReadKey();
}
}
}

结果为:

对象已经创建线条的长度为6

默认的构造函数没有参数,但是如果需要可以带参数,这种构造参数叫做参数化构造参数,这种对象可以帮助你在创建对象的同时给对象赋初始值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace week2._1
{
class Program
{
private double line; // 线条的长度
public Program(double len)//参数化构造参数
{
Console.Write("对象已经创建,length = {0}",len);
line = len;
} public void setLength(double len)
{
line = len;
}
public double getLength()
{
return line;
}
static void Main(string[] args)
{
Program line = new Program(10.0);
Console.WriteLine("线条的长度为:{0}", line.getLength());
//设置线条长度
line.setLength(6.0);
Console.Write("线条的长度为:{0}", line.getLength());
Console.ReadKey();
}
}
}

结果:

对象已经创建,length = 10
线条的长度为:10
线条的长度为:6

c#中的析构函数

类当中的析构函数是类当中的一种特殊的成员函数,当类的对象超出范围时执行。

析构函数的名称是在类名称前面加一个波浪号(~)做前缀,它不返回值,也不带任何参数。

析构函数用于结束程序(比如关闭文件,释放内存等)之前释放资源,析构函数不能继承或重载。

下面的实例说明析构函数的概念:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace week2._1
{
class Program
{
private double line; // 线条的长度
public Program()//构造参数
{
Console.WriteLine("对象已经创建");
}
//析构函数
~Program()
{
Console.WriteLine("对象已经删除");
} static void Main(string[] args)
{ Program line = new Program(); }
}
}

结果:

对象已经创建
对象已经删除

c#的静态成员

我们可以使用static关键字把类成员定义成静态的,当我们声明一个类成员是静态的时,意味着无论有多少个类的对象被创建,只会有一个改静态成员的副本。

关键字static意味着类中只有一个该成员的实例,静态变量用于定义变量,因为他们的值可以通过直接调用类而不需要创建类的实例来获取,静态变量可以再成员函数或类的定义外部进行初始化。你也可以在类的内部初始化。(静态变量在外部可以通过  类.变量名 访问 。实例变量通过创建实例对象在外部 对象名.变量名 访问

下面实例演示了静态变量的的用法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace week2._1
{
public class Test
{
public static int num;
public int number; public void addNum()
{
num++;
}
public int getNum()
{
return num;
} }
class Program
{ static void Main(string[] args)
{ Test.num = 2;
Test test1 = new Test();
Test test2 = new Test();
test1.number = 1;
test1.addNum();
test1.addNum();
test1.addNum();
test2.addNum();
test2.addNum();
test2.addNum();
Console.WriteLine(test1.getNum());
Console.WriteLine(test2.getNum());
Console.ReadLine();
}
}
}

结果:

8
8

你也可以把一个成员函数声明为static。这样的函数只能访问静态变量。静态函数在对象创建之前就已经存在了。下面的实例演示了静态函数(只能通过类名.方法名调用)的用法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace week2._1
{
public class Test
{
public static int num;
public int number; public void addNum()
{
num++;
number--;
}
public static int getNum()
{
return num;
return number;//出错
} }
class Program
{ static void Main(string[] args)
{
Test test1 = new Test();
Test test2 = new Test();
test1.addNum();
test1.addNum();
test1.addNum();
test2.addNum();
test2.addNum();
test2.addNum();
Console.WriteLine(Test.getNum());
Console.WriteLine(Test.getNum());
Console.ReadLine();
}
}
}

结果:

6
6

将类成员函数声明为public static无需实例化即可调用类成员函数

反之,如果不声明为static,即使和Main方法从属于同一个类,也必须经过实例化

c#类(class)的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  3. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  4. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  5. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  8. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  9. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

  10. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

随机推荐

  1. Single Shot MultiBox Detector论文翻译【修改】

    这几天读了SSD论文的原理部分,看了别人的翻译,发现很多应该都是google直接翻译过来的,有些地方读的不是很通顺,自己就在自己的理解和搜索的基础上对我看的那篇翻译做了一些修改.[原文地址:http: ...

  2. 用android studio多渠道打包

    1. 官方教程 https://developer.android.com/studio/build/build-variants.html 2. 设置Build Types参数 打开 Project ...

  3. 最通俗易懂的 Redis 架构模式详解

    前言 话说有一名意大利程序员,在 2004 年到 2006 年间主要做嵌入式工作,之后接触了 Web,2007 年和朋友共同创建了一个网站,并为了解决这个网站的负载问题(为了避免 MySQL 的低性能 ...

  4. 白嫖码云Pages,两分钟的事,就能搭个百度能搜到的个人博客平台

    为了攒点钱让女儿做个富二代(笑),我就没掏钱买服务器,白嫖 GitHub Pages 搭了一个博客平台.不过遗憾的是,GitHub Pages 只能被谷歌收录,无法被百度收录,这就白白损失了一大波流量 ...

  5. cometoj(A-D+F+H)代码

    A #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> ...

  6. 实验 1:Mininet 源码安装和可视化拓扑工具

    实验 1:Mininet 源码安装和可视化拓扑工具 一.实验目的 掌握 Mininet 的源码安装方法和 miniedit 可视化拓扑生成工具. 二.实验任务 使用源码安装 Mininet 的 2.3 ...

  7. .NET多线程(Thread,ThreadPool,Task,Async与Await)

    .NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...

  8. (.net core环境下)图形验证,人机交互,一个不够我给你两个

    做软件,遇到一些通用性的功能,我想绝大多数同学都是去网上(或自己之前的项目中)搜一段代码出来,贴到项目中,修修改改,完成任务. 但身为一个有追求的软件工程师,怎么能一直忍受这种低级的操作呢?插件化,模 ...

  9. JS -- JavaScript简介

    JavaScript是一种属于网络的高级脚本语言(解释性脚本语言),已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果. 一.如何插入JS代码? 使用&l ...

  10. 修改mysql、oracle、sqlserver默认端口

    一.修改mysql默认端口1202 1.修改mysql安装路径下的my.ini文件中的2个port值 2.修改后重启服务,win+r输入services.msc进入服务,重启服务 二.修改oracle ...