类的定义是以关键字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. 【pytest】teardown里的yield和addfinalizer

    在之前介绍pytest中的fixture用法的文章中https://zhuanlan.zhihu.com/p/87775743,提到了teardown的实现. 最近在翻pytest官方文档的时候,又发 ...

  2. Canalv1.1.4版本搭建HA集群

    前提 Canal上一个正式版是于2019-9-2发布的v1.1.4,笔者几个月前把这个版本的Canal推上了生产环境,部署了HA集群.过程中虽然遇到不少的坑,但是在不出问题的前提下,Canal的作用还 ...

  3. Diophantus of Alexandria(唯一分解定理)

    Diophantus of Alexandria was an Egypt mathematician living in Alexandria. He was one of the first ma ...

  4. Weights and Measures (贪心+dp)

    I know, up on top you are seeing great sights, But down at the bottom, we, too, should have rights. ...

  5. 三层架构的一点理解以及Dapper一对多查询

    1.首先说一下自己对三层架构的一点理解 论坛里经常说会出现喜欢面相对象的写法,所以使用EF的,我个人觉得他俩没啥关系,先别反对,先听听我怎么说吧. 三层架构,基本都快说烂了,但今天还是说三层架构:UI ...

  6. .net mvc web api上传图片/文件并重命名

    #region 上传图片 /// <summary> /// 上传图片到服务器 当error为0时成功,为1时失败 并从errmsg获取消息 /// </summary> // ...

  7. Apache2.4 下载和安装 - Win10

    Apache安装包已放入百度网盘,链接地址在本文最后 1.下载Windows版本的Apahce安装包 a. 访问官网,进入下载页面 https://www.apachelounge.com (apac ...

  8. Docker 学习笔记一

    Docker 学习笔记一 1.Docker是什么?         Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.让开发者打包他们的应用以及依赖包到一 ...

  9. unzip命令笔记

    unzip命令 文件压缩与解压 unzip命令用于解压缩由zip命令压缩的".zip"压缩包. 语法 unzip(选项)(参数) 选项 -c:将解压缩的结果显示到屏幕上,并对字符做 ...

  10. Appium之启动第一个App

    搭建appium自动化环境真是各种问题呀. 如何启动在真机上启动App? 执行操作:操作Android真机上打开手机淘宝app,并搜索“熊猫”. 脚本源码如下: from appium import ...