C# 类(Class) - 菜鸟教程
文章推薦指數: 80 %
C# 类(Class) 当你定义一个类时,你定义了一个数据类型的蓝图。
...
这实际上并没有定义任何的数据,但它定义了类的名称意味着什么,也就是说,类的对象由什么组成及在这个对象上可执行什么操作。
对象是类的实例。
构成类的方法和变量称为类的成员。
类的定义
类的定义是以关键字class开始,后跟类的名称。
类的主体,包含在一对花括号内。
下面是类定义的一般形式:
如果没有指定,则使用默认的访问标识符。
类的默认访问标识符是internal,成员的默认访问标识符是private。
数据类型
如果要访问类的成员,你要使用点(.)运算符。
点运算符链接了对象的名称和成员的名称。
下面的实例说明了目前为止所讨论的概念:
实例
usingSystem;
namespaceBoxApplication
{
classBox
{
publicdoublelength; //长度
publicdoublebreadth; //宽度
publicdoubleheight; //高度
}
classBoxtester
{
staticvoidMain(string[]args)
{
BoxBox1=newBox(); //声明Box1,类型为Box
BoxBox2=newBox(); //声明Box2,类型为Box
doublevolume=0.0; //体积
//Box1详述
Box1.height=5.0;
Box1.length=6.0;
Box1.breadth=7.0;
//Box2详述
Box2.height=10.0;
Box2.length=12.0;
Box2.breadth=13.0;
//Box1的体积
volume=Box1.height*Box1.length*Box1.breadth;
Console.WriteLine("Box1的体积:{0}", volume);
//Box2的体积
volume=Box2.height*Box2.length*Box2.breadth;
Console.WriteLine("Box2的体积:{0}",volume);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Box1的体积:210
Box2的体积:1560
成员函数和封装
类的成员函数是一个在类定义中有它的定义或原型的函数,就像其他变量一样。
作为类的一个成员,它能在类的任何对象上操作,且能访问该对象的类的所有成员。
成员变量是对象的属性(从设计角度),且它们保持私有来实现封装。
这些变量只能使用公共成员函数来访问。
让我们使用上面的概念来设置和获取一个类中不同的类成员的值:
实例
usingSystem;
namespaceBoxApplication
{
classBox
{
privatedoublelength; //长度
privatedoublebreadth; //宽度
privatedoubleheight; //高度
publicvoidsetLength(doublelen)
{
length=len;
}
publicvoidsetBreadth(doublebre)
{
breadth=bre;
}
publicvoidsetHeight(doublehei)
{
height=hei;
}
publicdoublegetVolume()
{
returnlength*breadth*height;
}
}
classBoxtester
{
staticvoidMain(string[]args)
{
BoxBox1=newBox(); //声明Box1,类型为Box
BoxBox2=newBox(); //声明Box2,类型为Box
doublevolume; //体积
//Box1详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
//Box2详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
//Box1的体积
volume=Box1.getVolume();
Console.WriteLine("Box1的体积:{0}",volume);
//Box2的体积
volume=Box2.getVolume();
Console.WriteLine("Box2的体积:{0}",volume);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Box1的体积:210
Box2的体积:1560
C#中的构造函数
类的构造函数是类的一个特殊的成员函数,当创建类的新对象时执行。
构造函数的名称与类的名称完全相同,它没有任何返回类型。
下面的实例说明了构造函数的概念:
实例
usingSystem;
namespaceLineApplication
{
classLine
{
privatedoublelength; //线条的长度
publicLine()
{
Console.WriteLine("对象已创建");
}
publicvoidsetLength(doublelen)
{
length=len;
}
publicdoublegetLength()
{
returnlength;
}
staticvoidMain(string[]args)
{
Lineline=newLine();
//设置线条长度
line.setLength(6.0);
Console.WriteLine("线条的长度:{0}",line.getLength());
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
对象已创建
线条的长度:6
默认的构造函数没有任何参数。
但是如果你需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数。
这种技术可以帮助你在创建对象的同时给对象赋初始值,具体请看下面实例:
实例
usingSystem;
namespaceLineApplication
{
classLine
{
privatedoublelength; //线条的长度
publicLine(doublelen) //参数化构造函数
{
Console.WriteLine("对象已创建,length={0}",len);
length=len;
}
publicvoidsetLength(doublelen)
{
length=len;
}
publicdoublegetLength()
{
returnlength;
}
staticvoidMain(string[]args)
{
Lineline=newLine(10.0);
Console.WriteLine("线条的长度:{0}",line.getLength());
//设置线条长度
line.setLength(6.0);
Console.WriteLine("线条的长度:{0}",line.getLength());
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
对象已创建,length=10
线条的长度:10
线条的长度:6
C#中的析构函数
类的析构函数是类的一个特殊的成员函数,当类的对象超出范围时执行。
析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。
析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。
析构函数不能继承或重载。
下面的实例说明了析构函数的概念:
实例
usingSystem;
namespaceLineApplication
{
classLine
{
privatedoublelength; //线条的长度
publicLine() //构造函数
{
Console.WriteLine("对象已创建");
}
~Line()//析构函数
{
Console.WriteLine("对象已删除");
}
publicvoidsetLength(doublelen)
{
length=len;
}
publicdoublegetLength()
{
returnlength;
}
staticvoidMain(string[]args)
{
Lineline=newLine();
//设置线条长度
line.setLength(6.0);
Console.WriteLine("线条的长度:{0}",line.getLength());
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
对象已创建
线条的长度:6
对象已删除
C#类的静态成员
我们可以使用static关键字把类成员定义为静态的。
当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。
关键字static意味着类中只有一个该成员的实例。
静态变量用于定义常量,因为它们的值可以通过直接调用类而不需要创建类的实例来获取。
静态变量可在成员函数或类的定义外部进行初始化。
你也可以在类的定义内部初始化静态变量。
下面的实例演示了静态变量的用法:
实例
usingSystem;
namespaceStaticVarApplication
{
classStaticVar
{
publicstaticintnum;
publicvoidcount()
{
num++;
}
publicintgetNum()
{
returnnum;
}
}
classStaticTester
{
staticvoidMain(string[]args)
{
StaticVars1=newStaticVar();
StaticVars2=newStaticVar();
s1.count();
s1.count();
s1.count();
s2.count();
s2.count();
s2.count();
Console.WriteLine("s1的变量num:{0}",s1.getNum());
Console.WriteLine("s2的变量num:{0}",s2.getNum());
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
s1的变量num:6
s2的变量num:6
你也可以把一个成员函数声明为static。
这样的函数只能访问静态变量。
静态函数在对象被创建之前就已经存在。
下面的实例演示了静态函数的用法:
实例
usingSystem;
namespaceStaticVarApplication
{
classStaticVar
{
publicstaticintnum;
publicvoidcount()
{
num++;
}
publicstaticintgetNum()
{
returnnum;
}
}
classStaticTester
{
staticvoidMain(string[]args)
{
StaticVars=newStaticVar();
s.count();
s.count();
s.count();
Console.WriteLine("变量num:{0}",StaticVar.getNum());
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
变量num:3
C#枚举(Enum)
C#继承
4篇笔记
写笔记
#0 Nihil 100***[email protected]将类成员函数声明为publicstatic无需实例化即可调用类成员函数
usingSystem;
namespaceConsoleApp
{
classProgram
{
staticvoidMain(string[]args)
{
intnum=AddClass.Add(2,3);//编译通过
Console.WriteLine(num);
}
}
classAddClass
{
publicstaticintAdd(intx,inty)
{
returnx+y;
}
}
}
反之,如果不声明为static,即使和Main方法从属于同一个类,也必须经过实例化
usingSystem;
namespaceConsoleApp
{
classProgram
{
staticvoidMain(string[]args)
{
intnum=Add(2,3);//编译错误,即使改为Program.Add(2,3);也无法通过编译
Console.WriteLine(num);
}
publicintAdd(intx,inty)
{
returnx+y;
}
}
}
usingSystem;
namespaceConsoleApp
{
classProgram
{
staticvoidMain(string[]args)
{
Programself=newProgram();
intnum=self.Add(2,3);//编译通过
Console.WriteLine(num);
}
publicintAdd(intx,inty)
{
returnx+y;
}
}
}Nihil Nihil 100***[email protected]年前(2017-12-03)
#0 美女杀手 175***[email protected]我们可以使用 static 关键字把类成员定义为静态的。
当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。
关键字 static 意味着类中只有一个该成员的实例。
静态变量用于定义常量,因为它们的值可以通过直接调用类而不需要创建类的实例来获取。
静态变量可在成员函数或类的定义外部进行初始化。
你也可以在类的定义内部初始化静态变量。
将类成员函数声明为publicstatic无需实例化即可调用类成员函数反之,如果不声明为static,即使和Main方法从属于同一个类,也必须经过实例化美女杀手 美女杀手 175***[email protected]年前(2018-07-05)
#0 zzzain46 103***[email protected]倘若在类的声明中没有显式地提供实例构造函数,在这种情况下编译器会提供一个隐式的默认构造函数,它具有以下特点:
①不带参数;
②方法体为空。
但是如果你声明了任何构造函数,那么编译器就不会把该类定义为默认构造函数。
例如:
classClass2
{
publicClass2(intValue){...}//构造函数0
publicClass2(StringValue){...}//构造函数1
}
classProgram
{
staticvoidMain()
{
Class2a=newClass2();//错误!没有无参数的构造函数
...
}
}
在以上的代码中至少有一个显式定义的构造函数,编译器不会创建任何额外的构造函数,在Main()中如果试图用不带参数的构造函数创建新的实例,因为没有无参数的构造函数,所以编译器就会产生一条错误信息。
zzzain46 zzzain46 103***[email protected]年前(2019-01-17)
#0 入唐求法巡礼行記 xyi***[email protected]这教程很烂的,属于只告诉你一个标题的那种烂,最起码把self和this这两个关键词讲清楚呗,不然就算写出来也只能写静态,这样类有什么意义呢,还不如写点方法得了。
自己学过几种语言,基本上这种东西概念都是一样的,但是对于初学者这不是害人吗。
方法就像一个工具,拿一个凿子把一块石头雕成佛像。
类就就像一个机器,把原材料放入机器,你可以通过机器一开始设置的种种功能观察里面的运作,或者调用来导出产出。
说定义一个人类,这个人类里面有手有脚,还可以定义一个子类叫做男人/女人,其实没有问题,只是没有讲出类的根本用途。
然后得引出两个东西,静态和非静态,如果只是想在一个类里面塞点工具变成一个工具集合这样是不需要实例化的,直接调用即可,也就是:
namespaceTools
{
publicclasstools
{
publicstaticvoidhello(stringa_)//强制要求标注静态和非静态
{
System.Console.WriteLine(a_);
}
}
}
namespaceConsoleApp2
{
classA
{
staticvoidMain()
{
Tools.tools.hello("hello");//这个时候整个类就是静态,不需要实例化
}
}
}
假如因为某种需要,需要变成非静态,也就是动态化的需要,那么就需要实例化,这个需要之后会说明:
namespaceTools
{
publicclasstools
{
publicvoidinit()
{
WriteLine("实例化");
}
publicstaticvoidhello(stringa_)
{
System.Console.WriteLine(a_);
}
}
}
namespaceConsoleApp2
{
classA
{
staticvoidMain()
{
Tools.toolsa=newTools.tools();//如果不实例化,绝对无法调用
a.init();
Tools.tools.hello("hello");//但是不影响直接调用静态方法
}
}
}
什么时候才需要去使用动态?不是只需要经过一个工具加工,需要在几个工具之间传递数据然后去处理,因为静态方法之间是无法传递数据的,这个时候就需要用到动态:
namespaceTools
{
publicclasstools
{
inta,b;//储存在类的内部
publicvoidinit(inta,intb)//用于接收数值
{
this.a=a;
this.b=b;
WriteLine("初始化构造");
}
publicintrectangle()//用于计算数值和传递
{
returnthis.a*this.b;
}
}
}
namespaceConsoleApp2
{
classA
{
staticvoidMain()
{
Tools.toolsa=newTools.tools();
a.init(1,2);
}
}
}
其实可以类比成一个做不同口味糖的机器,作出了原型机的设计图纸之后,我需要用不同的原料来制造我需要的口味的糖,这个时候我就需要制造出一个专门用于生产比如草莓口味的糖,这个就是实例化,但是每一个机器肯定都是独立的,因为不能让他们串味啊,所以每一个机器都需要单独创立。
只要理解了这个点之后,再去理解里面什么构造函数,之类的概念,就可以理解了,万变不离其宗。
入唐求法巡礼行記 入唐求法巡礼行記 xyi***[email protected]周前(08-30)
点我分享笔记
取消
分享笔记
昵称昵称(必填)
邮箱邮箱(必填)
引用地址引用地址
分类导航
HTML/CSSHTML教程HTML5教程CSS教程CSS3教程Bootstrap3教程Bootstrap4教程Bootstrap5教程FontAwesome教程Foundation教程JavaScriptJavaScript教程HTMLDOM教程jQuery教程AngularJS教程AngularJS2教程Vue.js教程Vue3教程React教程TypeScript教程jQueryUI教程jQueryEasyUI教程Node.js教程AJAX教程JSON教程Echarts教程Highcharts教程Google地图教程服务端Python教程Python2.x教程Linux教程Docker教程Ruby教程Java教程C教程C++教程Perl教程Servlet教程JSP教程Lua教程Rust教程Scala教程Go教程PHP教程数据结构与算法Django教程Zookeeper教程设计模式正则表达式Maven教程Verilog教程ASP教程AppML教程VBScript教程数据库SQL教程MySQL教程PostgreSQL教程SQLite教程MongoDB教程Redis教程Memcached教程数据分析Python教程NumPy教程Pandas教程Matplotlib教程Scipy教程R教程Julia教程移动端Android教程Swift教程jQueryMobile教程ionic教程Kotlin教程XML教程XML教程DTD教程XMLDOM教程XSLT教程XPath教程XQuery教程XLink教程XPointer教程XMLSchema教程XSL-FO教程SVG教程ASP.NETASP.NET教程C#教程WebPages教程Razor教程MVC教程WebForms教程WebServiceWebService教程WSDL教程SOAP教程RSS教程RDF教程开发工具Eclipse教程Git教程Svn教程Markdown教程网站建设HTTP教程网站建设指南浏览器信息网站主机教程TCP/IP教程W3C教程网站品质
Advertisement
反馈/建议
在线实例
·HTML实例
·CSS实例
·JavaScript实例
·Ajax实例
·jQuery实例
·XML实例
·Java实例
字符集&工具
·HTML字符集设置
·HTMLASCII字符集
·JS混淆/加密
·PNG/JPEG图片压缩
·HTML拾色器
·JSON格式化工具
·随机数生成器
最新更新
·
JavaScript获取...
·
JavaScript实现...
·
HTMLDOMstyle...
·
HTMLDOMscroll...
·
HTMLDOMscroll...
·
HTMLDOMscroll...
·
Dockerstats命令
站点信息
·
意见反馈
·
免责声明
·
关于我们
·
文章归档
关注微信
Copyright©2013-2022菜鸟教程
runoob.comAllRightsReserved.备案号:闽ICP备15012807号-1
微信关注
延伸文章資訊
- 1Classes - Microsoft Docs
The class keyword is preceded by the access level. Because public is used in this case, anyone ca...
- 2C# 类(Class) - 菜鸟教程
C# 类(Class) 当你定义一个类时,你定义了一个数据类型的蓝图。 ... <access specifier> class class_name ... public Line(doubl...
- 3Day22-C#-怎麼建立類別Class及其建構函式Constructor(建構子)
也就是建構子可以設定是否要接受參數來初始化一個新的物件,與宣告方法很相似,有幾點需要注意: 建構子的函式名稱需與類別相同; 存取修飾詞為public; 不能有回傳值; 不能 ...
- 4C# Class and Objects - TutorialsTeacher
A class can contain one or more constructors, fields, methods, properties, delegates, and events....
- 5C# Object and Class - Javatpoint
C# Class Example 4: Store and Display Employee Information · using System; · public class Employe...