5 本我 3周前 236次点击
成员定义
在类定义中,也提供了该类中所有成员的定义,包括字段、方法和属性。所有成员都有自己的访问级别,用下面的关键字之一来定义:
● public—— 成员可以由任何代码访问。
● private—— 成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字)。
● internal—— 成员只能由定义它的程序集(项目)内部的代码访问。
● protected—— 成员只能由类或派生类中的代码访问。
后两个关键字可以结合使用,所以也有protected internal成员。它们只能由项目(更确切地讲,是程序集)中派生类的代码来访问。
也可以使用关键字static来声明字段、方法和属性,这表示它们是类的静态成员,而不是对象实例的成员
定义字段
用标准的变量声明格式(可以进行初始化)和前面介绍的修饰符来定义字段,例如:
class MyClass
{
public int MyInt;
}
注意:
.NET Framework中的公共字段以PascalCasing形式来命名,而不是camelCasing。这里使用的就是这种大小写形式,所以上面的字段称为MyInt而不是myInt。这仅是推荐使用的一种名称大小写形式,但它的意义非常重大。私有字段没有推荐的名称大小写模式,它们通常使用camelCasing来命名。
字段也可以使用关键字readonly,表示这个字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。例如:
class MyClass
{
public
readonly
int MyInt = 17;
}
可使用static关键字将字段声明为静态,例如:
class MyClass
{
public static int MyInt;
}
静态字段必须通过定义它们的类来访问(在上面的示例中,是MyClass.MyInt),而不是通过这个类的对象实例来访问。另外,可使用关键字const来创建一个常量值。按照定义,const成员也是静态的,所以不需要使用static修饰符(实际上,使用static修饰符会产生一个错误)。
定义方法
方法使用标准函数格式、可访问性和可选的static修饰符来声明。例如:
class MyClass
{
public string GetString() => return "返回字符串";
}
注意:
与公共字段一样,.NET Framework中的公共方法也采用PascalCasing形式来命名。
注意,如果使用了static关键字,这个方法就只能通过类来访问,不能通过对象实例来访问。也可以在方法定义中使用下述关键字:
● virtual—— 方法可以重写。
● abstract—— 方法必须在非抽象的派生类中重写(只用于抽象类中)。
● override—— 方法重写了一个基类方法(如果方法被重写,就必须使用该关键字)。
● extern——方法定义放在其他地方。
下面的代码是方法重写的一个示例:
public class MyBaseClass
{
public virtual void DoSomething()
{
...
}
}
public class MyDerivedClass : MyBaseClass
{
public
override
void DoSomething()
{
...
}
}
如果使用了override,也可以使用sealed来指定在派生类中不能对这个方法做进一步修改,即这个方法不能由派生类重写。例如:
public class MyDerivedClass : MyBaseClass
{
public override
sealed
void DoSomething()
{
...
}
}
使用extern可以在项目外部提供方法的实现代码。这是一个高级论题,这里不做详细讨论。
定义属性
属性定义方式与字段类似,但包含的内容比较多。如前所述,属性比字段复杂,因为它们在修改状态前还可以执行一些额外操作,实际上,它们可能并不修改状态。属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值。
这两个块也称为访问器,分别用get和set关键字来定义,可以用于控制属性的访问级别。可以忽略其中的一个块来创建只读或只写属性(忽略get块创建只写属性,忽略set块创建只读属性)。当然,这仅适用于外部代码,因为类中的其他代码可以访问这些代码块能访问的数据。还可以在访问器上包含可访问修饰符,例如使get块变成公共的,使set块变成受保护的。至少包含其中一个块,属性才是有效的(既不能读取也不能修改的属性没有任何用处)。
属性的基本结构包括标准的可访问修饰符(public、private等),后跟类名、属性名和get块(或set块,或者get块和set块,其中包含属性处理代码),例如:
public int MyIntProp
{
get
{
//属性获取代码
}
set
{
//属性集代码
}
}
注意:
.NET中的公共属性也以PascalCasing方式来命名,而不是camelCasing方式命名,与字段和方法一样,这里使用PascalCasing方式。
定义代码中的第一行非常类似于定义字段的代码。区别在于行末没有分号,而是一个包含嵌套get和set块的代码块。
get块必须有一个属性类型的返回值,简单属性一般与私有字段相关联,以控制对这个字段的访问,此时get块可以直接返回该字段的值,例如:
private int myInt;
public int MyIntProp
{
get {
return myInt;
}
set
{
//属性集代码
}
}
类外部的代码不能直接访问这个myInt字段,因为其访问级别是私有的。外部代码必须使用属性来访问该字段。set函数采用类似方式把一个值赋给字段。这里可使用关键字value表示用户提供的属性值:
private int myInt;
public int MyIntProp
{
get { return myInt; }
set
{
myInt = value;
}
}
value等于类型与属性相同的一个值,所以如果属性和字段使用相同的类型,就不必考虑数据类型转换了。
这个简单属性只是用来阻止对myInt字段的直接访问。在对操作进行更多控制时,属性的真正作用才能发挥出来。例如,使用下面的代码实现set块:
set
{
if (value >= 0 && value <= 10)
myInt = value;
}
只有赋给属性的值在0~10之间,才会修改myInt。此时,要做一个重要的设计选择:如果使用了无效值,该怎么办?有4种选择:
● 什么也不做(如上述代码所示)。
● 给字段赋默认值。
● 继续执行,就像没发生错误一样,但记录下该事件,以备将来分析。
● 抛出异常。
一般情况下,后两个选择效果较好,选择哪个选项取决于如何使用类,以及给类的用户授予多少控制权。抛出异常给用户提供的控制权相当大,可以让他们了解发生了什么情况,并做适当的响应。为此可使用System名称空间中的标准异常,例如:
set
{
if (value >= 0 && value <= 10)
myInt = value;
else
throw (new ArgumentOutOfRangeException("MyIntProp", value,"必须分配一个0和10之间的值"));
}
这可以在使用属性的代码中通过try...catch...finally逻辑加以处理
记录数据(例如记录到文本文件中)比较有效,例如可以用在不应出错的产品代码中。它们允许开发人员检查性能,如有必要,还可以调试现有的代码。
属性可以使用virtual、override和abstract关键字,就像方法一样,但这几个关键字不能用于字段。最后,如上所述,访问器可以有自己的可访问性,例如:
// Field used by property.
private int myInt;
// Property.
public int MyIntProp
{
get { return myInt; }
protected set { myInt = value; }
}
只有类或派生类中的代码才能使用set访问器。
访问器可以使用的访问修饰符取决于属性的可访问性,访问器的可访问性不能高于它所属的属性,也就是说,私有属性对它的访问器不能包含任何可访问修饰符,而公共属性可以对其访问器使用所有的可访问修饰符。
C# 6引入了一个名为“基于表达式的属性”的功能。这个功能可以把属性的定义减少为一行代码。例如,下面的属性对一个值进行数学计算,可以使用Lambda箭头后跟等式来定义:
// Field used by property.
private int myDoubledInt = 5;
// Property.
public int MyDoubledIntProp => (myDoubledInt * 2);
我看不懂
谁说没有需求的呢?自己没有需求就不要说别人没有需求。
来你看我说的对不对吗。拿数据事实说话。
结构类 作者:本我;浏览:56;回复:0;发表时间:2026-01-29 14:06:59;回复时间:
构造函数和析构函数 作者:本我;浏览:95;回复:0;发表时间:2026-01-27 12:41:09;回复时间:
类库项目 作者:本我;浏览:106;回复:0;发表时间:2026-01-27 12:32:26;回复时间:
类和接口的定义 作者:本我;浏览:220;回复:2;发表时间:2026-01-19 21:40:39;回复时间:2026-01-21 19:56:22
桌面应用程序中的OOP 作者:本我;浏览:114;回复:1;发表时间:2026-01-18 12:06:10;回复时间:2026-01-18 12:47:37
try...catch...finally 作者:本我;浏览:139;回复:1;发表时间:2026-01-15 19:39:34;回复时间:2026-01-17 17:00:33
一个浏览器插件:猫抓 作者:本我;浏览:175;回复:0;发表时间:2026-01-13 12:12:56;回复时间:
判定语句 作者:本我;浏览:148;回复:0;发表时间:2026-01-12 17:17:04;回复时间:
跟踪点 作者:本我;浏览:81;回复:1;发表时间:2026-01-12 12:00:30;回复时间:2026-01-12 12:02:28
输出调试信息 作者:本我;浏览:107;回复:1;发表时间:2026-01-11 13:12:41;回复时间:2026-01-11 14:54:56
cpu常见参数和命名规则 作者:本我;浏览:157;回复:0;发表时间:2026-01-10 13:10:19;回复时间:
委托 作者:本我;浏览:163;回复:0;发表时间:2026-01-09 18:16:12;回复时间:
重在函数 作者:本我;浏览:116;回复:0;发表时间:2026-01-07 17:37:32;回复时间:
结构函数 作者:本我;浏览:202;回复:0;发表时间:2026-01-06 17:41:56;回复时间:
Main()函数 作者:本我;浏览:178;回复:0;发表时间:2026-01-06 17:40:05;回复时间:
参数和返回值与全局数据 作者:本我;浏览:124;回复:0;发表时间:2026-01-05 18:08:00;回复时间:
b站网页快捷键 作者:本我;浏览:225;回复:1;发表时间:2026-01-04 18:03:01;回复时间:2026-01-04 19:19:35
其他结构中变量的作用域 作者:本我;浏览:126;回复:0;发表时间:2026-01-04 17:41:07;回复时间:
变量的作用域2 作者:本我;浏览:143;回复:0;发表时间:2026-01-03 17:21:05;回复时间:
变量的作用域 作者:本我;浏览:143;回复:0;发表时间:2026-01-02 17:44:11;回复时间:
c# 输出参数 作者:本我;浏览:79;回复:2;发表时间:2026-01-01 18:36:16;回复时间:
百度ocr的API Key和Secret Key的查看方法 作者:本我;浏览:151;回复:0;发表时间:2026-01-01 12:43:48;回复时间:
引用参数和值参数 作者:本我;浏览:136;回复:0;发表时间:2025-12-31 17:03:25;回复时间:
参数2 作者:本我;浏览:184;回复:0;发表时间:2025-12-30 18:28:43;回复时间:
参数 作者:本我;浏览:229;回复:3;发表时间:2025-12-29 18:13:10;回复时间:
表达式体方法 作者:本我;浏览:184;回复:0;发表时间:2025-12-28 19:56:48;回复时间:
返回值2 作者:本我;浏览:93;回复:0;发表时间:2025-12-26 19:25:02;回复时间:
返回值 作者:本我;浏览:215;回复:0;发表时间:2025-12-25 20:52:51;回复时间:
函数 作者:本我;浏览:182;回复:0;发表时间:2025-12-24 18:05:28;回复时间:
代码提示 作者:本我;浏览:276;回复:0;发表时间:2025-12-23 18:24:05;回复时间:
字符串的处理2 作者:本我;浏览:199;回复:0;发表时间:2025-12-22 16:35:48;回复时间:
c# 字符串的处理 作者:本我;浏览:350;回复:1;发表时间:2025-12-21 17:08:33;回复时间:
数组4 锯齿数组 作者:本我;浏览:162;回复:0;发表时间:2025-12-20 16:24:19;回复时间:
数组3 多维数组 作者:本我;浏览:173;回复:0;发表时间:2025-12-20 10:31:38;回复时间:
数组2 foreach循环 作者:本我;浏览:96;回复:0;发表时间:2025-12-19 20:00:43;回复时间:
数组 作者:本我;浏览:128;回复:1;发表时间:2025-12-19 12:55:57;回复时间:
结构 作者:本我;浏览:179;回复:0;发表时间:2025-12-18 16:24:19;回复时间:
枚举2 作者:本我;浏览:123;回复:2;发表时间:2025-12-16 16:46:13;回复时间:
枚举 作者:本我;浏览:116;回复:0;发表时间:2025-12-15 16:49:01;回复时间:
使用Convert命令进行显示转换 作者:本我;浏览:111;回复:1;发表时间:2025-12-14 09:53:54;回复时间:
checked的用法 作者:本我;浏览:271;回复:0;发表时间:2025-12-12 12:23:29;回复时间:
类型转换 2显示转换 作者:本我;浏览:89;回复:0;发表时间:2025-12-11 13:05:48;回复时间:
类型转换 1隐式转换 作者:本我;浏览:88;回复:0;发表时间:2025-12-10 11:54:11;回复时间:
while循环 作者:本我;浏览:328;回复:0;发表时间:2025-12-08 21:37:09;回复时间:
do循环 作者:本我;浏览:129;回复:0;发表时间:2025-12-05 21:30:43;回复时间:
switch语句 作者:本我;浏览:361;回复:0;发表时间:2025-12-04 14:05:48;回复时间:
if语句 作者:本我;浏览:108;回复:0;发表时间:2025-11-30 10:34:35;回复时间:
名称空间 作者:本我;浏览:127;回复:1;发表时间:2025-11-19 15:58:06;回复时间:
数学运算符 作者:本我;浏览:184;回复:2;发表时间:2025-11-16 10:57:46;回复时间:
c#,简单类型 作者:本我;浏览:147;回复:2;发表时间:2025-11-14 09:08:19;回复时间:
c#,创建一个简单的控制台应用程序,将文本输出到屏幕上 作者:本我;浏览:255;回复:3;发表时间:2025-11-12 19:53:15;回复时间:
楼主,一个中肯的建议。我建议你去争渡论坛发这些帖子。不是我不喜欢啥的,我啥意思没有,是考虑到这里的用户群体大部分是未成年或对此无需求的人,而争渡论坛有更多需要你这种教程帖的人。
本楼来自:汪汪文件直连平台