请问如下两种写法有什么区别?

chookrib 2005-04-28 03:02:49
class A
{
}

class B
{
A a;

B()
{
a = new A();
}
}



class A
{
}

class B
{
A a = new A();

B()
{
}
}

然后调用

B b = new B();
b.xxx


这两种写法效果好象是一样的,但具体有什么区别呢?
第二种方式那个 A a = new A(); 也是在创建类实例 new B() 的时候才 new 的吧?还是在编译时 new 的?哪位能给我讲讲,多谢!
...全文
157 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
风之银翼 2005-04-28
  • 打赏
  • 举报
回复
学习,顶!
ccat 2005-04-28
  • 打赏
  • 举报
回复
根据《Microsoft.net框架程序设计》的介绍,两者不同,如果使用第二种方式,编译器会在每一个构造函数的开始加上a = new A();如果函数有多个构造函数,显然会造成代码膨胀,通常为了避免这个问题,鼓励编写一个初始化函数,封装成员初始化代码,并且在构造函数中调用它。
Richardhu 2005-04-28
  • 打赏
  • 举报
回复
当初始化一个类时,首先将该类中的所有静态字段初始化为它们的默认值,然后以文本顺序执行各个静态字段初始值设定项。与此类似,创建类的一个实例时,首先将该实例中的所有实例字段初始化为它们的默认值,然后以文本顺序执行各个实例字段初始值设定项。

在具有变量初始值设定项的静态字段处于默认值状态时,也有可能访问它们。但是,为了培养良好的编程风格,强烈建议不要这么做。示例

using System;
class Test
{
static int a = b + 1;
static int b = a + 1;
static void Main() {
Console.WriteLine("a = {0}, b = {1}", a, b);
}
}
显示此行为。尽管 a 和 b 的定义是循环的,此程序仍是有效的。它产生以下输出:

a = 1, b = 2
这是因为静态字段 a 和 b 在它们的初始值设定项执行之前被初始化为 0(int 的默认值)。当 a 的初始值设定项运行时,b 的值为零,所以 a 被初始化为 1。当 b 的初始值设定项运行时,a 的值已经为 1,因此 b 被初始化为 2。

--->摘自MSDN
Richardhu 2005-04-28
  • 打赏
  • 举报
回复
类的实例字段变量初始值设定项相当于一个赋值序列,它在当控制进入该类的任一个实例构造函数时立即执行。变量初始值设定项按它们出现在类声明中的文本顺序执行。
实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始值设定项中引用 this 是编译时错误,同样,在变量初始值设定项中通过简单名称引用任何一个实例成员也是一个编译时错误。在下面的示例中

class A
{
int x = 1;
int y = x + 1; // Error, reference to instance member of this
}
y 的变量初始值设定项导致编译时错误,原因是它引用了正在创建的实例的成员。

--->摘自MSDN
LiJoe 2005-04-28
  • 打赏
  • 举报
回复
只是执行顺序上的不同

类在构造前会先执行所有的成员变量定义及初始化动作,然后才进入构造函数
Ring1981 2005-04-28
  • 打赏
  • 举报
回复
class A
{
}
class B
{
A a;

B()
{
a = new A();
}
}

这里的new A();是在创建类B的对象时new的。


class A
{
}

class B
{
A a = new A();

B()
{
}
}

这里 A a = new A();
这里a作为类B的成员,并初始化。

jFresH_MaN 2005-04-28
  • 打赏
  • 举报
回复
基本上没有区别。
因为你的A对象只是一个普通的成员变量,它会在构造函数之前初始化,就这个区别而已
conan19771130 2005-04-28
  • 打赏
  • 举报
回复
请教高手,up
课程介绍:第一章:正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。第二章:http协议是一种无状态协议,不记录用户行为,我们可以利用cookie记录数据,方便用户操作,提升用户体验。第三章:ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。第四章:本章主要讲解JS动画原理、动画函数封装和轮播。第五章:本章主要讲解面向对象、构造函数和继承、原型链和继承。第六章:本节课程主要讲解了什么是Ajax、如何使用Ajax发送get请求、如何使用Ajax发送post请求、JSON数据格式、回调地狱、Promise和Ajax的同源策略、跨域请求。第七章:本章主要讲解html、val、attr、prop、class、全选框、动画、节点遍历、ajax、sonp、event、multiple、plugin、plugin、magnifier。第八章:本章主要讲解UML类图、单例模式、工厂模式、策略模式、代理模式、观察者模式。第九章:本章主要讲解为什么要模块化、原生JS中,模块的写法、AMD、CommonJS&Webpack。第十章:本节课程主要讲解了服务器安装环境配置、端口及ip基本常识、简单认识PHP(helloworld)、基本语法和动态网页原理。第十一章:本节课程主要讲解了什么是SASS、SASS的预处理、ass语法(变量、嵌套、导入、mixin、扩展、function、expression)。第十二章:本节课程主要讲解了什么是GULP、GULP环境配置、GULP基本使用及GULP的插件安装与使用。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧