C#基础C#的声明详细介绍
一、什么是声明
我们在编程的时候,经常会用到一些常量和变量,一个告诉编译器哪些是常量哪些是变量的过程,也就是我们常说的声明,包括我们“命名”常量和变量。
考试列表:
int I;
我们告诉编译器,我这里会用到一个“number”变量,它的名字是“I”。
另外,在编程中有一个术语叫做“定义”,指的是被“声明”的变量/常量的“名称”,比如上面的“I”,分配一个内存空空间。
- # C程序按名称空组织,可以包含类型声明和嵌套声明。类型用于定义类、结构、接口、联合和代表。类型定义中允许的成员类型取决于类型声明的形式。例如,类的声明可以包含实例构造函数、析构函数、静态构造函数、常数、字段、方法、属性、事件、索引、运算符和嵌套类型。
声明定义了它所属的声明域中的名称。除了重载构造函数、方法、索引和运算符名称之外,如果有两个或更多的声明在声明域中引入了同名的成员,这也是一个错误。声明域绝不可能包含不同种类的同名成员。例如,声明域不能包含同名的字段和方法。
这里有许多不同类型的声明域,如下所示。
*在所有程序的源文件中,除了嵌套的名字空之外的名字空之间的成员声明是一个单一的组合声明域,称为全局声明域。
*在所有程序的源文件中,names 空之间的成员声明和names 空之间具有相同完整正确的names 空的声明是一个单一的组合声明域。
*每个类、结构或接口声明都创建一个新的声明域。它通过名称成员声明、结构成员声明或接口成员声明被引入到这个声明域中。除了重载构造函数声明和静态构造函数声明,类或结构成员声明不能引入与类或结构同名的成员。类、结构或接口允许重载方法和索引。此外,类或结构允许构造函数和运算符的重载声明。例如,一个类、结构或接口可能包含用相同名称声明的多个方法,但是在它们各自的签名中提供了不同的方法声明。请注意,基类不影响该类的声明域。基本接口不影响接口的声明域。这样,派生类或接口可以声明一个与继承成员同名的成员。的这种成员称为具有隐藏继承的成员。
*每个枚举声明创建一个新的声明域。通过枚举成员声明将名称引入声明域。
*每个块或转换块为局部变量创建一个单独的声明字段。名字是通过局部变量声明引入这个声明域的。
如果块是构造函数或方法声明的主体,则在参数列表中声明的参数是块的局部变量声明域的成员。块的局部变量声明字段包括任何嵌套块。因此,不太可能在嵌套块中声明与局部变量同名的局部变量。
*每个块或转换块为标签创建一个单独的声明域。名字通过标签声明引入这个声明域,名字通过goto声明引入这个声明域。块的局部变量声明字段包括任何嵌套块。因此,不太可能在嵌套块中声明与标记同名的标记。声明名称的文本顺序通常并不重要。特别是,文本顺序对于声明和使用名称空、类型、常量、方法、属性、事件、索引、运算符、构造函数、析构函数和静态构造函数并不重要。声明的顺序在以下方面很重要:
*域声明和局部变量的顺序决定了它们初始化的执行顺序。
*局部变量必须在使用前定义。
*当忽略常量表达式值时,枚举成员声明的声明顺序很重要。
Examda提示:名字空之间的声明域是“开放”的,而两个全名相同的名字空之间的声明会放在同一个名字空 room 空 room中。例如
namespace mega corp . data
{
class customer
{
...
}
命名空间megacorp.data
。Class
{
...
}
以上两个名字之间的声明空被捐赠给同一个声明域,其中两个类Megacorp。数据。客户和大公司。用完全限定名声明的顺序。因为两个声明属于同一个声明域,如果每个声明都包含一个同名类的声明,就会产生错误。
块的声明域包括任何嵌套的块。因此,在下面的示例中,方法F和G中有错误,因为名称I已经在外部块中声明,不能再在内部块中声明。然而,由于两个I是在独立的非嵌套块中声明的,因此方法H和I是有效的。
class A
{
void F(){
int I = 0;
if(true){
int I = 1;
}
}
void G(){
if(true){
int I = 0;
}
int I = 1;
}
void H(){
if(true){
int I = 0;
}
if(true){
int I = 1;
}
}
void I(){
for(int I = 0;i < 10i++)
H();
for(int I = 0;i < 10i++)
H();
}
}
三。小知识:
1。C语言和C++的声明
相信熟悉C语言的人都知道,在C中,如果要组合一组不同类型的变量,就会用到struct关键字。它还有一组可以调用的函数来实现结构的不同功能。但有一点是,所有这些函数对struct之外的变量也是可见的,所以你可以调用这个函数。这样很不安全,对编程的模块化也不好。
c++的声明是对C语言的改进。c++的第一步是将函数作为“成员函数”放在struct中。这就带来了一个新的问题:每个struct中的函数可以同名,在定义这个函数的时候,需要完整的指定是哪一个。为了完成这个任务,c++有一个新的操作符::,也就是范围分解操作符(用来指定这个函数的执行范围,也就是它属于哪个struct)。
在C++中,将函数放入结构中是对C的根本性改变,在C中,结构是数据的聚合,它将数据绑定在一起,以便我们可以将它们视为一个包。但这除了能让程序设计方便之外,没有其他好处。这些结构操作可以用在其他地方。但是如果把函数也放在这个包里,结构就变成了一个新的创造,既能描述属性(就像C里的struct能做的一样),又能描述行为,这样就形成了object的概念。对象是一个独立且受约束的实体,有自己的内存和活动。在C++中,对象只是一个变量,它最纯粹的定义是“存储的一个区域”。是一个空可以存储数据的房间,并暗示着对这些数据有操作。将数据与函数捆绑在一起允许创建新的类型。这通常被称为封装。
但是,我们会看到,在对象上完成操作的方法是有区别的。
object . member _ function(arglist)是在对象上“调用成员函数”。在面向对象的用法中,也称为“向对象发送消息”。于是,对于stash K,语句K.add(&i)“向K发送消息”,即“向自己添加()”。事实上,面向对象编程可以用一句话来概括,“向对象发送消息”。你所需要做的就是创建一堆对象,并向它们发送一条消息。当然,问题是勾画出我们的对象和消息是什么,但如果这样做了,C++的实现将是简单明了的。
结构的大小是其所有成员大小的总和。有时候编译器在处理一个struct的时候,会额外增加一些字节,让绑定更加整齐,这主要是为了提高执行效率。
另外,可以用sizeof计算struct的内存大小。
我们来看看对应的例子:
/Compute struct memory
# include
struct a1
{
int I[100];
};
struct A2
{
void x();
};
void main(void)
{
printf("结构A的大小为%d\n ",sizeof(A1);
printf("结构B的大小为%d\n ",sizeof(A2);
}
第一句printf会打印出200,第二句打印出一个不确定的非零值。
因为这个语句在C中是不合法的,但在C++中是合法的。
这个可以和C#的语句做个对比。有什么区别?
0条评论